1桌或2桌?

时间:2014-06-17 20:13:18

标签: mysql sql sql-server

我有一个名为UserComments的表。

它包含3列:

  

id,user_id和comment_id。

我以不同的方式查询此表。

  

1用户ID和

1 by comment id。这两个字段都被编入索引。

我想添加其他列标记。

通过评论ID 查询时,我只需要此列。

将列添加到现有表中是否更有意义(并且不将其返回以避免数据传输)?

OR

创建新表并在必要时执行连接?

为什么1比另一个更好?

3 个答案:

答案 0 :(得分:1)

添加为答案,因为共识已达成一致:

一般来说,更多的表更好。原因是,您希望避免冗余数据。您的用户表应该是独立的。您的注释表应该有自己的ID和UserID的字段 - 加入它。您需要的后续内容不是评论或新用户应该他们的拥有相同方案的表。

通过这种方式,您可以让您的用户独立,并且能够轻松地将每个用户加入到无限数量的评论中,而且没有冗余。

答案 1 :(得分:1)

您应该使用单独的表来表示标记的特定用途。 让我们以此堆栈溢出问题为例。您创建了一个包含3个标签的问题。这意味着一条评论有三个标签,换句话说就是一对多的关系。 模拟一对多的正确方法是使用单独的表。现在,让我们看一下差异。

一张桌子: 你将有一张桌子。您将无法对一对多进行建模,因此您必须创建自己的方法,以便为标记提供多个标记,例如CSV。

示例:

id, user_id, comment_id, tags
'2',  '276',    '2738',  'mysql,sql,sql-server'

你能看到这种情况如何变得混乱吗?您需要编写自己的代码来解析csv。现在,想象一下你想按标签搜索。哦,男人......将成为噩梦..如果你使用sql正则表达式或类似的话,它会很慢......

另一方面,两个表将有第二个表

comment_id, tag
123, mysql
123, sql
123, sql-server

你用123获取所有条目,你有你的清单。现在,如果您想按标签搜索,请轻松。

我的猜测是,您已经在其他地方为用户提供了一个单独的表,并使用此注释表获取所有用户注释。你这样做本来就是因为用户和评论是一对多的关系。这里的概念相同。

答案 2 :(得分:0)

我会做这样的事情。我会为标签创建一个表,而不是当你可以将它与Tag表关联时,有一个包含'sql-server'标签的n个实例的列。所以sql-server的id为1. int over over varchar'sql'server'占用的空间更少,并且可以轻松扩展。

注释

CommentID
..etc

UserComment在

UserCommentID
CommentID
UserID

CommentTag

CommentTagID
UserCommentID
TagID

标签

TagID
Description