如何在数据库ERD中建模像多对多关系一样的钻石

时间:2018-06-18 13:37:51

标签: mysql postgresql database-design erd database-diagram

organization_id as foreign key organization_id as primary key

图例:

  • PK(蓝色):主键
  • FK(绿色):外键
  • PFK(蓝色):主键和外键同时

如何模拟钻石(如果术语是正确的)关系?最好用简化的例子来解释:

organizationitemtag个实体。

我的目标是建模:

  1. 每个tag本身都是唯一的,属于一个组织。
  2. 每个item本身都是唯一的,属于一个组织。
  3. 项目有很多标签(使用M2M表加入),相关的tag / item对必须属于同一个组织。 (即组织A中的项目不能与组织B中的标签配对)
  4. 我描绘了两种替代解决方案,但他们都没有满足我。

    图1突破第3个目标itemstags本身是唯一的,使用id作为主键,但没有什么可以阻止插入对item_tag属于不同的组织。

    图2没有中断,但弯曲第一和第二目标organization_id被添加为itemtag表的主键和外键item_tag.organization_id列引用了两者。这可以防止来自不同组织的对。 tag.iditem.id列现在是不必要的复合主键的一部分,因为实际上单id列代表itemtag的唯一性。

    如何正确建模这些要求?

1 个答案:

答案 0 :(得分:3)

为了强制执行参照完整性,您必须......

  • 在所有表格中加入organization_id
  • UNIQUE(organization_id, id)
  • 两个表中tag创建逻辑冗余item(或PK)约束
  • item_tag中的多列FK约束与UNIQUE约束的列匹配。

如果您不包含organization_id(逻辑冗余),则无法阻止您链接来自不同组织的项目和标签(错误地)。

这将是您的图表2 。但是你真的需要标签的数据类型uuid吗? <{1}}或甚至bigint应该足够,同时更小更快。

与PostgreSQL的代码示例密切相关的案例: