0

1 つのテーブル GreatPlaces を含む MySQL データベースがあります。このテーブルには 100 行あり、各行は、北京の紫禁城やエジプトのピラミッドなど、地球上のさまざまな歴史的に重要な場所を表しています。次の属性があります。

ID - integer, primary key
NAME - varchar, candidate key
COUNTRY - varchar, containing duplicities
CONTINENT - varchar, containing duplicies
TYPE - varchar, containing duplicities
LONGITUDE - decimal, containing duplicities (some historical sites are in the same city)
LATITUDE - decimal, containing duplicities (same as for an attribute LONGITUDE)
STORY_PATH - varchar, candidate key, an URL link to the file system
DESCRIPTION_PATH - varchar, candidate key, an URL link to the file system
PICTURES_PATH - varchar, candidate key, an URL link to the file system
VIDEO_PATH - varchar, candidate key, an URL link to the file system

テーブルは正規化されていますか? 1NF を満たすには、すべてのフィールドがアトミックである必要があります。唯一の問題は、属性 NAME の値である可能性があります。たとえば、「クフ王のピラミッドとスフィンクス」は文字列に分解される可能性がありますが、これで問題ないと思います(?)。次に、テーブルが 1NF にあり、すべての非プライム属性がすべての主キー全体に依存している場合、テーブルは 2NF にあることを読みました。問題は、どの属性が素数でないかを見つける方法がわからないことです。非プライム属性は、候補キーの作成に参加できない属性です。しかし、ここで、私の表では、すべての属性が ID と共に候補キーを作成できることがわかります。たとえば、{ID, LATITUDE} は候補キーを作成できます。

したがって、私の質問は、テーブルに非プライム属性がないという私の仮定が正しいかどうかです。次に、データベースは自動的に 2NF と 3NF になるはずです。これは正しいですか?

4

1 に答える 1

1

{ID, LATITUDE} の例はsuperkeyです。つまり、キーに重複が含まれていないという要件を満たしていますが、スーパーキーには、候補キーになるために最低限必要な列よりも多くの列が含まれています。別の言い方をすれば、どの候補キーもスーパーキーのサブセットです。 そうです、テーブルには非プライム列があります。

自動インクリメント列の使用は、テーブルを正規化するための魔法の方法ではありません。テーブルに非キー列に依存する列がある場合、3NF に失敗するテーブルがまだ存在する可能性があります。

たとえば、列 COUNTRY と CONTINENT は LONGITUDE/LATITUDE に依存しています。特定の行の NAME 値によっては、特定の緯度/経度がアイルランドにある場合もタイにある場合もあるとは言えません。したがって、候補キー以外のものに依存する非キー属性があります。


再コメント

正規化では、「A は B に依存する」または「B は機能的に A を決定する」は、「B の特定の値がわかっている場合、A の可能な値は 1 つだけである」ことを意味します。表記はB→Aです。

例は、(緯度、経度) → (国、大陸) です。座標を知っていれば、それがどの国にあるかを明確に知ることができます。つまり、座標は機能的に国を決定します。

3NF の定義では、B は候補キー全体でなければならず、A は非キー属性でなければなりません。この例では、B は (緯度、経度) で、A は (国、大陸) です。したがって、A は非キーで問題ありませんが、B は候補キーではなく、それが 3NF を破るものです。

この例では、可能性のあるすべての緯度と経度の組み合わせのルックアップ テーブルを設定し、それらをそれぞれの国にマッピングすることはおそらく現実的ではありません。厳密には 3NF に準拠していませんが、この場合は 3NF を破った方が効率的です。

誰かが間違いを犯す可能性があるため、注意が必要です。同一の緯度と経度のペアで 2 つの行を入力したにもかかわらず、誤って 2 つの異なる国に関連付けてしまう可能性があります。

于 2013-05-17T21:41:16.027 に答える