表中的很多列

时间:2009-10-07 11:34:31

标签: database-design

我们架构中的表已经有100列。如果我们遵循水平数据存储方法,我们需要添加大约600列。如果我们进行垂直数据存储,这意味着创建新表并使用包含100列的表创建参照完整性,则加入表将会出现问题,因为具有100列的表具有5300万条记录,并且创建的新表将具有更多比起那个来说。哪种方法更好 在这种情况下。

我想在这里添加一个有趣的测试用例。我在我的表中添加了600列,已经有87列和5300万条记录。然后我尝试批量更新它

a>更新1000条记录的时间>> 2.10秒 b>更新10000条记录的时间>> 5.57秒 c>更新1000000条记录所花费的时间>> 5.42分钟 d>更新5300万条记录所需的时间>> 4. 5小时(表空间耗尽,我们需要扩展表空间)

有人可以建议更快的更新方法吗?

5 个答案:

答案 0 :(得分:2)

您需要问自己的问题:

  • 在我的大排中做大部分领域 有默认值还是空值?如果这 是这种情况,垂直架构可能是 更合适。
  • 当您查询时,您通常需要吗? 从a中检索所有字段 行,或做字段自然分类 分组?如果是这种情况,a 水平架构很可能,但是 你可能想要砍你的 主表分为子表,每个都有 一群自然的田野,一切都在 与主要人员保持1:1的关系 表

答案 1 :(得分:1)

编辑:这实际上是一个非常有趣的问题,我现在很好奇。我建议做一些现实世界的测试,一个大表与多个表,尽可能多的数据。值得付出额外的努力!请记住,即使关系数据库的设计很差,并且有数百万条记录(我在与承保公司签订合同时经历过这种情况,而不是在之后修复)并不容易。因此,您的单桌设计也可以起作用 - 测试中的证明。

5300万条记录?我希望您使用的是真正的关系数据库引擎,如MySQL / SQL,它们旨在处理大表。

单个表中的600多列对我来说听起来有点过分。我认为它不是一对多的记录结构,这就是为什么你选择一对一的方法?即便如此,根据您的数据而言,拥有单独的表可能更好。

答案 2 :(得分:1)

不冒犯任何人......我想知道您存储在100列中的数据是否超过5300万条记录的确是 normalized

如果没有,你真的应该开始这样做。你可能会减少很多行数(例如,它可能会分成三个1000和1000以及53个记录的表。我知道,它不是那么容易,只是为了表明理论上数字有多小是)。很可能在规范化之后仍有5300万个记录表,但这可能会保持很小,甚至可能只包含外键。通常,您永远不会需要所有数据。理想情况下,您可以对只有几千条记录的表执行许多查询。

如果你正常化,不要太害怕加入。最后,无论如何它会更快。确实有例外。

答案 3 :(得分:0)

高度取决于数据的性质及其使用方式。

将数据写入xml文档然后将文档存储在db ...

中可能是合适的

答案 4 :(得分:0)

您可以考虑使用面向列的数据库,看看HBase(http://hadoop.apache.org/hbase/),这是一个以Google大表格为模型的分布式,面向列的存储。