如何建模跟踪已验证的聚合实体缺失的功能?

时间:2011-08-18 04:49:29

标签: database-design

假设我有一个Person表和一个Song表以及一个Person_Song表,它是另外两个表之间的多对多连接表。

如果某人知道歌曲的所有歌词,则会在Person_Song表中插入记录。如果此人知道3首歌曲,则插入3条记录。很好......简单的东西。

所以我们假设我们向100人发送了一份调查问卷。大多数人都会填写调查表,他们会输入2或3首歌曲。有些人根本不会填写调查问卷。然后有一些人会填写调查并注意“我不知道任何歌曲的歌词”。

我想区分他们没有指定任何歌曲的情况,以及他们明确表示他们知道零歌曲的情况。

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

以下是我的一些想法:

1)在Song表中为“No Known Songs”创建一个条目(ID == 0或类似的东西)。如果他们明确声明他们不知道任何歌曲,那么在Person_Song表中插入一条记录。我还需要强制执行(通过数据库约束或代码),如果该人员已经分配了其他记录,则不会插入此记录。这肯定是“hacky”,但我认为它会起作用。

2)创建一个名为PersonNoKnownSongStatus的单独表,该表与Person表具有一对一或一对一的关系。如果为Person设置了此标志,则插入记录。如果我们追溯性地将记录添加到Person_Song表,那么我们将删除此记录(或更新记录中的标记)。这可行,看起来不那么苛刻,但它与第一​​个解决方案的工作量相同。

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

所以我认为这为第三种设计打开了大门:

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

我应该考虑另一种设计吗?

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

1 个答案:

答案 0 :(得分:1)

我不喜欢客户从“特殊”记录中推断出语义的解决方案,所以我不会选择你的选项1.

您的选项3似乎准确记录了我们的意思,正如您所展示的那样,它延伸到许多此类负面回应。

一个问题:数据库容易出现矛盾。数据库可以包含两个记录,一个人说“我知道歌曲A”,一个人说“我不懂歌”;这不应该发生,但防止它发生是一大堆麻烦。