2017-10-08 67 views
1

我正在为我的应用程序设计数据库。我正在使用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。

我很感激任何帮助。

回答

2

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

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

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

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

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

等。

+0

Thx为答案。但我不确定这个例子。每个参数都是单独的表格?如果我需要添加新现象和新参数怎么办?我发现了一些关于EAV的解决方案(我无法正确指出问题)。在幻灯片16的演示中,他们的模型具有不同的列。这与你提供的一样吗? – Bulva

+0

还发现它:https://inviqa.com/blog/eav-data-model看起来非常相似 – Bulva

+0

在关系模型中,您可以添加新现象和新类别而不更改模式,但是您必须添加新每个新参数的表格。这就是一阶模型的局限性。 – reaanb