使用对象结构

时间:2017-10-08 21:12:50

标签: sql database postgresql database-design

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

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

数据库可以存储许多类别,现象,参数及其值。一个类别可以有N个现象,一个现象可以有N个参数。

所以我创建了这些表:

Category
--------
id
name


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


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

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

我真的很感激任何帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

等等。