如何在数据库 ERD 中模拟多对多关系的菱形模型

How to model diamond like many-to-many relationship in database ERD

图例:

如何模拟菱形(如果术语正确)关系?最好用一个简化的例子来解释:

organizationitemtag 个实体。

我的目标是建模:

  1. 每个 tag 都是独一无二的,属于一个组织。
  2. 每个 item 都是独一无二的,属于一个组织。
  3. 项目有很多标签(使用 M2M table 加入)并且相关的 tag/item 对必须属于同一组织。 (即组织 A 的项目不能与组织 B 的标签配对)

我绘制了两个备选解决方案,但 none 个令我满意。

Diagram 1 breaks 3rd aim: itemstags 本身是唯一的,使用 id 作为主键,但没有任何内容停止将对插入属于不同组织的 item_tag

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

我怎样才能正确地模拟这些需求?

要实施参照完整性,您必须...

  • 在所有表格中包含 organization_id
  • tagitem
  • 两个表中对 (organization_id, id) 创建逻辑冗余 UNIQUE(或 PK)约束
  • item_tag 中有多列 FK 约束与那些 UNIQUE 约束的列相匹配。

如果您不包含 organization_id(逻辑上是冗余的),则没有什么可以阻止您(错误地)链接来自不同组织的项目和标签。

那将是您的 图表 2。但是你真的需要标签的数据类型 uuid 吗? bigint 甚至 int 应该足够了,同时更小更快。

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