【发布时间】:2010-12-20 23:46:16
【问题描述】:
我正在开发一个工具,它可能需要填写超过一百万个数据。
目前我已经设计了 36 列的单表。我的问题是我需要将这些分成多个表还是单个??
单身有什么好处和坏处
如果是多个,那么优点和缺点是什么
以及用于提高速度的引擎是什么...
我担心的是一个大型数据库,每天至少有 50000 个查询..
有什么帮助吗??
【问题讨论】:
标签: database database-design mysql mysql-management
我正在开发一个工具,它可能需要填写超过一百万个数据。
目前我已经设计了 36 列的单表。我的问题是我需要将这些分成多个表还是单个??
单身有什么好处和坏处
如果是多个,那么优点和缺点是什么
以及用于提高速度的引擎是什么...
我担心的是一个大型数据库,每天至少有 50000 个查询..
有什么帮助吗??
【问题讨论】:
标签: database database-design mysql mysql-management
是的,您应该规范化您的数据库。一般的经验法则是,如果不是外键的列包含重复值,则应该对表进行规范化。
规范化涉及将您的数据库拆分为表,并有助于:
Wikipedia 上有大量关于规范化的信息。
如果您有大量数据并且没有进行规范化,您最终将需要重新设计您的数据库,而这在事后很难做到,因为这不仅涉及更改任何访问数据库的代码,还将所有现有数据迁移到新设计中。
在某些情况下,出于性能原因避免标准化可能会更好,但在做出此决定之前,您应该对标准化有充分的了解。
【讨论】:
首先要问自己,你是在重复字段还是字段的属性。您的一张表是否包含应该分开的关系或属性。遵循第三范式...我们需要更多信息来提供帮助,但一般来说,一张有 36 列的表格闻起来像个屁。
【讨论】:
如果您想存储一百万行相同类型的行,那就去吧。任何体面的数据库都可以处理更大的表。
设计您的数据库以最适合数据(从您的应用程序中可以看出),启动它,然后再进行优化。您可能会发现性能不是问题。
【讨论】:
您应该根据要存储的数据对数据库进行建模。这称为“规范化”:本质上,每条信息只应存储一次,否则表格单元格应指向包含该值的另一行或表格。例如,如果您有一个包含电话号码的表格,并且一列包含区号,那么您可能会在同一列中拥有多个具有相同值的电话号码。一旦发生这种情况,您应该为区号设置一个新表,并通过引用存储所需区号的行的主键来链接到其条目。
所以不是
id | area code | number
---+-----------+---------
1 | 510 | 555-1234
2 | 510 | 555-1235
3 | 215 | 555-1236
4 | 215 | 555-1237
你会的
id | area code id | number | area code
---+---------- ---+----------+-----------
1 | 510 1 | 555-1234 | 1
2 | 215 2 | 555-1235 | 1
3 | 555-1236 | 2
4 | 555-1237 | 2
如果以这种方式组织数据,尤其是在处理字符串值或二进制数据时,相同值的出现次数越多,就越有可能节省内存并获得更快的性能。此外,如果区号发生变化,您只需更新单个单元格,而不必对整个表格执行更新操作。
试试这个tutorial。
【讨论】:
相关性并不意味着因果关系。
仅仅因为大量的列通常表明糟糕的设计,并不意味着大量的列是糟糕的设计。
如果您有一个规范化模型,您可以存储一个表所需的任意数量的列。
【讨论】:
视情况而定!
那一张表是否包含一个“实体”?即所有 36 列属性是单一的东西,还是有几个“东西”混合在一起?
如果混合,那么你应该规范化(分离成不同的实体,它们之间有关系)。你应该至少瞄准Third Normal Form (3NF)。
最佳做法是尽可能地标准化;如果您稍后发现性能问题,则尽可能少地进行非规范化。
【讨论】: