假设我们有文章many2many标签,中间的ArticleToTag表中有其他字段(如createdAt)。
但是,有些标签被视为独占标签,并且文章只能有一个独占标签。但除此之外,独占标签具有与常规标签完全相同的字段,并且连接也具有完全相同的字段。
所以这里有几个选择:
将 Tag 和 ExclusiveTag 作为具有相同字段的不同实体。
拥有文章many2one ExclusiveTag,并在文章中复制其他ArticleToTag字段。
++ 在数据库级别完全防错
++ 无需任何代码
-- 数据库级别有大量重复
-- 如果您想将某个 Tag 更改为 Exclusive,则之前的所有记录都需要更新
在 ORM 级别上做所有事情。
++ 数据库级别的零重复
++ 如果您想将某个Tag更改为Exclusive,则之前的所有记录都不需要更新
-- 在数据库级别不防错
--需要大量代码
将独占标签视为带有 isExclusive 标志字段的标签。
有文章 one2one ArticleToTag。
== 在数据库级别几乎防错
== 只需要一点代码
==几乎没有重复
-- 由于循环引用而无法级联持久化 - 您必须先持久化 Article,然后持久化 ArticleToTag 并更新 Article
对 ExclusiveTag 和 ArticleToExclusiveTag 使用 ORM 继承。
有文章 one2one ArticleToExclusiveTag。
== 与数据库级别的前一个选项相同
++ 防错并且不需要 ORM 级别的代码
++ 可以级联持久化
这是常见问题吗?最优解决方案是否有共识?
但是,有些标签被视为独占标签,并且文章只能有一个独占标签。但除此之外,独占标签具有与常规标签完全相同的字段,并且连接也具有完全相同的字段。
标签中只需有一个标志属性(布尔字段),表明哪些标签是“独占的”。然后,在 ArticleToTag 中,除了各种 FK 之外,您还需要一个检查约束,以便在任何时间最多有一个“独占”标签与任何一篇文章相关联,您可以使用表级约束来实现这一点(不应使用触发器)这里是必要的,只是一个表约束,但细则可能会根据特定的 DBMS 的不同而有所不同)。