Database design 如何对跟踪已验证缺少聚合实体的功能进行建模?

Database design 如何对跟踪已验证缺少聚合实体的功能进行建模?,database-design,Database Design,假设我有一个Person表和一个Song表,还有一个Person\u Song表,它是另外两个表之间的多对多联接表 如果一个人知道一首歌的所有歌词,则会在person\u song表中插入一条记录。如果此人知道3首歌曲,则插入3条记录。很好,很简单 假设我们对100人进行了调查。大多数人会填写调查,并输入2或3首歌曲。有些人根本不会填写调查。还有一些人会填写调查,并注明“我不知道任何歌曲的歌词” 我想区分他们没有指定任何歌曲的情况和他们明确表示不知道歌曲的情况 在数据库中跟踪此情况的最佳方法是什

假设我有一个
Person
表和一个
Song
表,还有一个
Person\u Song
表,它是另外两个表之间的多对多联接表

如果一个人知道一首歌的所有歌词,则会在
person\u song
表中插入一条记录。如果此人知道3首歌曲,则插入3条记录。很好,很简单

假设我们对100人进行了调查。大多数人会填写调查,并输入2或3首歌曲。有些人根本不会填写调查。还有一些人会填写调查,并注明“我不知道任何歌曲的歌词”

我想区分他们没有指定任何歌曲的情况和他们明确表示不知道歌曲的情况

在数据库中跟踪此情况的最佳方法是什么?这有一个众所周知的模式吗

以下是我的一些想法:

1) 在歌曲表中为“未知歌曲”(ID==0或类似的内容)创建一个条目。如果他们明确表示不知道任何歌曲,则在
Person\u Song
表中插入一条记录。我还需要强制(通过db约束或代码)如果此人有其他分配给他的记录,则不插入该记录。这肯定是“骇客”,但我认为它会起作用

2) 创建一个名为
personnoknownsogstatus
的单独表,该表与
Person
表具有一对零或一的关系。如果为个人设置了此标志,则会插入一条记录。如果我们追溯性地将记录添加到
Person\u Song
表中,那么我们将删除该记录(或更新记录中的标志)。这会起作用,而且看起来不那么麻烦,但它的工作量与第一个解决方案大致相同

使我的需求更加复杂的是,我还需要跟踪其他aggreate实体。因此,假设我们有一个
电影
表和一个
个人电影
联接表,用于跟踪一个人看过的电影。还可以想象,我们有一个
Book
表和
Person\u Book
联接表,用于跟踪一个人读过的书。对于所有这些实体,我需要跟踪一个人是否明确承认他不熟悉任何形式的聚合实体

因此,我认为这为第三种设计打开了大门:

3) 创建一个名为
personnoknownentystatus
的单独表,该表在
Person
表和
Entity
表之间具有多对多关系,其中
Entity
包含歌曲、电影和书籍的查找记录。如果此人确认他们没有看过任何电影,则会为该人ID插入一条记录,并为电影行插入关联实体记录。书籍和歌曲也是如此

有另外一个设计我应该考虑吗?

(编辑)
我忘了提到在Person表中添加新列的可能性。这些可能只是布尔标志,甚至是表示显式缺少实体的位掩码。我想避免使用此解决方案,因为在
Person
表上已经存在很多争用。

我不喜欢客户端从“特殊”记录推断语义的解决方案,因此我不会选择您的选项1

你的选项3似乎准确地记录了我们的意思,正如你所展示的,它延伸到许多这样的负面反应

一个问题是:数据库可能存在矛盾。该数据库可能包含两条个人记录,一条说“我知道歌曲a”,另一条说“我不知道歌曲”;这不应该发生,但防止它发生是一件麻烦事