2017-10-08 6 views
1

私のアプリケーションのデータベースを設計しています。私はPostgreSQLを使用しています。それはこのようになり、一般的なアプリと現実の世界の構造である必要があります:オブジェクト構造を持つリレーションデータベースの設計

カテゴリー(例えば植物)--->現象(例えば木)--->パラメータ(例えばタイプ - 針葉樹対落葉、高さ(メートル単位) - 10など)

データベースには、多くのカテゴリ、現象、パラメータ、およびその値を格納できます。 1つのカテゴリーはN個の現象を有することができ、1つの現象は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

関連する問題