数据建模:具有许多属性的表

时间:2012-10-26 16:21:03

标签: postgresql data-modeling hstore

我有一个名为Project的实体。每个项目都有一组成员分配给它。我从每个成员那里收集一些信息,例如:年龄,身高等。其中有些是数字型,有些是文字型,有些是逻辑型(布尔型)。有几十种信息可以收集。

这是我在特定项目中收集的信息,它定义了项目本身。在单个项目中,我曾经收集过几个,比如3-5个信息。在某些项目中,我可以收集相同或类似的信息集。我感兴趣的是,正在对所有项目进行统计,我收集了特定的信息。

问题是:包含这些信息的表的架构应该是什么?拥有一个包含数十个列的大表,每行中包含许多空值,听起来不太好,特别是因为我的数据库中有数千甚至数百万个。但是,每个项目(以及尽可能多的表,多个项目),我只收集信息,听起来也不好,因为从所有项目中获取统计信息需要使用动态SQL(变量表名称 - 取决于项目)并迭代数百个。每个选项都有一个表,甚至选项类型(逻辑,文本,布尔值)似乎都不是正确的方法。

我正在使用PostgreSQL数据库。我知道,有些数据库有类似ANYTYPE的东西(例如Microsoft SQL Server中的sql_variant,或Oracle中的ANYDATA),但PostgreSQL没有,这让我有点困惑。

我很确定有更好的解决方案,但我无法弄清楚。请你帮我找一下吗?

提前感谢每一个回复。

3 个答案:

答案 0 :(得分:4)

将您已经定义的所有属性以及哪些属性“常量”(并且对所有成员通用)放入表的实列中。对于任何动态的,您都可以使用hstore数据类型。

http://www.postgresql.org/docs/current/static/hstore.html

比Oracle的ANYDATA更好(更灵活,更快)

答案 1 :(得分:1)

根据所提供的信息,我可以理解,数据不是关系数据。我觉得你应该在这里查看NoSql选项。

答案 2 :(得分:1)

postgresql中内置了一个表继承功能,可以在表层次结构上运行查询。

在postgresql文档中查看therethere以获得一个好的教程。

这些解释了如何构建从一个表继承的表:父表中的所有字段都自动包含在子表中,并且在父表上运行的所有查询都在子表上运行(但不在对等表上运行,或者在子表上运行除非使用特殊关键字ALONE将查询(或子句可能)限定为限制为单个表,否则将连接兄弟表和结果。 您应该小心约束,因为它们不跨越表边界。换句话说,如果在父表上设置了约束,则它将仅限于该表,并且子表或兄弟表可能包含约束表中的行的副本。