【问题标题】:Data modelling: Tables with many properties数据建模:具有许多属性的表
【发布时间】:2012-10-16 22:36:03
【问题描述】:

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

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

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

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

我很确定对此有更好的解决方案,但我想不通。请您帮我找找好吗?

提前感谢您的每一个回复。

【问题讨论】:

  • “数据库架构规划”?对我来说,这似乎是一个直截了当的数据建模问题。

标签: postgresql data-modeling hstore


【解决方案1】:

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

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

它比 Oracle 的 ANYDATA 更​​好(更灵活、更快)

【讨论】:

  • hstore 确实很有用,但它有什么问题:“键和值只是文本字符串”。如果我假设每个值都是 TEXT 类型,我可以创建表“Properties”,其中我将有“PropertyID”和“PropertyName”之类的对,然后创建表“Projects-Properties”,其中我将有列:“ProjectID”、“PropertyID”和“value”作为文本。但问题出在哪里:由于值是不同的数据类型,在范围查询(例如,在 1.54 和 2.36 之间)将字符串转换为十进制值会很慢,很麻烦。
  • @Krzysiek:这是动态数据模型的内在问题。
【解决方案2】:

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

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

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

【讨论】:

  • 明白你的意思,如果我能在每个项目中收集一些主要属性,并且项目类别定义我们在特定类型中收集的信息,那将是一件好事。但是由于每个项目都可以具有与其他项目完全不同的属性集,因此很难将它们组织成类似父子结构的结构,所以这个解决方案很好,但并不完全适合我的情况。
  • 你的意思是你的所有项目都没有一个共同的属性吗?
  • 这取决于该系统的用户,但如果没有,我总是可以创建类似人工的东西,但是......举个例子:项目1收集信息A,X,是;项目 2:A、X、Z;项目3:A,Y;项目4:A、Z;项目5:A、X、Y、Z。如何组织?我是否需要尽可能多的表格、尽可能多的属性组合?
  • 很大程度上取决于您打算如何使用它们
  • 你说你想对那些拥有共同属性的人进行查询,对吧?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多