在MySQL中正确实现父类型子类型

3
以下是一个数据库的图表,我正在试图确定合适的设计。以下是一些注意事项。
- 雇员/经理与客户相关联。 - partyid是全球代表个人(客户、员工、经理)的一种方式。它是否需要向下传播?它应该成为所有表格中的主键,还是仅在表示个人的表格中成为主键? - 其他表格,如billing、reporting、credential等表格,是否需要具有自己的主键,例如billingid、reportingid、credentialid等?
以下是实体交互的一些注释。
- 员工有与他们相关联的经理。 - 客户有与他们相关联的经理和可能的员工。 - 客户和员工将需要报告计费时间。 enter image description here

您的客户是组织还是个人?您的员工可以成为客户吗?即使可以,您是否需要在模型中明确呈现? - Damir Sudarevic
@Damir 客户是个人。客户和员工都与一个组织相关联(组织是方(party)表中的字段)。这提出了一个关于客户表的重要问题。在客户表中的对象实际上与订单有关,我已经将其移入了该表中。我还删除了_employeeid_作为主键,因为没有必要有两个主键。我已经更新了问题和图表以反映这些变化。 - Astron
@Astron,我想问一下(离题了),你用什么软件创建这个图表?它看起来相当漂亮... - stakx - no longer contributing
@stakx 微软 Visio 标准版。 - Astron
1个回答

1

表格“party”看起来不对。请参考这个其他SO问题中的源代码。

在这种结构中,派对ID号码会向下传播,可以说是如此。它通常应该是存储有关人员数据的表中的主键或外键。

在您的“报告”表中,看起来主键不应该是'partyid'。这将只允许每个员工一行,我认为这不是您想要的。(我可能错了。)如果我对此正确,您可以考虑在{partyid,date}上使用NOT NULL UNIQUE约束,并在新列'reportid'上使用PRIMARY KEY约束。表格“travel”和“performance”可能会引用'reportid'。(但继续阅读。)

在您的图表中,有些地方实体会获得额外的键:例如,您的公司为员工分配唯一的员工ID号码。从那时起,您可以使用“employid”而不是“partyid”来引用员工,理论上没有任何问题。但是,您可能不想这样做的一个实际原因是它会增加连接的数量。

例如,如果“credential”、“tool”、“certification”、“academic”和“compliance”表引用employee.employid而不是employee.partyid,则无法仅通过连接“compliance”和“party”来获取人名。您还需要连接“employee”。

其他表(如billing、reporting、credential等表)是否需要具有自己的主键,例如billingid、reportingid、credentialid等?

它们需要具有主键;主键不一定必须是ID号码。如果存在现有的自然键,则必须识别它并声明其为UNIQUE。

表“orders”应该只有“orderid”作为其主键;使用外键引用来识别客户。在某些情况下,重命名列是有意义的。对于客户而言,将其键称为“customerid”而不是“parytid”可能更合理。我会自己创建一个域。
create domain PARTY_ID as integer not null;

然后,无论何处需要派对ID号码,我都会使用域名。

create table customers (
    customerid PARTY_ID primary key references parties (partyid),
...

我更愿意看到经理的表格。引用它将确保manager.managerid解析为实际的经理,而不仅仅是任何员工。


谢谢解释。我已根据您的建议更新了图表,因为它们都看起来很理想。请看一下,让我知道我是否正确。当您说“我更喜欢看到经理的表格”时,您是指将“manager”表从“employee”表下移,并移到“PartyType”类别下面吗?我唯一担心的是“经理”将不再具有应用于他们的“员工”表属性。 - Astron
1
不,我只是指当前(可能)的经理表:可以从单列表开始,存储实际上是经理的所有员工的ID号码。该表将是任何需要经理ID的外键约束的目标。 - Mike Sherrill 'Cat Recall'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接