7

我有一个表用户:

user_id - name

这些用户可以创建一篇文章,然后与其他成员分享,表格文章:

article_id - user_id - article_name

这个问题是分享它的最佳方式......我在想另一个表article_shares:

share_id - article_id - user_id

这将简单地列出所有有权访问该文章的用户,并且创建者将有权在该表中为他们创建的文章添加或删除

因此,当文章创建者 (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'

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

谢谢你的帮助

4

1 回答 1

1

你做对了。如果你很好奇,你已经制作了一个连接表来创建 和 之间的多对多关系usersarticles这是相当标准的。

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

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

于 2012-10-10T18:10:23.573 回答