下面是一个数据库的图表,我试图在其中确定合适的设计。这里有一些注意事项。
- 员工/经理与客户相关联。
- partyid 是一种在全局范围内代表一个人的方式;客户,员工,经理。需要一直向下传播吗?它应该是所有表中的主键还是仅代表个人的表?
- 其他表,如billing、reporting、credential 等表是否需要有自己的主键 ID,例如billingid、reportingid、credentialid 等?
关于实体交互的一些注释。
- 员工有一个经理与之相关。
- 客户有一个经理和可能的员工与之相关。
- 客户和员工需要报告计费时间。
最佳答案
表格“party”看起来不对。与来自 this other SO question 的源代码进行比较.
在这种结构中,派对 ID 号可以说是向下传播的。在存储个人数据的表中,它通常应该是主键或外键。
在您的“reporting”表中,主键看起来不应该是“partyid”。这将允许每个员工只排一行,我认为你不是故意的。 (我可能是错的。)如果我是对的,您可以考虑对 {partyid, date} 进行 NOT NULL UNIQUE
约束,对 {partyid, date} 进行 PRIMARY KEY
约束一个新列,'reportid'。 “travel”和“performance”表可能会引用“reportid”。 (但请继续阅读。)
在您的图表中的某些地方,实体获得了一个额外的键:例如,您的公司为其员工分配了一个唯一的员工 ID 号。从那时起,从理论上讲,您不能使用“employid”而不是“partyid”来引用员工。但是, 有一个您可能不想这样做的实际原因。它增加了连接的数量。
例如,如果表“credential”、“tool”、“certification”、“academic”和“compliance”引用的是 employee.employid 而不是 employee.partyid,则不能只加入“compliance”和“party”来获取此人的姓名。您也必须加入“员工”。
Do the other tables such as billing, reporting, credential, etc tables need to have their own respective id's that are primary keys, e.g. billingid, reportingid, credentialid, etc?
他们需要有一个主键;主键不一定是身份证号。如果存在现有的自然键,您必须识别它并声明它是唯一的。
表“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 将解析为实际经理,而不仅仅是任何员工。
关于mysql - MySQL中正确实现父类(super class)型子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6890133/