Database 数据库理论:拥有;旗帜;可以应用于许多实体的表?

Database 数据库理论:拥有;旗帜;可以应用于许多实体的表?,database,data-modeling,theory,Database,Data Modeling,Theory,我正在为我正在开发的一个新项目建立一个数据模型。此数据模型的一部分涉及具有“标志”的实体 标志只是一个布尔值——实体有标志或没有标志。为此,我有一个名为“flags”的表,它有一个ID、一个字符串名和一个描述。(标志的示例可能是“处于活动状态”、“应显示”或“属于组”。) 例如,我的users表中的任何用户都可以没有、有一个或有多个标志。因此,我创建了一个带有用户ID和标志ID的userFlags桥接表。如果该表包含给定标志ID和用户ID的行,则该用户具有该标志 好的,现在我添加另一个实体,比如

我正在为我正在开发的一个新项目建立一个数据模型。此数据模型的一部分涉及具有“标志”的实体

标志只是一个布尔值——实体有标志或没有标志。为此,我有一个名为“flags”的表,它有一个ID、一个字符串名和一个描述。(标志的示例可能是“处于活动状态”、“应显示”或“属于组”。)

例如,我的users表中的任何用户都可以没有、有一个或有多个标志。因此,我创建了一个带有用户ID和标志ID的userFlags桥接表。如果该表包含给定标志ID和用户ID的行,则该用户具有该标志

好的,现在我添加另一个实体,比如“section”。每个部分也可以有标志。因此,我创建了一个sectionFlags表来适应这一点

现在我有了另一个实体——“content”,所以又是“contentFlags”

等等

我的最终数据模型基本上每个实体有两个表,一个用于保存实体,另一个用于标记

虽然这确实有效,但似乎有更好的方法来设计我的模型,所以我不必有这么多桥表。我的一个想法是一个主“hasFlags”表,其中包含标志ID、项目ID和项目类型。项类型可以是仅接受与已知实体对应的值的枚举字段。唯一的问题是我的实体外键无法工作,因为每个“项目ID”都可能引用不同的实体。(我实际上已经在其他数据模型中使用了这种技术,虽然它确实有效,但会失去引用完整性以及级联更新之类的东西。)

或者,也许我的数据模型很好,这正是野兽的本性


有没有经验丰富的高级DB开发人员愿意加入

多对多关系是实现这一点的一种方法(可能比我建议的要快,因为它们可以使用整数键索引)

另一种方法是使用多态关系

标记表的实体需要2列以及指向标记表的外键链接

other_key integer not null
other_type varchar(...) not null
在这些字段中,将关系的外键存储在整数中,将关系的类型存储在varchar中。支持此功能的完整ORM有时会将外部关系的类名存储在类型列中,以帮助加载对象

这里的缺点是整数不能是真正的外键,因为它将包含来自许多表的重复项。与多对多表相比,它还使每次连接的查询更加有趣,但它确实允许您在代码中概括连接