具有太多列的表的缺点

时间:2013-07-27 19:44:35

标签: postgresql database-design

我有一些数据需要放在PostgreSQL数据库中。这些数据与学校有关。因此,学校有很多属性,主要是小整数,花车或小文本。并且所有数据每年都在变化。所以我正在创建一个名为YearlyData的实体并将属性放在那里。但事实是,属性的​​数量大约是50-60。现在这些都不能正常化,因为它们是学校本身的明显属性。所以我在道德上不能将它们分成表格。但我不确定这是否会损害我的表现。

我可以尝试对这些数据进行分类,并将它们放在单独的表中,并从YearlyData表中指向它们。但是我猜测,然后尝试用20-30 +参数搜索学校会导致疯狂的连接数量。我也不确定这是否会损害我的表现。

有专家意见吗?

2 个答案:

答案 0 :(得分:2)

PostgreSQL将行存储在大小为8kb的所谓数据页上。您可以将这些视为具有有限大小限制的存储桶。宽行的缺点是数据库可以在数据页上放置更少的行。数据库引擎从一个页面带回1,000行比将多行分散到多个页面上的1000行更快。在这种情况下,一个读取对1,000与磁盘IO是你的敌人。这是需要注意的,不要避免。通常需要宽表,您可以忍受开销。在您的情况下,您将大致每行使用240个字节(每个整数4个字节* 60行)。

答案 1 :(得分:2)

这里有几点需要考虑:

  • 属性列表是否随时间发生重大变化
  • 属性列表是否需要自定义用户定义属性
  • 不同学校是否有不同的属性(即很多属性只适用于一所或几所学校)?

如果其中任何一个属实,您可能会考虑属性存储方法like EAV, hstore, json fields, xml fields, etc

如果没有 - 如果你有一个相当静态的属性列表,其中大多数属性对大多数行都有意义 - 那么将它们作为60个单独的列实际上并不存在问题。为常用搜索属性集添加索引会更容易,包括部分和复合索引等,搜索 - 特别是那些针对许多不同属性的搜索 - 将更快

另请参阅:Database design - should I use 30 columns or 1 column with all data in form of JSON/XML?

还有一个折衷选项可供您使用:一个主表,用于查找大量最重要的详细信息,以及用于属性逻辑分组的边表。说:

yearly_summary (
    yearly_summary_id serial primary key,
    school_id integer,
    total_students integer,
    ...
) 

yearly_student_stats(
    yearly_summary_id integer primary key references yearly_summary(yearly_summy_id) on delete cascade,
    ...
)

等。同样为integer primary key的{​​{1}}表示您与另一个表具有强制执行的1:1(可选)关系。如果您有一些属性的逻辑分组可以集群到边表中,则此方法非常有用。

如果更多的想法没有揭示有意义的事情,我也会感到惊讶。您有foreign keyyear7_blahyear8_blah等列吗?如果是这样:很好的候选人正常化。