-
モデルがカラーグループを共有しない場合、デザインは1つのテーブルになります:
model [model] comes in color [color]
-
モデルがカラーグループを共有する場合は、2つのテーブルがあります:
model [model] comes in the colors of group [group] group [group] has color [color]
これらのテーブルは、最初のテーブルへの投影と結合します:
SELECT model, color FROM model_group NATURAL JOIN group_color
-
モデルに、グループに加えて、またはグループの代わりに、例外的な使用可能な色および/または使用できない色を含めることができる場合は、例外テーブルを用意します。テーブルのグループがデフォルトになりました 色(ある場合):
model [model] has default color group [group] group [group] has color [color] model [model] is exceptionally available in color [color] model [model] is exceptionally unavailable in color [color]
次に、例外テーブルは、JOIN-plus-PROJECT / SELECTとそれぞれUNIONされ、MINUSED / EXCEPTEDされて、最初のテーブルになります。
SELECT group, color FROM model_default NATURAL JOIN group_colour EXCEPT SELECT * FROM model_unavailable UNION SELECT * FROM model_available
「冗長性」とは、複数の場所に値が表示されることではありません。これは、アプリケーションについて同じことを示す複数の行に関するものです。
すべてのテーブル(およびクエリ式)には、(named-)blanksステートメントテンプレート(述語)が関連付けられています。真のステートメントを作成する行はテーブルに配置されます。 2つの独立した述語がある場合は、2つのテーブルが必要です。関連する値は、それぞれの行に表示されます。
アプリケーションに関するステートメントを作成する行については、こちらを参照してください。 (そして、テーブルの「ステートメント」または「基準」について他の回答を検索してください。)正規化は、行が「... AND ...」の形式のものを示すテーブルを、「...」を示す他のテーブルに置き換えるために役立ちます。 " 別々に。これとこれを見てください。
グループを共有し、モデルと色に1つの2列のテーブルのみを使用する場合、その述語は次のとおりです。
FOR SOME group
model [model] comes in the colors of group [group]
AND group [group] has color [color]
したがって、2番目の箇条書きは、この述語から単一の「AND」、つまり「多値従属性」のソースを削除します。それ以外の場合、モデルのグループまたはグループの色を変更する場合は、複数の行を同時に一貫して変更する必要があります。 (重要なのは、スペースを節約するのではなく、冗長性によるエラーと複雑さを軽減することです。)
文字列を繰り返したくない場合 実装(依存)の理由(より多くの結合を犠牲にして必要なスペースまたは操作の速度)のために、名前IDと文字列のテーブルを追加し、古い名前の列と値をid列と値に置き換えます。 (これは正規化ではなく、実装に依存するデータ最適化のトレードオフのためにスキーマを複雑にします。デモンストレーションする必要があります。 これは必要であり、機能します。)