今後のスーパーヒーロー映画のリリースに関するインサイダー情報を収集していて、メインの映画テーブルが次のようになっているとします。
表1
Title Director Leading Male Leading Female Villain
--------------------------------------------------------------------------
Green Lantern Kubrick Robert Redford Miley Cyrus Hugh Grant
The Tick Mel Gibson Kevin Sorbo Linda Hunt Anthony Hopkins
これは一般的に非常にうまく機能し、非常に簡単なクエリと行間の比較を可能にするはずです。
ただし、各データファクトのソースと、ファクトを発見したジャーナリストの名前を追跡する必要があります。これは、次のようなEAVテーブルのようなものを示唆しているようです。
表2
Movie Attribute Value Source Journalist
----------------------------------------------------------------------------------
Green Lantern Director Kubrick CHUD Sarah
Green Lantern Leading Male Robert Redford CHUD James
Green Lantern Leading Female Miley Cyrus Dark Horizons James
Green Lantern Villain Hugh Grant CHUD Sarah
The Tick Director Mel Gibson Yahoo Cameron
...
これにより、必要なメタデータを簡単にキャプチャできますが、クエリが難しくなります。1つの映画のすべての基本データを取得するには、もう少し時間がかかります。より具体的には、ここで4つの行を処理して、グリーンランタンに関する4つの重要な情報を取得する必要がありますが、表1では、1つの適切にカプセル化された行です。
だから私の質問は、私が今説明した複雑さを考慮して、そして私は一般的にEAVテーブルが避けられるべきであることを知っているので、EAVはまだ最良の解決策ですか?このデータを表現する唯一の合理的な方法のようです。私が見る他の唯一の選択肢は、次のようなメタデータのみを格納する別のテーブルと組み合わせてテーブル1を使用することです。
表3
Movie Attribute Source Journalist
----------------------------------------------------------------------------------
Green Lantern Director CHUD Sarah
Green Lantern Leading Male CHUD James
Green Lantern Leading Female Dark Horizons James
Green Lantern Villain CHUD Sarah
The Tick Director Yahoo Cameron
...
ただし、これは非常に危険です。テーブル1の列名を「Villain」から「PrimaryVillain」に変更しても、テーブル3の行は単に「Villain」と表示されるため、残念ながら関連データが分離されます。これは、「属性」列がテーブル1の列の列挙として機能する別のテーブルにリンクされている場合に役立ちます。もちろん、DBAは、この列挙テーブルをテーブル1の実際の列と一致するように維持する責任があります。列挙テーブルを手動で作成する代わりに、テーブル1の列の名前を格納するSQL Serverのシステムビューを使用することで、これをさらに改善できる可能性があります。システムビュー。
何を指示してるんですか?EAVは行く唯一の方法ですか?
そして、それが1つのメタデータ列(「ジャーナリスト」なしの「ソース」のみ)であった場合はどうなりますか?それでもEAVルートに進む必要がありますか?「Director」、「Director_Source」、「Leading Male」、「Leading Male_Source」などの列を作成できますが、すぐに醜くなります。私が考えていないより良い解決策はありますか?
不明な点がありましたらコメントしてください。必要に応じて追加します。そうそう、私が使用した映画データは作成されています:)
編集:私の主な質問を簡潔に言い換えると、テーブル1のシンプルさと真のRDBMS設計が必要です。これは、安全でアクセス可能な方法で属性のメタデータを保存しながら、映画のエントリを実際によく説明しています。これは可能ですか?それともEAVが唯一の方法ですか?
編集2:さらにいくつかのWeb調査を行った後、メタデータを列に格納したいという願望を中心としたEAVに関する議論はまだ見つかりません。EAVを実装する主な理由は、ほとんどの場合、動的で予測不可能な列ですが、私の例ではそうではありません。私の例では、常に同じ4つの列があります。ディレクター、主要な男性、主要な女性、悪役です。ただし、各行の各列に関する特定の事実(ソースおよびジャーナリスト)を保存したいと思います。EAVはこれを容易にしますが、私はそれに頼ることを避けたいと思います。
アップデート
列の名前を「Movie」から「Name」に変更し、テーブル全体を「Movie」と呼ぶことを除いて、表2の設計を使用して、表1に戻るためのSQLServer2008のピボット操作を次に示します。
SELECT Name, [Director], [Leading Male], [Leading Female], [Villain]
FROM (Select Name, Attribute, Value FROM Movie) as src
PIVOT
(
Max(Value)
FOR Attribute IN ([Director], [Leading Male], [Leading Female], [Villain])
) AS PivotTable