【问题标题】:Implementing super-type subtype correctly in MySQL在 MySQL 中正确实现超类型子类型
【发布时间】:2011-10-16 22:28:06
【问题描述】:

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

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

关于实体交互的一些说明。

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

【问题讨论】:

  • 您的客户是组织还是个人?您的员工可以成为客户吗?即使可以,您在模型中是否需要它?
  • @Damir 客户是个人。客户和员工都与一个组织相关联(组织是 party 表中的字段)。不过,这对 customer 表提出了一个很好的观点。客户表中的对象确实与我移入该表的订单有关。我还删除了 employeeid 作为主键,因为有两个主键没有意义。我更新了问题和图表以反映这些变化。
  • @Astron,我想问一下(题外话)你用什么软件来创建这个图表?它看起来相当漂亮......
  • @stakx Microsoft Visio 标准。

标签: mysql database database-design entity-relationship


【解决方案1】:

“派对”表看起来不正确。对比this other SO question的源代码。

可以说,在这种结构中,party id 编号确实向下传播。它通常应该是存储有关人员数据的表中的主键或外键。

在您的“报告”表中,主键看起来不应该是“partyid”。那将只允许每个员工一行,我认为您不是有意的。 (我可能是错的。)如果我是对的,您可以考虑对 {partyid, date} 使用NOT NULL UNIQUE 约束,并在新列“reportid”上使用PRIMARY KEY 约束。 “travel”和“performance”表可能会引用“reportid”。 (但请继续阅读。)

在图表中的某些地方,实体会获得额外的键:例如,您的公司会为其员工分配一个唯一的员工 ID 号。从那时起,您没有理论上的理由不能使用“employid”而不是“partyid”来引用员工。但是你可能不想这样做的实际原因。它增加了连接的数量。

例如,如果表“credential”、“tool”、“certification”、“academic”和“compliance”引用了employee.employid而不是employee.partyid,则不能只加入“compliance”和“派对”以获取此人的姓名。你也必须加入“员工”。

做其他表格,例如计费、报告、凭证等表格 需要有自己的主键 ID,例如 billingid、reportingid、credentialid 等?

他们需要有一个主键;主键不一定是 id 号。如果有一个现有的自然键,你必须识别它并声明它是唯一的。

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

【讨论】:

  • 感谢您的解释。我已根据您的建议更新了图表,因为它们看起来都很理想。看一看,让我知道我是否走上正轨。当您说“我希望看到经理表” 时,您是指将 manager 表从 employee 表下方移出在 PartyType 类别下?我唯一担心的是 managers 将不再将 employee 表属性应用于他们。
  • 不,我只是指当前(可能)经理的表:可以从一个单列表开始,用于存储所有实际是经理的员工的 ID 号。该表将成为任何需要经理 ID 的外键约束的目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 2020-03-02
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多