Mysql 我应该将相同的值(id)保存到表中,还是连接它们以检索值(id)?
假设我有一个表Mysql 我应该将相同的值(id)保存到表中,还是连接它们以检索值(id)?,mysql,sql,database,join,database-design,Mysql,Sql,Database,Join,Database Design,假设我有一个表posts,其中包含发布用户的User\u id,以及post的postpost\u id。我还有另一个表comments,它只包含它所属的帖子child\u of\u post 问题就在这里:我只需要从评论中选择,但同时获取评论所属帖子的用户id 因此,我应该使用如下连接: SELECT user_id FROM comments INNER JOIN posts ON child_of_post = post_id 阅读这篇文章让我更加困惑,我真的不知道如何解释它,但是,一
posts
,其中包含发布用户的User\u id
,以及post的postpost\u id
。我还有另一个表comments
,它只包含它所属的帖子child\u of\u post
问题就在这里:我只需要从评论中选择,但同时获取评论所属帖子的用户id
因此,我应该使用如下连接:
SELECT user_id FROM comments INNER JOIN posts ON child_of_post = post_id
阅读这篇文章让我更加困惑,我真的不知道如何解释它,但是,一般来说,如果我需要使用相同的值,比如和id,我应该在我需要的每个表中保存该值吗?或者我应该只将其保存在一个表中,并使用联接来检索它
使用联接是否比向表中再添加一列更好
使用联接是否比向表中再添加一列更好
一般来说:是。
您的数据库设计看起来不错。一般原则是,避免跨表复制数据。这在存储方面效率低下,而且在修改数据时也可能很快变成维护噩梦,最终威胁到数据的完整性
通常的方法不是复制数据,而是存储对存储原始数据的表行的引用;这称为外键,它提供了各种有助于维护数据完整性的功能(防止在子表中插入孤立记录,删除父表时删除子记录,…)
在您的用例中,您确实需要JOIN
来恢复创建原始帖子的用户,如:
SELECT p.user_id, c.*
FROM comments c
INNNER JOIN posts p ON c.child_of_post = p.post_id
假设post\u id
是表posts
的主键,这样带有引用另一个表的主键的相等条件的JOIN
是非常有效的,特别是如果您在引用列comments.child\u的上创建索引
PS:给表名指定别名并使用它们对查询中的字段进行索引是一种很好的做法;它避免了由于列名冲突(当两个表都有同名字段时)而导致的细微错误,并使查询更容易 一定要加入它(但它是内部的,有两个N
,而不是三个;)(有时也会发生在我身上)。虽然您可能希望在评论中包含用户ID,但不是发布评论的用户的ID,而是发布评论的用户的ID。