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

时间:2011-07-31 14:51:12

标签: mysql database database-design entity-relationship

下面是我正在尝试确定适当设计的数据库图。以下是一些注释。

  • 员工/经理与客户联系。
  • partyid 是一种全球代表某人的方式;客户,员工,经理。它需要一直传播吗?它应该是所有表中的主键还是仅代表个人的表?
  • 其他表格,例如结算报告凭据等表格是否需要各自的ID作为主键,例如 billingid reportingid 凭据等?

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

  • 员工经理与他们相关联。
  • 客户经理,可能还有员工
  • 客户员工需要报告帐单的时间。

enter image description here

1 个答案:

答案 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将解析为实际的经理,而不仅仅是任何员工。