質問: DB設計の質問です。 あるwebサイトのシステムでニックネーム(主キー:他ユーザと重複不可)とメール(重複不可)、姓、名、電話番号、住所登録が必須だとします。 主キーでないメールも重複しないので他の各項目はメールに依存することになり、 第3正規化をすれば a)ニックネーム, メール b)メール, 姓 c)メール, 名 d)メール, 電話番号 e)メール, 住所 の5つのテーブルができます。 ここで、 1)これは第3正規化として正しいのか、正しくないならばなぜか(質問自体に既に間違いがある?) 2)正しいなら実際にこのような正規化が行われることがあるのか 教えてください。 尚この例は主キー以外に値が重複しない項目の例としてあげたもので「ニックネームを主キーにすべきでない」などテーブル設計の良し悪しは目をつぶってください。 よろしくお願いします。
回答: 第3正規化によって a)ニックネーム、メール、個人ID b)個人ID、姓、名、電話番号、住所登録 とすることはあるけれど より単純に a)ニックネーム、メール、姓、名、電話番号、住所登録 とする事のほうが多い。 どちらを採用すべきかは、テーブルを複数に分ける(分けない)ことによって テーブルへのアクセス(追加、参照、修正、削除)を いかに、より単純に出来るかどうかを考えると良いでしょう。 それはさておき、 姓と名で分けるというのは他に表現が浮かばなかったのだと思いますけど 例えば、 複数の趣味を登録可能にしたいというような場合であれば a)ニックネーム、メール、姓、名、電話番号、住所登録 b)メール、趣味コード c)趣味コード、趣味 などと分ける事は考えられますね。 趣味を3つまでに限定するなら a)ニックネーム、メール、姓、名、電話番号、住所登録、趣味コード1、趣味コード2、趣味コード3 b)趣味コード、趣味 なども考えられますよね。 もっとシンプルに a)ニックネーム、メール、姓、名、電話番号、住所登録、趣味、趣味、趣味 としても良いかもしれません。 どれを採用すべきかは、繰り返しになりますが「テーブルを複数に分ける(分けない)ことによって テーブルへのアクセス(追加、参照、修正、削除)をいかに、より単純に出来るか・・・」です。 言い換えれば、正規化とは「利用しやすいように整理すること」であって それに「縛られなければならないものではない」という事です。 実際に使い込んでいきますと、使いやすさや応答速度重視のため あえて正規化しない(=非正規化)という場面もありますので、おいおい学んでください。