表设计建议

时间:2012-10-10 10:14:32

标签: mysql sql

我有一个表用户:

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'

这看起来合乎逻辑吗?我是在正确的轨道上吗?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

你做得对。如果您感到好奇,那么您已经junction table创建了usersarticles之间的多对多关系,这是相当标准的。

您经常会看到这些类型的表名为ArticlesToUsers或类似的表格,这有时候是第一种提示您正在查看联结表的方法。当然,命名方案非常主观,所以不要觉得需要更改名称。 article_shares对我来说似乎是一个很好的描述。

正如@MaxVT已经证明的那样,你会发现许多开发人员不会像这样在联结表上放置surrogate key,而是只使用两列作为主键(article_id,user_id)。选择显然是你的,可能更多地与保持与其他数据库表保持一致,尽管你肯定会看到所有的排列。如果您确实保留了代理键,我建议使用article_id, user_id的唯一约束来消除重复(为什么需要将文章共享给用户两次?)。