选项 3 是最干净的。它使添加和删除收藏夹变得最简单。这是 ORM 框架将实现的模式。
选项 1 是可行的,但您无法定义外键约束来强制完整性。在查询中添加谓词WHERE type='Venue'
,使得使用该表几乎就像使用单独的“Favorite_Venue”表一样。
如果收藏夹已经存在,选项 2 会使添加收藏夹复杂化。(这需要更新现有行,而不是插入。如果有人有两个最喜欢的场地和五个最喜欢的表演者,那会有多少行?但至少可以定义外键。
假设我们有两个最喜欢的场地和两个最喜欢的表演者:
userID venueID performerID
------ ------- -----------
1 11 177
1 NULL 654
1 12 NULL
当最喜欢的场地 ID 11 被删除时,您将更新该行以将场地 ID 设置为 NULL。但是如果将venueID 12 作为收藏项删除,您是将该列设置为NULL,还是删除该行。当您要添加最喜欢的表演者时,您是更新现有的 performerID 为 NULL 的行,还是插入一行。不是不可行,但它更复杂。
如果我们有一条规则说只能填充其中一个列venueID 或performerID,那么使用谓词likeWHERE venueID IS NOT NULL
将使处理这个表几乎就像处理一个单独的Favorite_Venue 表一样。
最重要的是,我会选择选项 3,除非有一些令人信服的理由不这样做。
这不是“混乱”。这些表Favorite_Venue 和Favorite_Performer 中的每一个都有一个目的,一个“存在的理由”,一个它存在的原因。每个表解析多对多关系。
将这两个单独的“关系”表组合成一个表实际上会造成混乱。如果我们添加一列来区分行(以有效地回答问题,该行真正属于哪个表),则该列是“混乱”的。如果我们在同一行上为两个关系使用两个单独的列,则会在处理添加或删除收藏夹的代码中产生混乱。