- ベストアンサー
正規化の問題
http://www.techscore.com/tech/sql/16_02.html のサイトを参考に正規化の仕方を勉強しています。 そこで質問なのですが、上のURLの一番最後の実習課題の問題の第一正規化からつまずいています。 図書館貸し出しカードにて、 固定部分が (発行日、貸出日、返却予定日、会員番号、会員名) 繰り返し部分が (書籍番号、書籍名、著書) なので、 とりあえず1つヘッダ的な表は (発行日、貸出日、返却予定日、会員番号、会員名) として、分離する表の主キーは何にすべきなのか迷います。 (発行日、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (会員番号、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (発行日、会員番号、書籍番号、書籍名、著書) として主キーを(発行日、会員番号、書籍番号)とするのかです。 どれも間違っているかもしれませんが、固定ヘッダ部分の表と繰り返し部分の表を結びつける属性が「発行日」だけじゃ同じ発行日で借りる人はたくさんいるだろうし、、でも「会員番号」だけじゃ他の日に発行した本の情報はどうなってしまうのだろうかとか、色々考えてしまって困惑しています^^; どなたかお助けください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
固定部分は質問者さんのおっしゃるとおり、 (発行日、貸出日、返却予定日、会員番号、会員名)で 主キーは(発行日、会員番号)で良いのではないでしょうか。 繰返し部分はおっしゃるとおり (書籍番号、書籍名、著者)ですが、 固定部分の主キーを埋め込んであげないと、固定部分と繰返し部分の関係がわからなくなってしまいます。 (埋め込んであげないと「関係データベース」の意味が無くなる) よって繰返し部分は (発行日、会員番号、書籍番号、書籍名、著者)とし、 主キーは(発行日、会員番号、書籍番号) となるのではないでしょうか。
その他の回答 (1)
- hitomura
- ベストアンサー率48% (325/664)
貸出カードの意味をよく考えてみましょう。 このカードの項目をよく見ると、1枚のカードで2回以上の貸し出しができないことがわかります。 つまり、1回の貸し出しにつきカードを1枚作成しそこにその回の貸し出し記録を列挙する、という業務が見えてきます。 #しかし資源を無駄遣いしてるなこの図書館 そこで、何日に誰が借りたかがわかれば貸し出し作業の特定ができるため、 発行日、貸出日、返却予定日のいずれか および 会員番号 を繰り返し部分のテーブルに追加し、上の2つ+書籍番号を主キーにすれば、「上の2つ」の部分で固定部分が特定できますし、DB全体で第一正規形になります。 この主キーがしっかりしていれば、ほかの項目を繰り返し部分に追加しても第一正規形は崩れません。…が、当然第二正規形以上にはなりません。
お礼
ありがとうございます。 ご指摘いただいた通り固定部分との連結という基本的な事項を確認していませんでした^^; 追加で質問いいでしょうか。まず ************************************* 第一正規形が、(以下、主キーがA,Bの場合は【A、B】と表します) (発行日、貸出日、返却予定日、会員番号、会員名) 【発行日、会員番号】 (発行日、会員番号、書籍番号、書籍名、著者) 【発行日、会員番号、書籍番号】 **************************************** 第二正規形 a(発行日、会員番号)【発行日、会員番号】 b(発行日、貸出日、返却予定日)【発行日】 c(会員番号、会員名)【会員番号】 d(発行日、会員番号、書籍番号)【発行日、会員番号、書籍番号】 e(書籍番号、書籍名、著者)【書籍番号】 ***************************************** 第三正規形 bについて発行日→貸出日、貸出日→返却日 という推移関数従属がなりたつから (発行日、貸出日) 【発行日】 (貸出日、返却日) 【貸出日】 に分解。 eも推移関数従属性があるから (書籍番号、書籍名) 【書籍番号】 (書籍名、著者) 【書籍名】 と分解 ***************************************** ボイスコッド正規形 dについて、同じ本が2冊以上あったとしても書籍番号が異なるとするならば、書籍番号→会員番号 という関係が成り立たなくも無い気がするので (発行日、会員番号) 【発行日、会員番号】 (会員番号、書籍番号) 【書籍】 と分解できる。 ***************************************** 以上でいいでしょうか^^;
お礼
ありがとうございます。 やはり、固定部分と繰り返し部分は1対1で対応していなくてはいけないのですね。 それともう1つ疑問に思ったことなのですが、この貸し出しカードでは一日にもう一度発行することが出来ると仮定すると、繰り返し部分にタプルを付け足せばいいということになるんですよね?^^;