2016-04-19 5 views
0

IDとテキストフィールドを含むルックアップテーブルを実装しました。私のテーブルは、異なるフィールド値のLookupIDのみで構成されます。たとえば...同じテーブル(ルックアップテーブル)でmutilple結合(10結合でも可)のためのSQL効率的なソリューション

  • TABLEID、StatusID、のTypeID、DocIDの
この

  • 1、2、3、4
  • ようになります

ルックアップテーブル

  • LookupID、テキスト

値は、この

  • 1のようになり、someValueの
  • 2、私の状態テキスト
  • 3、私のタイプのテキスト
  • 4、私の文書テキスト

私は、これは(IDの代わりに表示されたテキストとのデータのSQLビューを作成する)これらのテーブル上のクエリのための最も効率的なソリューション

SELECT T.TableID, L1.Text as StatusText, L2.Text as TypeText, L3.Text as DocText 
FROM Table T 
LEFT JOIN LookupTable L1 on L1.LookupID = T.StatusID 
LEFT JOIN LookupTable L2 on L2.LookupID = T.TypeID 
LEFT JOIN LookupTable L3 on L3.LookupID = T.DocID 

があるされているかどうかを知る...またはサブクエリを行う必要がありますこのソリューションの方が効果的ですか?このようなもの。

SELECT T.TableID, 
    (SELECT L.Text FROM LookupTable L WHERE L.LookupID = T.StatusID) as StatusText, 
    (SELECT L.Text FROM LookupTable L WHERE L.LookupID = T.TypeID) as TypeText, 
    (SELECT L.Text FROM LookupTable L WHERE L.LookupID = T.DocID) as DocText 
FROM Table T 

...またはもっと良い解決策がありますか?この例では3回しか参加していないので、10回以上参加する必要があります。

+1

仮説的な状況しか提示していないときに、最良の解決策が何であるかについてコメントするのはかなり難しいです。いずれにしても、単一の「LookupTable」を使用するという考えは、本当に**悪い考えです。 'JOIN'も、あなたが持っているサブクエリのアプローチよりも常に優れています。それを超えるとコメントするのは難しいです。デザインは臭いテストに合格しませんが、それが「テーブル」や「SomeValue」などのときは言いません。 –

+0

入力した2つのクエリのパフォーマンスをテストしましたか?相関サブクエリがより優れたパフォーマンスを発揮するケースがありました。 – trincot

+0

私はMasterXrefテーブルをアプリケーションの中で一回構築しましたが、それはそのシステムの寿命のために残念です。それは、あなたが何度も何度も同じテーブルに何度も何度も何度も何度も質問を重ねてきたときに、うまくやっていくのが凄かったです。私は決してそれをもう一度やりません。 –

答えて

1

データベース内の別々のエンティティごとに個別のルックアップテーブルを作成することをお勧めします。単一ルックアップタイプに追加の属性を追加する必要がある場合は、将来の柔軟性が向上します(たとえば、各状態の状態の鳥を追跡する必要がありますが、車種には関係ありません)。私の経験では、 "ジェネリック"データベース設計パターンは通常悪くなります。目的を持ったデザイン。

あなたは限り、あなたが持っているように、複数のJOIN sの適切なインデックスは、ほとんど常に(常にではない場合)サブクエリよりも良好に機能します、というたら:

SELECT 
    P.person_id, 
    S.state_name, 
    G.movie_genre_name, 
    ... 
FROM 
    Person P 
INNER JOIN [State] S ON S.state_id = P.home_state_id 
INNER JOIN Movie_Genre G ON G.movie_genre_id = P.favorite_movie_genre_id 
... 

また、あることに注意して内のすべてのリストを保持あなたのシステムはルックアップテーブルである必要はありません。性別のようなもの、例えば、CHECK CONSTRAINTを通じて簡単に維持することができます。

gender VARCHAR(15) NULL CONSTRAINT CHK_Person_Gender CHECK (gender IN ('Male', 'Female', 'Transgender')) 

か:

severity VARCHAR(10) NOT NULL CONSTRAINT CHK_Ticket_Severity CHECK (severity IN ('High', 'Medium', 'Low')) 

これは、基本的には名前だけですリストに関連しています。時間の経過とともに頻繁に変更される追加の属性またはリストを持つ項目を持つリストは、テーブルに入れてください。

0

UNPIVOTを使って調べたことがありますか?

+0

私はしていません。私はそれを徹底的に調べます。 –