2017-10-08 152 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