下面是我正在尝试确定适当设计的数据库图。以下是一些注释。
关于实体互动的一些注释。
答案 0 :(得分:1)
表“派对”看起来不正确。与this other SO question的源代码进行比较。
在这种结构中,党的id号确实向下传播,可以这么说。它通常应该是存储有关人员数据的表中的主键或外键。
在您的“报告”表中,主键看起来不应该是'partyid'。这样每个员工只允许一行,我认为你并不打算这样做。 (我可能是错的。)如果我是对的,你可以考虑{partyid,date}上的NOT NULL UNIQUE
约束,以及新列'{report}'上的PRIMARY KEY
约束。表“旅行”和“表现”可能会引用'reportid'。 (但继续阅读。)
您的图表中有一些实体获得额外密钥的位置:例如,您的公司为其员工分配一个唯一的员工ID号。没有理论上的理由你不能在这一点上使用'employid'而不是'partyid'来引用员工。但 是你可能不想这样做的一个实际原因。它增加了连接数。
例如,如果表“凭证”,“工具”,“认证”,“学术”和“合规性”引用了employee.employid而不是employee.partyid,则您不能只加入“合规性”和“派对“得到这个人的名字。你也必须加入“员工”。
执行其他表格,例如结算,报告,凭据等表格 需要拥有属于主键的各自的id,例如 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将解析为实际的经理,而不仅仅是任何员工。