2017-10-25 8 views
0

データベースの一部のテーブルの設計に問題があります。問題は:実際に、私は、それぞれIDが1、2及び3と、3つのレベルを有するデータベース設計の変更

Level 
    Id (PK) 
    Name 

Union 
    Id (PK) 
    LevelId (FK) 
    CityId (FK) 
    PostalCodeId (FK) 
    CountryId (FK) 

I 2つのテーブルを有します。そして、ユニオンテーブルでは、1レベルのFKマークを1つしか持てません。たとえば、Level 1のLevelは常にCityに関連付けられているため、LevelIdフィールドには1が入力され、CityIdには対応する識別子が格納されます(他のフィールドはnullになります)。 LevelId 2とPostalCodeId(その他のフィールドはnull)、LevelId 3とCountryId。

今、私はCityIdとPostalCodeIdを同時に参照したいと思いますが、それらはレベルが異なります(レベルテーブルは変更してはいけません、beacuseはマスターです)。

この問題を解決するにはどうすればよいと思いますか?私は2つのソリューションを考えました:

1)エンベロープテーブルのLevel列を削除し、塗りつぶされたパラメータの数をバックエンドで制御します。しかし、Unionの列数(FK)が増えれば、それほど多くの条件を制御する必要があります。そしておそらくそれは非効率的になるでしょう。

2) "新しいレベル"を表すIDで別のレベルを作成します。私は実際のところ、実際のレベルは3つしかないので、最良の解決策ではないと思います。もう1つはレベルのミックスであり、マスターはマスターではありません。

もっと良い解決策があるかどうかわかりませんが、そうでない場合は、これを実行する最良の方法は何ですか。

ありがとうございます。

+0

ここで何をしようとしているのか分かりません。擬似コードの代わりにテーブルの実際のddlを投稿できますか?私にとっては何かがここから少し離れているようですが、私はそれを解決するのに十分なほどよく問題を理解していません。 –

+0

テーブルUNIONを呼び出すことはひどい考えです。 –

+0

あなたのテーブルは、あなたがモデリングしているビジネス/システムの本当の「もの」を表すものとします。その情報を十分に理解していなければ、誰も安全に提案を提供することはできません。あなたは1つの推測をしています - それは役に立つかもしれません。これは間違ったアプローチであると言えます。やり直してください。助けが必要な場合は、モデルとそれが表すものとその使用方法について話し合います。 – SMor

答えて

1

あなたの問題はコンセプトを混在させることです。そのため、リレーショナルデータベースのACID仕様にはA(アトミック性)がありません。

都市、郵便番号、国ごとに別のテーブルを作成する必要があります。あなたが望むのであれば、関連しているように、郵便番号が属する都市を参照することができます。したがって、都市が属する国も参照できます。

レベル(ID、氏名)(ID、level_id(FK)、名)

市(同上、level_id(FK)、COUNTRY_ID

国:

すべてのIDフィールドは主キーです(FK)、名)

郵便番号(ID、level_id(FK)、CITY_ID(FK)、名)

それはいくつかの海に役立ちます場合は、郵便番号テーブル内でもCOUNTRY_IDを追加することができますあなたはFKのcity_idとcountry_idを内部に持っているので、それは冗長です。

あなたの質問の解決に役立つかどうか不明な場合は、詳細が必要な場合は完全な例(各表のサンプルデータ)を含めてください。

EDIT: それはあなたのために良いでしょう場合にも同じことを行うために自己参照テーブルを構築することができます

union_table

イドレベルCOUNTRY_IDのCITY_ID名

1 3 0 0イギリス

2 2 0 0ロンドン

3 1 2 2 YX-223

country_idはunion_table.Idを参照し、city_idはunion_table.Idも参照します。レベルでは、郵便番号(1)、都市(2)、国(3)のいずれであるかを判断します。 country_idとcity_idはいずれも外部キーではありませんが、索引付けする必要があります。