数据库/模型设计是否某些多对多关系可以是互斥的

问题描述 投票:0回答:1

假设我们有文章many2many标签,中间的ArticleToTag表中有其他字段(如createdAt)。

但是,有些标签被视为独占标签,并且文章只能有一个独占标签。但除此之外,独占标签具有与常规标签完全相同的字段,并且连接也具有完全相同的字段。

所以这里有几个选择:

  1. 将 Tag 和 ExclusiveTag 作为具有相同字段的不同实体。

    拥有文章many2one ExclusiveTag,并在文章中复制其他ArticleToTag字段。

++ 在数据库级别完全防错

++ 无需任何代码

-- 数据库级别有大量重复

-- 如果您想将某个 Tag 更改为 Exclusive,则之前的所有记录都需要更新

  1. 将独占标签视为带有 isExclusive 标志字段的标签。

在 ORM 级别上做所有事情。

++ 数据库级别的零重复

++ 如果您想将某个Tag更改为Exclusive,则之前的所有记录都不需要更新

-- 在数据库级别不防错

--需要大量代码

  1. 将独占标签视为带有 isExclusive 标志字段的标签。

    有文章 one2one ArticleToTag。

== 在数据库级别几乎防错

== 只需要一点代码

==几乎没有重复

-- 由于循环引用而无法级联持久化 - 您必须先持久化 Article,然后持久化 ArticleToTag 并更新 Article

  1. 对 ExclusiveTag 和 ArticleToExclusiveTag 使用 ORM 继承。

    有文章 one2one ArticleToExclusiveTag。

== 与数据库级别的前一个选项相同

++ 防错并且不需要 ORM 级别的代码

++ 可以级联持久化

这是常见问题吗?最优解决方案是否有共识?

database-design orm doctrine-orm
1个回答
0
投票

但是,有些标签被视为独占标签,并且文章只能有一个独占标签。但除此之外,独占标签具有与常规标签完全相同的字段,并且连接也具有完全相同的字段。

标签中只需有一个标志属性(布尔字段),表明哪些标签是“独占的”。然后,在 ArticleToTag 中,除了各种 FK 之外,您还需要一个检查约束,以便在任何时间最多有一个“独占”标签与任何一篇文章相关联,您可以使用表级约束来实现这一点(不应使用触发器)这里是必要的,只是一个表约束,但细则可能会根据特定的 DBMS 的不同而有所不同)。

© www.soinside.com 2019 - 2024. All rights reserved.