情况
假设我有以下内容:
- 一个名为
items
的表格 - 一个名为
lists
的表格,可以将这些项目链接到其中 - 一个名为
users
的表格
条件:列表可以属于所有或一个特定的用户
我想做的是创建存在于每个用户中的“全局”列表。但应该有可能使用用户特定的列表来“覆盖”此全局列表。例如对于随机用户:
- 一个名为books的全局列表
- 一个名为cds的用户特定列表
现在,当检索此用户的列表时,我应该获得全局书籍列表和用户特定的CD列表。但是,如果此用户有特定的书籍列表呢?
- 一个名为books的全局列表
- 一个名为books的用户特定列表
- 一个名为cds的用户特定列表
因此,现在它应该检索名为books的用户特定列表,而不是全局列表,当然还有用户特定的cds列表。
可能的解决方案
最简单的方法是:
table: lists - id - name - userId
如果userId IS NULL
,则意味着它是全局列表,但当它不为 NULL
时,则属于特定用户。因此,第一个示例将是userId = 1:
id name userId 1 books NULL 2 cds 1
要检索此用户的列表:
SELECT * FROM lists WHERE userId = 1 OR userId IS NULL
但是,然后我卡在下一部分:
id name userId 1 books NULL 2 cds 1 3 books 1
这里的第一个列表“books”是全局列表,但是此用户还有一个用户特定列表“books”。是否可以忽略此情况中的全局列表,并仅返回用户特定列表?
另一个可能性是创建一个lists_users
表格,将所有用户链接到所有全局列表,并在创建具有与其中一个全局列表相同名称的用户特定列表时删除此链接。虽然这似乎不太高效,但添加新用户时需要更多的工作来维护。
问题:
在数据库中设置这个最佳且最有效的方式是什么,以便我可以轻松地为特定用户检索正确的列表?