【问题标题】:Design for relation database with object structure对象结构关系数据库设计
【发布时间】:2017-10-08 21:12:50
【问题描述】:

我正在为我的应用程序设计数据库。我正在使用 PostgreSQL。它必须是通用应用程序,现实世界的结构如下所示:

类别(例如植被)---> 现象(例如树)---> 参数(例如类型 - 针叶树 vs. 针叶树)落叶,高度以米为单位 - 10 等等)

数据库可以存储大量的类别、现象、参数及其值。一类可以有N个现象,一种现象可以有N个参数。

所以我创建了这些表:

Category
--------
id
name


Phenomenon
----------
id
name
category FK (to Category)


Parameter
---------
phenomenon FK (to Phenomenon)
name
value <-- here is a problem

In value 列可以是字典中的值、varchar 值、数值或布尔值。如何设计参数表?我是否应该为不同类型的值创建更多列(varchar - 可以是没有完整性检查的字典值、数字、布尔值)。或者有没有考虑到这个问题的设计?我不想使用 JSON 或 XML。

非常感谢您的帮助。

【问题讨论】:

    标签: sql database postgresql database-design


    【解决方案1】:

    您的 Parameter 表是 EAV(实体-属性-值)表,不受关系模型支持。 RM 是一阶逻辑模型,要求每个属性都有一个域。

    在您的模型中,value 属性的域取决于name 属性的值。因此,它不是关系型的,但可以在 SQL 数据库中实现,尽管我尽可能避免使用这种模式,因为它使完整性约束变得难以实现并且使查询复杂化。

    在一阶模型中,每个不同的参数将处于单独的关系中,例如:

    PhenomenonHeight
    ----------------
    phenomenon FK (to Phenomenon)
    height
    
    PhenomenonType
    ----------------
    phenomenon FK (to Phenomenon)
    type
    

    等等。

    【讨论】:

    • 谢谢你的答案。但我不确定这个例子。每个参数都是单独的表?如果我需要添加新现象和新参数怎么办?我在 EAV 上找到了一些解决方案(我无法正确命名问题)。在幻灯片 16 的演示文稿中,他们有不同列的模型。这和你提供的一样吗?
    • 还发现了这个:inviqa.com/blog/eav-data-model 看起来很相似
    • 在关系模型中,您可以在不更改架构的情况下添加新现象和新类别,但您必须为每个新参数添加一个新表。这就是一阶模型的局限性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 2012-09-30
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2015-06-17
    相关资源
    最近更新 更多