如何在数据库 ERD 中模拟钻石般的多对多关系

ozm*_*ozm 5 mysql postgresql database-design erd database-diagram

组织 ID 作为外键 organization_id 作为主键

传奇:

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

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

organization,itemtag实体。

我的目标是建模:

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

我绘制了两种替代解决方案,但没有一个让我满意。

图1个断裂第三目标itemstags使用是自己唯一id的主键,但没有什么可以阻止插入到对item_tag属于不同的组织。

图2不破,但弯曲第一和第二目标organization_id加入作为主键和外键itemtag表和item_tag.organization_id列引用两者。这可以防止来自不同组织的配对。tag.idanditem.id列现在是不必要的复合主键的一部分,因为实际上单列id表示itemand 的唯一性tag

我如何正确地为这些需求建模?

Erw*_*ter 6

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

  • 包括organization_id在所有表中
  • 创建逻辑冗余UNIQUE(或PK)约束(organization_id, id) 在两个表中tag,并item
  • item_tag匹配这些UNIQUE 约束的列时具有多列FK约束。

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

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

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