2017-11-13 6 views
0

使用されている例は、私が実際に解決しようとしているドメインではありません。それはちょうど例です。DBデザイン:テーブルの継承と階層

背景

私はtable inheritanceを定義しています。テーブルAPIパッケージ&ビューを使用して、必要なロジックを処理します。&プレゼンテーション

異種の属性を持つ複数の階層レベルの階層も定義する必要があります。

テーブル継承(場所>州、市)&階層(状態< - 市)を組み合わせることは、設計上の問題を抱えています。私は都市の名前を強制する一意のキーを定義したい

問題

は州内で一意であるが、[名前]フィールドの抽象化は、それを妨げています。必要に応じてPL/SQLで処理することができますが、可能であればSQLレベル(理想的には追加テーブルなし)で実行したいと思います。

制約

他のテーブルを総称階層(位置)の任意のレベルを参照できるようにする必要があります。

他のテーブルでも、階層の特定のレベルを参照できる必要があります。私は原因の関係のグラフの複雑さにsingle table inheritanceを行うことはできません

思考。

簡単に名前欄を複製することを考えましたが、通常のフォームに違反することはありません。

CREATE TABLE location 
(id  NUMBER ( 38) PRIMARY KEY 
, name VARCHAR2(1000) NOT NULL 
, type_id NUMBER ( 38) NOT NULL 
--, other common/super attributes 
); 

CREATE TABLE state 
(id NUMBER(38) PRIMARY KEY 
       REFERENCES location (id) 
--, child attributes 
); 

CREATE TABLE city 
(id  NUMBER(38) PRIMARY KEY 
         REFERENCES location (id) 
, state_id NUMBER(38) NOT NULL 
         REFERENCES state (id) 
--, child attributes 
); 
+0

ウィスコンシンには6つのスプリングフィールドがあります。テキサカーナはテキサス州とアーカンソー州の両方にあります –

+0

州/都市は私の実際の問題のドメインではありません。私は例として使っているだけなので、重複した都市名の現実は懸念されません。 –

答えて

0

私は一意である都市と州名を必要とする理由を知る(したがって、関連するテーブルでそれらを保持)していない任意の正規形に違反します。都市名は州名 "New York" city!= "New York"州と同じ属性ではありません。

+0

明確化する:ニューヨーク州にはニューヨーク州と呼ばれる2つの都市があり、ニューヨーク州には州と市がそれぞれ存在することもありますが、同じ州にニューヨークという2つの都市は存在できません。 –

0

ロケーションテーブルに「parent_location」を追加すると、おそらく機能します。

CREATE TABLE location 
(id  NUMBER ( 38) PRIMARY KEY 
, name VARCHAR2(1000) NOT NULL 
, type_id NUMBER ( 38) NOT NULL 
, parent_location_id number(38) NOT NULL 
--, other common/super attributes 
); 

CREATE UNIQUE INDEX location_u2 
    ON location (parent_location_id, name); 

CREATE TABLE city 
(id  NUMBER(38) PRIMARY KEY 
         REFERENCES location (id) 
, --state_id gone away 
--, child attributes 
); 

また、同じ名前の2つの状態が存在しないようにします。

欠点は、トップノードにダミーの "0"のlocation_idを使用する必要があることです。

よろしくお願いいたします。

+0

これは重複状態を防止しますが、重複した都市が状態内にあることを防ぎません。ソリューションは、階層のどのレベルにも適用可能でなければなりません。 –

+0

こんにちはピーター、 は、あなたが、二つの状態を持っているとしましょう: id名は、 1. parent_location_idオレゴン0 2.カリフォルニア0 今、あなたが街を入力します。 3.ポートランド1 あなたが別の都市に入ることができなくなります一意の制約に違反するため、name = "Portland"およびparent_location_id = 1を使用します。 – Guish

+0

合意。だからこそ私は "一意のキー実施名は州内でユニークです"ので、state_idとnameの両方が必要です。私の質問は、テーブルを再編成して2つのフィールドに一意の制約を定義できるようにする戦略を中心にしています。 –

関連する問題