这里有几点需要考虑:
- 属性列表是否随时间显着变化
- 属性列表是否需要自定义用户定义属性
- 不同学校是否有不同的属性(即许多属性只适用于一所或几所学校)?
如果其中任何一个是正确的,您可能会考虑使用属性存储方法,例如 EAV、hstore、json 字段、xml 字段等。
如果没有——如果你有一个相当静态的属性列表,其中大多数属性对大多数行有意义——那么将它们作为 60 个单独的列并没有真正的问题。为通常搜索的属性集添加索引会更容易,包括部分索引和复合索引等,并且搜索 - 特别是针对许多不同属性的搜索 - 会更快。
另请参阅:数据库设计 - 我应该使用 30 列还是 1 列来包含 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
这也foreign key
意味着您与另一个表具有强制的 1:1(可选)关系。如果您有一些属性的逻辑分组可以聚集到边表中,这种方法会很有用。
如果多一点思考并没有揭示对正常化有意义的事情,我也会感到惊讶。你有year7_blah
, year8_blah
, year9_blah
etc 列吗?如果是这样:标准化的绝佳候选者。