我应该将相同的值(id)保存到表中还是将其联接以检索值(id)?

时间:2019-01-24 22:25:07

标签: mysql

假设我有一个表格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,是否应该在需要的每个表中保存该值?还是应该只将其保存在一个表中并使用联接来检索它?

使用联接比在表中再添加一列更好吗?

1 个答案:

答案 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:将别名赋予表名,并使用它们为查询中的字段建立索引是一种好习惯;它避免了列名冲突(当两个表具有相同名称的字段时)引起的细微错误,并使查询更加容易。