单表与多表?

时间:2018-06-02 06:20:09

标签: mysql sql

我的帖子表包含以下列:id,user_id,title,message,date

我的评论表包含以下列:id,user_id,post_id,message,date

由于这两个表非常相似,所以最好只有一个包含列的表:

id,user_id,parent_id,type,title,message,date

并且作为父帖子的每一行都将具有空的parent_id值,并且作为子帖子的每一行都将具有空标题值。 父类帖子的类型为1,子帖子的类型为2。

编辑:我还将使用评级功能,我再次提出相同的问题,2个具体的post_rating和comment_rating表,或通用的评级表。在评级表的情况下,结构将完全相同,因此没有可空字段。评级表也不太可能发生变化,因为它只知道评级的所有者,实际评级以及目标帖子/评论/等。

2 个答案:

答案 0 :(得分:6)

我不会这样做有几个原因:

  1. 这两者之间存在子/父关系,对于这样的关系,您有外键和单独的表。
  2. 永远不要使用同一个表,因为列的命名是相同的。不要试图在这里节省空间,空间不花费任何东西,但你的时间了解它或更改它。必须解释您的数据库设计(您必须这样做)是由于设计不清晰造成的。所以要保持清洁,不要试图保存一些比特或者不要制作新表;)
  3. 对此表的更改始终会影响两个元素,而不仅仅是一个元素。如果要在评论中添加缩略图图像链接,则还必须触摸帖子。这导致更多的测试,一切仍然有效。
  4. 您的表中包含空值是可以的,但并不理想。当您尝试在必须检查空值的编程环境中使用此表时,这当然很烦人
  5. 如果它们从同一类型继承,您可以将它们放入一个表中。例如,你可以有一个" Text"元素,让我们说评论和帖子是文本。但同样,第1点的关系仍然存在,这将再次导致丑陋的设计。
  6. 评估评级系统:您只需制作一个包含评级的普通表格,评论和帖子表格将与评级表格建立FK关系。就像你现在为用户所拥有的一样。但是,您也可以制作两个单独的表,以后更灵活,并且它可以使连接更快一些,因为评级表不会变得那么大。但这比其他任何事情更具个人偏好。如果评级系统会相互偏离,我肯定会单独制作一个表,但在这种情况下我也会选择一个。

答案 1 :(得分:1)

使用单个表可以让您拥有更深层次的嵌套层次结构。例如:

title
    comment
    comment2
        comment_to_comment
    comment3
        comment_to_comment2
        comment_to_comment3

所以它是2表设置不存在的附加功能。

"我只会在你需要这种能力时才这样做。因为查询会更复杂。向这样的表添加(root_id)列以指示具有嵌套级别大于1的注释标题的节点也是有益的。

您还可以使用一个表作为数据,使用一个表作为父/子层次结构(这只是一个示例,您可能需要调整语法)。

create table element (     
    id        serial  not null primary key,
    data      integer not null
);

create table heirarchy (
    id        serial  not null primary key,
    id_root   integer not null references element(id),
    id_parent integer not null references element(id),
    id_child  integer not null references element(id)
);

insert into element (data) values (100);
insert into element (data) values (101);
insert into element (data) values (102);
insert into element (data) values (103);
insert into element (data) values (104);
insert into element (data) values (105);
insert into element (data) values (106);
insert into element (data) values (107);
insert into element (data) values (108);

select id, data from element;

1 | 100个
  2 | 101个
  3 | 102个
  4 | 103个
  5 | 104个
  6 | 105个
  7 | 106个
  8 | 107个
  9 | 108

insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 4);
insert into heirarchy (id_root, id_parent, id_child) values (3, 3, 5);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 1);
insert into heirarchy (id_root, id_parent, id_child) values (3, 4, 2);
insert into heirarchy (id_root, id_parent, id_child) values (3, 1, 9);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 7);
insert into heirarchy (id_root, id_parent, id_child) values (6, 6, 8);

这种事情并不重要,你也可以设置触发器以防止循环关系。