- 雇员/经理与客户相关联。 - partyid是全球代表个人(客户、员工、经理)的一种方式。它是否需要向下传播?它应该成为所有表格中的主键,还是仅在表示个人的表格中成为主键? - 其他表格,如billing、reporting、credential等表格,是否需要具有自己的主键,例如billingid、reportingid、credentialid等?
以下是实体交互的一些注释。
- 员工有与他们相关联的经理。 - 客户有与他们相关联的经理和可能的员工。 - 客户和员工将需要报告计费时间。
![enter image description here](https://istack.dev59.com/SvDIG.webp)
表格“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解析为实际的经理,而不仅仅是任何员工。