我有一个名为UserComments的表。
它包含3列:
id,user_id和comment_id。
我以不同的方式查询此表。
1用户ID和
1 by comment id
。这两个字段都被编入索引。
我想添加其他列标记。
通过评论ID 查询时,我只需要此列。
将列添加到现有表中是否更有意义(并且不将其返回以避免数据传输)?
OR
创建新表并在必要时执行连接?
为什么1比另一个更好?
答案 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