gpt4 book ai didi

mysql - MySQL中正确实现父类(super class)型子类型

转载 作者:可可西里 更新时间:2023-11-01 08:54:47 25 4
gpt4 key购买 nike

下面是一个数据库的图表,我试图在其中确定合适的设计。这里有一些注意事项。

  • 员工/经理与客户相关联。
  • partyid 是一种在全局范围内代表一个人的方式;客户,员工,经理。需要一直向下传播吗?它应该是所有表中的主键还是仅代表个人的表?
  • 其他表,如billingreportingcredential 等表是否需要有自己的主键 ID,例如billingidreportingidcredentialid 等?

关于实体交互的一些注释。

  • 员工有一个经理与之相关。
  • 客户有一个经理和可能的员工与之相关。
  • 客户员工需要报告计费时间。

enter image description here

最佳答案

表格“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com