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

标签 mysql database database-design entity-relationship

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

  • 员工/经理与客户相关联。
  • 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/

相关文章:

mongodb - 具有大量类似 sql 连接的查询的数据库设计

c# - MySQL 和 C# Entity Framework "ProviderIncompatibleException"

php - PDO 语句返回 false

php - MySQL & PHP - 只列出之前没有列出的项目

php - 使用 $_GET 中的多个变量来更改页面布局和 MySQL 结果

SQLite 大型数据库处理

java - 调用 @PostPersist 时数据未保存在数据库中

sql - 如果引用所有列,外键是否会减少冗余?

database - 从网站向用户发送短信 - 如何?

mysql - 数据库设计 : members table separate or all in one table?