1

OK、2つのテーブルがあります。主キーbook_idとtitleという別のフィールドを持つブックテーブル。また、主キーauthor_idとフィールドfirst_name、last_nameおよび外部キーbook_idを持つ作成者テーブル。

私のデザインは2NFに準拠していますか?

4

2 に答える 2

3

一般的に(そして素人の言葉で)、レベル1での正規化は次のことを意味します。

  • 行が重複する可能性はありません。
  • 行または列に固有の順序はありません。
  • 各「セル」には、1つの情報のみが含まれます。

2NFの場合、すべての列がキー全体に依存するという追加の制約があります(直接または別の非キー列を介して間接的に)。

したがって、この場合は1NFの基準を満たし、本は著者に依存するため、2NFに準拠していると言えます。

ただし、特に原則として常に3NFから開始する必要があるため、必ずしも優れた設計であるとは限りません。より良い解決策は本格的なものです:

books:
    book_id
    title
authors:
    author_id
    name
books_and_authors:
    book_id
    author_id

そうすれば、本と著者の間に多対多(ゼロを含む)の関係ができます。

于 2012-05-15T08:16:01.947 に答える
1

テーブルが2NFにあるのは、それが1NFにあり、非プライム属性がテーブルの候補キーの適切なサブセットに依存していない場合のみです(ウィキペディアから)。

私はあなたのテーブルが1NFにあると仮定しなければなりません。
候補(およびプライマリ)キーはbook_idとauthor_idです。

非プライム属性は、titlefirst_namelast_nameです。これらの属性はいずれも、候補キーの適切なサブセットに依存しません(サブセットがないため、簡単に実現できます)。この設計の唯一の問題は、外部キーbook_idによってbook-authorが1:1の関係になることです(つまり、1冊の本->1人の著者。1人の著者->1冊の本)。これは、 book_idauthor_idを保持する新しいテーブルで簡単に修正できます。

1NF(ウィキペディアも):

  • 行に上から下への順序はありません。
  • 列の左から右への順序はありません。
  • 重複する行はありません
  • すべての行と列の共通部分には、該当するドメインからの値が1つだけ含まれています(他には何も含まれていません)。
  • すべての列は通常です[つまり、行には行ID、オブジェクトID、非表示のタイムスタンプなどの非表示のコンポーネントはありません]。

これが、リレーショナルデータベースを構築するために使用される方法です。

于 2012-05-15T08:21:29.057 に答える