假设我有一个表格posts
,其中包含发布用户的User_id
和帖子的post_id
。我还有另一个表comments
,其中仅包含它属于child_of_post
的帖子。
问题出在这里:我只需要从评论中选择,但同时获得评论所属帖子的user_id
。
所以我应该使用像这样的联接
SELECT user_id FROM comments INNER JOIN posts ON child_of_post = post_id
读到这个让我更加困惑,我真的不知道如何解释它,但是,总的来说,如果我需要使用相同的值,如id和id,是否应该在需要的每个表中保存该值?还是应该只将其保存在一个表中并使用联接来检索它?
使用联接比在表中再添加一列更好吗?
答案 0 :(得分:1)
使用联接比向表中添加一列更好吗?
通常:是。
您的数据库设计看起来不错。作为一般原则,请避免在表之间重复数据。这在存储方面效率低下,并且在涉及修改数据时可能很快变成维护的噩梦,最终威胁到数据的完整性。
代替复制数据,通常的方法是存储对存储原始数据的表行的引用;这称为外键,它提供了有助于维护数据完整性的各种功能(防止在子表中插入孤立记录,在删除父表时删除子记录,...)。 / p>
在您的用例中,您确实确实需要JOIN
来恢复创建原始帖子的用户,例如:
SELECT p.user_id, c.*
FROM comments c
INNNER JOIN posts p ON c.child_of_post = p.post_id
假设post_id
是表posts
的主键,这样的JOIN
具有相等条件,该条件引用另一个表的主键,特别是在创建索引时在引用列comments.child_of_post
上。
PS:将别名赋予表名,并使用它们为查询中的字段建立索引是一种好习惯;它避免了列名冲突(当两个表具有相同名称的字段时)引起的细微错误,并使查询更加容易。