【问题标题】:Normalize or not - one to many or lots of columns规范化与否 - 一对多或多列
【发布时间】:2016-07-20 11:50:21
【问题描述】:

我无法决定是规范化还是非规范化这部分数据库:

我有一个在给定样本点存在或不存在的约 50 个物种的列表。这 50 个将来可能会扩大到 75 个,但不会更多。该数据库的主要目的是生成报告。因此,如果给定区域有 10 个站点,一个平均问题将是:我们在其中多少个站点中检测到了物种 a?

我应该创建 50 t/f 位列吗:

网站,a,b,c,d,e...n

1, t, f, t, f ,t ,t ....

2,f,t,t,f,t,f.....

或者我应该创建一个一对多的表:

1个

1c ...

2b

2 c ...

我知道趋势是规范化,70 列可能会让其他用户望而生畏,但我真的很喜欢从非规范化版本中提取数据的想法。在这种情况下真的更好吗?

【问题讨论】:

  • 50 - 75 列的版本未进行非规范化。您规范化数据,而不是数据的表示(布尔值)。将每个样本/物种放在单独的行上的唯一好处是您不必创建错误的行。如果样本中平均只有 5 个物种,则只有 5 行,而不是 50 行。如果样本中平均有 45 个物种,则没有优势。
  • 我会选择第二种选择(多对多表),因为它会简化聚合函数的使用,例如如果您想计算每个站点记录了多少物种。

标签: database database-design normalization denormalization


【解决方案1】:

50列解决方案的优势:

  • 访问给定样本点上的所有物种将是高效的。

一对多解决方案的优势:

  • 无需重新设计数据库即可增加物种数量,只需输入包含物种 ID 的新记录即可。

  • 访问包含给定物种的所有样本点将比 50 列设计更容易。

从事行业数十年,我通常对“将来可能扩展到 75 个,但不会更多”之类的要求持谨慎态度。但是,如果物种的增加不是太频繁,并且在这种情况下你有时间停止你的应用程序并重新组织你的表,那么这个论点就不是太强烈了。但是,我也会警惕仅按物种查询数据的限制。在许多情况下,最终会出现对相反方向的需求。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 2018-03-24
    相关资源
    最近更新 更多