我有一个表用户:
user_id - name
这些用户可以创建一篇文章,然后与其他成员共享,表格文章:
article_id - user_id - article_name
问题是分享它的最佳方式......我正在考虑另一个表格article_shares:
share_id - article_id - user_id
这只会列出所有可以访问该aerticle的用户,并且创建者可以访问该表以便为他们创建的文章添加或删除
因此,当文章创建者(user_id 123)查看他的文章时,他可以看到他与每篇文章共享的所有其他用户的列表
select as.user_id, a.article_name from article_shares as
join users u on u.user_id = as.user_id
join articles a on a.article_id = as.article_id where u.user_id = '123'
并且用户(user_id 456)可以看到他们已经共享的文章列表
select a.article_name from articles a
join article_shares as on as.article_id = a.article_id
where as.user_id = '456'
这看起来合乎逻辑吗?我是在正确的轨道上吗?
感谢您的帮助
答案 0 :(得分:1)
你做得对。如果您感到好奇,那么您已经junction table创建了users
和articles
之间的多对多关系,这是相当标准的。
您经常会看到这些类型的表名为ArticlesToUsers
或类似的表格,这有时候是第一种提示您正在查看联结表的方法。当然,命名方案非常主观,所以不要觉得需要更改名称。 article_shares
对我来说似乎是一个很好的描述。
正如@MaxVT已经证明的那样,你会发现许多开发人员不会像这样在联结表上放置surrogate key,而是只使用两列作为主键(article_id,user_id)。选择显然是你的,可能更多地与保持与其他数据库表保持一致,尽管你肯定会看到所有的排列。如果您确实保留了代理键,我建议使用article_id, user_id
的唯一约束来消除重复(为什么需要将文章共享给用户两次?)。