私はノーマライズ陣営にいます。
開始するためのいくつかのヒントを次に示します。
各「人」に任意の一意の識別子を割り当てるプロセスから始めます。PersonId
これを 、またはそのようなものと呼びます。この識別子は代理キーと呼ばれます。代理キーの唯一の目的は、代理キーと現実世界の実在の人物との間の 1 対 1 の関係を保証することです。他の属性の値をデータベース内の「人」に関連付けるときは、代理キーを使用します。
データベースのレイアウトを開発するにつれて、他の属性にも代理キーが必要 (または少なくとも有用) であることがわかる場合があります。
管理する各属性を確認します。次の質問をしてください。この属性の値が 1 つしかない人はいますか?
たとえば、各人には「生年月日」が 1 つだけあります。しかし、どうして「趣味」を持つことができるのでしょうか。おそらくゼロから多数。単一の値の属性 (生年月日、身長、体重など) はPersonId
、キーとして共通テーブルに入る候補です。この時点では、各テーブルの属性の数は気にする必要はありません。
ホビーなどの多値属性は、少し異なる処理が必要です。多値属性ごとに個別のテーブルを作成したい場合があります。Hobbies を例として使用すると、次のテーブルを作成できますPersonHobby(PersonId, Hobby)
。この表の行は次のようになります(123, "Stamp Collecting")
。このようにして、1 行に 1 つずつ、各人に必要な数の趣味を記録できます。「興味」「スキル」などについても同様です。
組み合わせによって他に何も決定されない多数の多値属性があるPersonId + Hobby
場合 (つまり、この「趣味」、「興味」、または「スキル」を行っているこの人物について記録する興味深いものが何もない場合)、ひとまとめにすることができます。のような構造を持つ属性値テーブルにそれらを変換しますPersonAV(PersonId, AttributeName, Value)
。行は次のようになります(123, "Hobby", "Stamp Collecting")
。
AttributeName
この方法を使用する場合は、テーブル内のPersonAV
を代理キーに置き換え、別のテーブルを作成してこのキーをその説明に関連付けることもお勧めします。次のようなもの: Attribute(AttributeId, AttributeName)
. この表の行は次のよう
(1, "Hobby")
になり、対応するPersonAV
行は次のようになります(123, 1, "Stamp Collecting")
。これはAttributeNames
、データベース/アプリケーションで有効なものを知る必要がある場合に、それらを検索する場所を確保するために一般的に行われます。「興味」が有効な値であるかどうかを検証する方法を考えてみてください。
AttributeName
誰かがそれを持っていることを記録していない場合、データベースAttributeName
にはその記録がありAttributeName
ません。それが存在するかどうかをどのように判断しますか? よくAttribute
表に出して見てください!
一部の属性には複数の関係がある場合があり、それもテーブルの正規化方法に影響します。あなたの例ではこれらの依存関係は見当たりませんでしたので、次のことを考慮PartId
しWeightClass
てStockCount
くださいShipCost
。これは、次のようなテーブルを示唆していますPart(PartId, WeightClass, StockCount, ShipCost)
。ただし、非キー属性間に関係が存在する場合は、除外する必要があります。たとえば、 がWeightClass
を直接決定するとしShipCost
ます。これは、単独で決定するにWeightClass
は十分であり、表から除外する必要があることを意味します。ShipCost
ShipCost
Part
正規化はかなり微妙な芸術です。適切に行うには、データ モデル内のすべての属性間に存在する機能の依存関係を特定する必要があります。機能の依存関係を考え出すだけでも、かなりの熟考と考慮が必要ですが、適切なデータベース設計に到達するためには重要です。
データベースを構築する前に、時間をかけて正規化についてもう少し勉強することをお勧めします。ここで過ごした数日は、後々元が取れるほどの価値があります。「機能依存性」、「正規化」、「データベース設計」を Google/Wikipedia で検索してみてください。読んで、調べて、学んでから、正しく構築してください。
データベース設計の正規化に関して私が行った提案は、取るべき方向性に関するヒントにすぎません。アプリケーションで管理しようとしているすべてのデータを十分に把握していない場合は、ここでのアドバイスを「一粒の塩」で受け取る必要があります。