MySQL:一排或更多?

时间:2010-09-03 13:38:11

标签: mysql database database-design

我现在有任何类型的内容,我现在可以为内容指定多个types

问题是,我应该使用多行来添加多个类型,还是使用type字段,并在其中放置以逗号分隔的类型,并在PHP <中解析它们/ p>

多行

`content_id` | `type`

1            | 1
1            | 2
1            | 3

VS

单行

`content_id` | `type`

1            | 1,2,3

修改


我正在寻找更快的答案,而不是更容易,请考虑一下。性能对我来说非常重要。所以我说的是一个包含millionsten millions行的真正庞大的数据库。

6 个答案:

答案 0 :(得分:5)

我通常总是推荐“多行”方法,因为它有几个优点:

  • 您可以使用SQL返回示例WHERE type=3而不会有任何困难,因为您不必使用效率较低的WHERE type LIKE '%3%'
  • 如果您需要针对每个content_idtype对存储其他数据,您会在多行版本中发现它更容易
  • 当您的表格以“多行”格式存储时,您可以将一个或多个索引应用于您的表格,以提高检索数据的速度
  • 当每个对分开存储时,编写查询以添加/删除content_idtype对比将它们存储为逗号分隔列表更容易
  • 让(几乎)总是让SQL处理数据给你一个子集,而不是将它传递给PHP或其他任何东西进行处理

通常,让SQL做它最擅长的事情,这允许您存储数据,并获取数据的子集。

答案 1 :(得分:4)

我总是使用多行。如果您使用单行,您的数据很难读取,一旦从数据库中获取数据,就必须将其拆分。

答案 2 :(得分:2)

使用多行。这样,您可以稍后将type列编入索引,并在将来需要时更快地搜索它。此外,它还消除了对前端语言的依赖性,以便对查询结果进行解析。

答案 3 :(得分:2)

归一化与非规范化设计。 通常我会建议坚持“多行”风格(标准化) 虽然有时(出于性能/存储原因)人们故意实施“单排”风格。

看看这里:

http://www.databasedesign-resource.com/denormalization.html

答案 4 :(得分:1)

在少数情况下,单行可能更好。报告往往更容易,一些非规范化是主要的例子。因此,如果您的代码更清晰/单行表现更好,那么就去做吧。其他方面,多行将是最佳选择。

答案 5 :(得分:1)

永远不会将多个逻辑字段用逗号分隔符填充到单个字段中。

正确的方法是创建多行。

如果某些性能原因要求您使用单行,则至少在行中创建多个字段。但话说回来,几乎从来没有一个很好的表现理由。首先要做好设计。

您是否曾想知道所有记录,比如type = 2?对于多行,这很容易:“从mytable中选择content_id,其中type = 2”。使用填充字段,您必须说“从mytable中选择content_id,类型为'%2%'”。哦,除了超过11种类型会发生什么?上面的查询会找到“12”。好吧,你可以说“类似'%,2,%'的类型”。如果2是列表中的第一个或最后一个,则不起作用。即使您想出了一种可靠的方法,使用初始%的LIKE搜索意味着对表中的每条记录进行顺序读取,这非常慢。

你有多大的筹码领域?如果类型字符串太大而无法达到最大值,该怎么办?

您是否携带有关类型的任何数据?如果您使用“type”键创建第二个表,例如,该类型的描述,您将如何加入该表。使用多行,您只需使用(type_id)“从内容连接类型”中编写“select content_id,type_id,description”。挤满了田地......不那么容易。

如果添加新类型,如何使其保持一致?假设它曾经说过“3,7,9”,现在你加上“5”。你能说“3,7,9,5”吗?或者他们必须整理好吗?如果它们不合适,则无法检查是否相等,因为“1,2”和“2,1”看起来并不相同,但它们实际上是等价的。在任何一种情况下,更新类型字段现在变为程序而不是单个SQL语句。

如果有一些微不足道的表现,那就不值得。