相同的数据,两种不同的存储方式

时间:2009-07-27 19:27:05

标签: sql mysql database-design

下面的两个表都可以保存相同的数据 - 一整年,包括每个月的一些任意信息

table1 (one row = one month)
------
id
month
year
info


table2 (one row = one year)
------
id
year
jan_info
feb_info
mar_info
apr_info
may_info
jun_info
jul_info
aug_info
sep_info
oct_info
nov_info
dec_info

表A

  • 似乎更直观,因为月份是数字,但是
  • 全年数据的行数增加10倍。
  • 行数较小(列较少)

表B

  • 整年数据的行数减少10倍,但
  • 单行更大
  • 可能更难以在一个月内添加更多任意信息

在我设置的真实世界测试场景中,table1中有12,000行用于10年的数据,其中table2有150.我意识到越少越好,一般来说,但总是如此?如果我采取一种方式,我担心我会忽略一些后来发现的警告。我甚至没有考虑过磁盘使用情况或查询可能更快。 MySQL更喜欢什么?有“正确”的方式吗?还是有“更好”的方式?

感谢您的投入!

6 个答案:

答案 0 :(得分:6)

不要考虑如何存储它,考虑如何使用它。并考虑将来如何改变。存储结构应反映使用情况。

第一个选项在第二个选项中更加标准化,所以我倾向于选择它。它具有易于更改的优点,例如,如果每个月突然需要存储关于它的第二条信息。通常这种结构更容易填充,但并非总是如此。想想数据的来源。

如果您仅将此数据用于报告,并且不需要跨月汇总数据,请使用第二个选项。

这实际上取决于数据的来源和来源。但一般来说,第一种选择更好。

答案 1 :(得分:3)

12000行10年的数据?我说这个规模相当不错,因为12000行与一个不错的DBMS几乎没有任何关系。

您是如何使用数据库的?你确定你真的需要担心优化吗?

如果您需要存储特定于一个月的数据,那么您应该绝对存储每个月的行。与每个月有一个列的方法相比,这种方法更加清晰。

答案 2 :(得分:1)

  

“在我设置的真实世界测试场景中,table1中有12,000行用于10年的数据,其中table2有150行。”

如何?对于这种情况,一年中必须有80个月。

答案 3 :(得分:1)

由于这是一个优化问题,优化答案适用:取决于。

您想对数据做什么?

表A是存储此类数据的正常形式。

对于特殊情况,表B可能会派上用场,但我需要努力寻找一个好的例子。

所以要么选择A,要么给我们一些关于你想用数据做什么的细节。

关于磁盘空间的说明:除极大的表外,磁盘空间总量不是问题。如果在每个选择事项的所有磁盘空间中,并且在大多数情况下对于表A设计应该更少。

关于数学的注释:如果你将12000除以12并得到150,那就错了。

答案 4 :(得分:0)

您是如何使用这些数据的?如果你经常做一个按月拆分数据的报告,那么第二个更容易(并且可能更快但你需要自己测试)来查询。它不太正常化,但老实说,这是我们最后一次增加新的一个月的时间吗?

答案 5 :(得分:0)

总的来说,我会说每个月有一条记录作为更一般的解决方案。

一个重要问题是“信息”是否且逻辑上必须始终为单个字段。如果每个月确实存在多个数据,或者将来可能存在多个数据,那么将它们全部放在一个表中会成为一个重大的痛苦。

另一个问题是你将如何处理这些数据。你没有说“信息”是什么,所以仅仅为了讨论的目的,让我们假设它是“本月的销售额”。你会不会想说,“在几个月里我们的销售额超过了100万美元?” ?每月只有一条记录,这是一个简单的查询:“选择年份,销售月份,月份数量> 1000000”。现在尝试使用年表。 “选择年份,'Jan'来自year_sales,其中jan_sales> 1000000工会选择年份,'Feb'来自year_sales,其中feb_sales> 1000000工会选择年份,'Mar'来自year_sales,其中mar_sales> 1000000工会...”等等或者你可能' d喜欢“选择年份,jan_sales> 1000000然后'Jan = yes'其他'Jan = no',feb_sales> 1000000然后'Feb = yes'其他'2月=没有'...剩余月份... 。来自year_sales,其中jan_sales> 1000000或feb_sales> 1000000或mar_sales> 1000000 ...“Yuck。

拥有许多小记录并不比拥有更少但更大的记录更多的资源负担。是的,由于每个记录的开销,总磁盘空间要求肯定会更多,并且索引搜索会稍微慢一点,因为索引会更大。但差异可能很小,坦率地说,数据库性能有很多因素很难预测。

但我必须承认,我只是遇到了一个非常相似的问题而且走了另一条道路:我需要一周的每一天都有一套旗帜,上面写着“你今天工作了吗”。我是否要创建一个每天只有一条记录的单独表格,但我最终将七个字段放入一条记录中。我的想法是,如果没有设计上的一些根本改变,每天都不会有额外的数据,我没有理由只想看一天。这些日子用于计算时间表和分配截止日期,因此我无法想象,在本申请的上下文中,我想要说“给我所有在星期二工作的人”。但是,我可以很容易地想象在不同的​​应用程序中使用的相同数据正好用于该问题。