1

私は、いくつかの DB データを正規化する任務を負っています。99% は問題ありませんが、問題が発生しました。

それは私の問題領域ではありませんが、類似の領域は本の領域です。書籍の詳細と、ベンダーの Web サイトでの書籍の表示方法を記録する必要があると想像してください (おそらく価格比較エンジン用)。

ベンダー A、B、および C では、各書籍が 1 つの数値識別子 (ベンダーごとに異なります) で表されますが、ベンダー D では、毎年リリースが 1 から始まるため、出版年も必要です。

A、B、および C のみを処理する必要がある場合は、書籍のマスター テーブルと、マスター書籍 ID をベンダー固有の ID にマッピングするルックアップ テーブルが必要です。しかし、ベンダー D はこれを破ります。たとえば、vendorID,vendorCode を一意のキーにすることはできません。これは、D の場合、vendorcode を再利用できるためです (コード 1 は毎年異なるエントリを持つことになります....)。

1 つの答えは、D のベンダー コードを結合変数にすることです。そのため、ID 123、年 = 2013 の場合は「123,2013」となり、ルックアップ コードでは次のようになります。

if(vendor = D){
...split the code in two and format the search request accordingly...
}

しかし、それは少し...ハッキーなようです。

DB正規化の微妙なトリックが欠けていますか? それとも、現実世界が必ずしもうまく正常化するとは限らないことを受け入れる必要がありますか?

4

1 に答える 1

0

あなたのシナリオは、データ ウェアハウスやレガシー システムでよくあること、つまり複数のシステムから主キーをマッピングすることに似ています。スペクトルの両端は次のようになります。(ベンダー Dの実際のキーには年が含まれている必要があることは明らかです。)

One end of the spectrum
our_key  vendor_a  vendor_b  vendor_c  vendor_d_yr  vendor_d_num
--
1001     32        43        1856      2013         1
1002     143       887       2924      2013         2

その種のテーブルには、(これまでのところ) 5 つの候補キーがあります。

  • 私たちの鍵
  • vendor_a
  • vendor_b
  • vendor_c
  • vendor_d_yr、vendor_d_num

ベンダー「D」に複合型を使用することは、dbms が複合型のユーザー定義型をサポートしている場合に意味があります。

The other end of the spectrum
our_key  vendor  vendor_key
--
1001     A       32        
1001     B       43
1001     C       1856
1001     D       2013-1
1002     A       143
1002     B       887
1002     C       2924
1002     D       2013-2

このテーブルには、単一の候補キーがあります: {our_key, vendor, vendor_key}。スペクトルのこの端は、本質的に EAV 構造です。

選択をする

実用的であれば、私は最初の構造を好みます。これにより、高レベルの制約チェックが可能になります。各列は異なるデータ型にすることができ (多くの場合そうです)、列レベルの制約を適用して理解するのは簡単です。複合型を 1 つの列に押し込む必要はなく、SELECT ステートメントでその列を解析する必要もありません。

ただし、不確定な数のベンダーをサポートする必要がある場合、それは現実的ではありません。すべての dbms には、ベース テーブルで宣言できる列数のハード リミットまたはソフト リミットがあります。

ただし、EAV 構造には、アプリケーションによっては目立たない欠点があります。たとえば、「our_key」のすべての値が最初の構造のすべてのベンダーのキーにマップされることを保証するのは簡単です。EAV構造でそれを行うことは事実上不可能です。

EAV では、複合型を 1 つの列に押し込み、その列を SELECT ステートメントで解析する必要もあります。

于 2013-05-29T23:04:53.547 に答える