如何对跟踪聚合实体验证缺失的特性进行建模



假设我有一个Person表、一个Song表和一个Person_Song表,这是两个表之间的多对多连接表。

如果一个人知道一首歌的所有歌词,则在Person_Song表中插入一条记录。如果这个人知道3首歌,那么就插入3条记录。好……简单的东西。

假设我们向100个人发送了一份调查问卷。大多数人会填写调查问卷,他们会输入2到3首歌。有些人根本不愿意填写调查问卷。然后还有一些人会填写调查问卷,并注明"我不知道任何歌曲的歌词"。

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

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

这是我的一些想法:

1)在Song表中为"No Known Songs"(ID == 0或类似的东西)创建一个条目。如果他们明确声明他们不知道任何歌曲,那么在Person_Song表中插入一条记录。我还需要强制执行(通过db约束或代码),如果该人有其他记录分配给他,则不插入此记录。这是"hacky"当然,但我认为它会工作。

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

使我的需求进一步复杂化的是,我还需要跟踪其他聚合实体。假设我们有一个Movie表和一个Person_Movie连接表,用来记录一个人看过的电影。再假设我们有一个Book表和一个Person_Book连接表,用来记录一个人读过的书。对于所有这些实体,我需要跟踪一个人是否明确承认他不熟悉任何形式的聚合实体。

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

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

有其他的设计我应该考虑吗?

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

我不喜欢客户端从"特殊"记录推断语义的解决方案,所以我不会选择您的选项1。

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

一个问题:数据库是开放的是矛盾的。数据库可以包含一个人的两条记录,一条说"我知道歌a",另一条说"我不知道歌";这是不应该发生的,但防止它的发生是一大堆麻烦。

最新更新