假设我有一个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
表上存在很多争用。
答案 0 :(得分:1)
我不喜欢客户从“特殊”记录中推断出语义的解决方案,所以我不会选择你的选项1.
您的选项3似乎准确记录了我们的意思,正如您所展示的那样,它延伸到许多此类负面回应。
一个问题:数据库容易出现矛盾。数据库可以包含两个记录,一个人说“我知道歌曲A”,一个人说“我不懂歌”;这不应该发生,但防止它发生是一大堆麻烦。