2017-09-22 58 views
0

我正在为我正在开发的一个新项目构建数据模型。这个数据模型的一部分涉及具有“标志”的实体。数据库理论:有一个可应用于许多实体的“标志”表的最佳方式?

一个标志只是一个布尔值 - 实体有标志或没有标志。为此,我有一个名为“标志”的表,它具有一个ID,一个字符串名称和一个描述。 (标志示例可能是“正在激活”或“应该显示”或“属于组”)

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

好的,现在我添加另一个实体 - 说“部分”。每个部分也可以有标志。所以我创建了一个sectionFlags表来适应这个。

现在我有另一个实体 - “内容”,所以再次,“contentFlags”。

依此类推。

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

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

或者,或许我的数据模型是原样的,而这只是野兽的性质。

任何更高级的经验丰富的数据库开发人员都会关心吗?

回答

1

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

另一种做法是使用多态关系。

您的实体到标志表需要2列以及到标志表的外键链接;

other_key integer not null 
other_type varchar(...) not null 

而在这些领域,你存储在整数的关系,并在VARCHAR关系的类型的外键。支持这种功能的全功能ORM有时会将外部关系的类名称存储在类型列中,以帮助进行对象加载。

这里的缺点是整数不能是真正的外键,因为它将包含许多表中的重复项。它也使得您的查询比多对多表更加有趣地实现每个连接,但它确实允许您在代码中推广连接。

相关问题