• ベストアンサー

正規化の問題

http://www.techscore.com/tech/sql/16_02.html のサイトを参考に正規化の仕方を勉強しています。 そこで質問なのですが、上のURLの一番最後の実習課題の問題の第一正規化からつまずいています。 図書館貸し出しカードにて、 固定部分が (発行日、貸出日、返却予定日、会員番号、会員名) 繰り返し部分が (書籍番号、書籍名、著書) なので、 とりあえず1つヘッダ的な表は (発行日、貸出日、返却予定日、会員番号、会員名) として、分離する表の主キーは何にすべきなのか迷います。 (発行日、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (会員番号、書籍番号、書籍名、著書) として主キーは(発行日、書籍番号)とすべきか (発行日、会員番号、書籍番号、書籍名、著書) として主キーを(発行日、会員番号、書籍番号)とするのかです。 どれも間違っているかもしれませんが、固定ヘッダ部分の表と繰り返し部分の表を結びつける属性が「発行日」だけじゃ同じ発行日で借りる人はたくさんいるだろうし、、でも「会員番号」だけじゃ他の日に発行した本の情報はどうなってしまうのだろうかとか、色々考えてしまって困惑しています^^; どなたかお助けください。

  • arcsin
  • お礼率46% (194/417)
  • MySQL
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • mooti887
  • ベストアンサー率39% (9/23)
回答No.1

固定部分は質問者さんのおっしゃるとおり、 (発行日、貸出日、返却予定日、会員番号、会員名)で 主キーは(発行日、会員番号)で良いのではないでしょうか。 繰返し部分はおっしゃるとおり (書籍番号、書籍名、著者)ですが、 固定部分の主キーを埋め込んであげないと、固定部分と繰返し部分の関係がわからなくなってしまいます。 (埋め込んであげないと「関係データベース」の意味が無くなる) よって繰返し部分は (発行日、会員番号、書籍番号、書籍名、著者)とし、 主キーは(発行日、会員番号、書籍番号) となるのではないでしょうか。

arcsin
質問者

お礼

ありがとうございます。 やはり、固定部分と繰り返し部分は1対1で対応していなくてはいけないのですね。 それともう1つ疑問に思ったことなのですが、この貸し出しカードでは一日にもう一度発行することが出来ると仮定すると、繰り返し部分にタプルを付け足せばいいということになるんですよね?^^;

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

貸出カードの意味をよく考えてみましょう。 このカードの項目をよく見ると、1枚のカードで2回以上の貸し出しができないことがわかります。 つまり、1回の貸し出しにつきカードを1枚作成しそこにその回の貸し出し記録を列挙する、という業務が見えてきます。 #しかし資源を無駄遣いしてるなこの図書館 そこで、何日に誰が借りたかがわかれば貸し出し作業の特定ができるため、  発行日、貸出日、返却予定日のいずれか および  会員番号 を繰り返し部分のテーブルに追加し、上の2つ+書籍番号を主キーにすれば、「上の2つ」の部分で固定部分が特定できますし、DB全体で第一正規形になります。 この主キーがしっかりしていれば、ほかの項目を繰り返し部分に追加しても第一正規形は崩れません。…が、当然第二正規形以上にはなりません。

arcsin
質問者

お礼

ありがとうございます。 ご指摘いただいた通り固定部分との連結という基本的な事項を確認していませんでした^^; 追加で質問いいでしょうか。まず ************************************* 第一正規形が、(以下、主キーがA,Bの場合は【A、B】と表します) (発行日、貸出日、返却予定日、会員番号、会員名) 【発行日、会員番号】 (発行日、会員番号、書籍番号、書籍名、著者) 【発行日、会員番号、書籍番号】 **************************************** 第二正規形 a(発行日、会員番号)【発行日、会員番号】 b(発行日、貸出日、返却予定日)【発行日】 c(会員番号、会員名)【会員番号】 d(発行日、会員番号、書籍番号)【発行日、会員番号、書籍番号】 e(書籍番号、書籍名、著者)【書籍番号】 ***************************************** 第三正規形 bについて発行日→貸出日、貸出日→返却日 という推移関数従属がなりたつから (発行日、貸出日) 【発行日】 (貸出日、返却日) 【貸出日】 に分解。 eも推移関数従属性があるから (書籍番号、書籍名) 【書籍番号】 (書籍名、著者) 【書籍名】 と分解 ***************************************** ボイスコッド正規形 dについて、同じ本が2冊以上あったとしても書籍番号が異なるとするならば、書籍番号→会員番号 という関係が成り立たなくも無い気がするので (発行日、会員番号) 【発行日、会員番号】 (会員番号、書籍番号) 【書籍】 と分解できる。 ***************************************** 以上でいいでしょうか^^;

関連するQ&A

  • 第1正規形→第2正規形

    正規化についてお聞きしたいです。 大学の図書館の本の貸し借りのデータベースで 現在第1正規化した↓のテーブルがあるのですが 図書ID|書名|配架場所|学生証番号 | 氏名|学部|在籍期限|返却期限|貸出日 (図書IDは重複がないものとする。主キーは図書ID、学生証番号である) これを第2正規形に正規化した場合 学生証番号(主キー)|氏名|学部|在籍期限 図書ID(主キー)|書名|配架場所 学生証番号(主キー)|図書ID(主キー)|返却期限|貸出日 ↑のように3つの表に分ければ良いのでしょうか? あとこれを第3正規形にするにはどうすればいいでしょうか? 第2から第3への方法がよくわからないので、わかる方ご指導下さい。

  • また正規形について。

    http://www.techscore.com/tech/sql/16_02.html のURLの下の方の表 受注番号、商品番号、納入業者 12345  001   業者 A 12345  002   業者 B 12346  001   業者 A 12347  001   業者 D において、 ****以下引用**** このとき、非主キー列「納入業者」は「受注番号」と「商品番号」から決まりますので、(受注番号、商品番号) →納入業者は関数従属の関係が成立しています。よって、このテーブルは第二正規形の条件を満たしていると言えます。(中略) ****引用終わり**** とありますが、私には 商品番号→納入業者 という関数従属関係があるきがするのですが違うのでしょうか?なので第二正規形の時点で、 (商品番号、納入業者)という表が新たに分離される気がするのですが… さらに、 http://www.st.rim.or.jp/~ryoma/tips/seikika.htm のURLの同じくボイスコッド正規形で扱われ表、 商品コード、仕入先コード、担当者コード 000120001 111 401 000120001 112 402 000120002 111 401 000120002 150 403 仕入先コード、仕入先名 001 東京商店 002 大阪商会 003 名古屋流通 で、 *引用* 商品コード、仕入先コード、担当者コードを属性とする上の表は、繰り返し部分を持たず、また商品コード+仕入先コード、あるいは商品コード+担当者コードをキーとすることができ、かつ推移従属の関係が存在しないため、第三正規形です。 *終* とありますが、主キーを【商品コード、仕入先コード】と決めたとき、非候補キーである担当者コードは仕入先コードに関数従属している気が(私は)してしまうので第二正規形へ変形した時点で(仕入先コード、担当者コード)という表が分離されていると思うのですが。 以上の解釈で間違っている考えがあればご指摘ください。

    • ベストアンサー
    • MySQL
  • 第1正規形から第2正規形へ

    正規化についてお聞きしたいです。 大学の図書館の本の貸し借りのデータベースで 現在第1正規化した↓のテーブルがあるのですが 本の貸借 学生ID|学生氏名|学部|学部棟 | 図書番号|出版社|本のタイトル 111   山田花子 経済  102B   100122  A社  経済白書  222   小林武  理学  201C   200021  D社  人間失格 555   鈴木一郎 文学  301D   103455  D社  走れメロス  555   鈴木一郎 文学  301D 204333  B社  バカの壁 666   沢井竹子 経済  102B   104444  C社  雑学無駄知識 (図書番号は重複がないものとする。) これを第2正規形に正規化した場合 学生ID(主キー)|学生氏名|学部|学部棟 学生ID(主キー)|図書番号(主キー)|出版社|本のタイトル ↑のように2つの表に分ければ良いのでしょうか? まだ完全に第2正規化を理解できていないので みなさんもし宜しければ力を貸してください。 学生ID(主キー)|学生氏名|学部|学部棟 学生ID(主キー)|図書番号(主キー)|出版社|本のタイトル

  • 第3正規化とは何でしょうか

    データベースの第三正規化がよく分かりません。 第二正規化との違いがよく分かりません。 第2→主キーの一部に従属する項目を分離 第3→主キーに従属しない項目を分離 という説明があったり (このテキストでは、主キーを常に複合キーとしているようであり、その複合キーの(2つとして)どちらかを主キーとする表をつくるのが2で、その複合キーのどちらとも関係しない列を主キーとする表を3としているようなのですが、そもそも主キーは複合キーとは限らないはずだと思うのですが・・) 別のテキストでは(ある基本情報技術者試験のテキスト) 第2→関数従属 第3→推移的関数従属 という説明があったりします(推移的関数従属というのをネットで調べてみましたが、その概念がここでどう当てはまるのか分かりません) このへん教えていただけませんでしょうか? あるいは、分かりやすくある程度体系的に教えているページや本があれば教えてください。

  • どうやって正規化するかを教えてください

    (会員番号、顧客名、品番、品名、数量、価格、注文日、支店番号、支店名、対応者) これらの項目を正規化するとしたらどう分ければよいかわかりません、 教えてください。

  • リンク先が、それぞれ第何正規化に該当するか教えて

    正規化が分かりません。 冗長性を排除したい、という意図だけは分かるのですが… 例えば、リンク先で回答されているケースは、それぞれ第何正規化に該当するのでしょうか? >個人IDがあり、住所情報を正規化するとしましょう >項目は「郵便番号」「都道府県」「市区町村」「番地」「電話番号」「メールアドレス」としますよ >個人IDを主キーとする「郵便番号テーブル」を作る >個人IDを主キーとする「都道府県テーブル」を作る >個人IDを主キーとする「市区町村テーブル」を作る ・これは第1正規化ですか? >個人IDを主キーとする「番地テーブル」を作る >個人IDを主キーとする「電話番号テーブル」を作る >個人IDを主キーとする「メールアドレステーブル」を作る ・この内容は重複しないと思うのですが、分けると、正規化したことになるのでしょうか? ・また、その場合は、第何正規化に該当するのでしょうか? ▽DBの「非正規化」について   http://okwave.jp/qa/q5776795.html

    • ベストアンサー
    • MySQL
  • データ正規化について

    【質問内容】 自分で途中までやったんですが、(2)の第2正規形からわからなくなったので、どなたかデータベースに詳しい人のアドバイスをいただけたらなと思います。あと、間違いがあればご指摘願います。 【問題内容】 (1) 職種歴表(非正規形)をバッカス表記法で記述。 (2) (1)についてデータ正規化を第3正規形まで行い、その過程をバッカス表記法で記述。 (4) 正規化後の各表について、基本キー(連結キーの場合,その表     記)、外部キーを示す。 (5) このデータベースのデータ定義をSQL - DDL で記述。 【職種歴表】 従業員番号 従業員名 入社年月日 部門コード 部門名   職種コード   職種名     経験年数 S880123  鈴木太郎 04/01/88   A01    開発1課    P01    初級プログラマ    2                         P02                   中級プログラマ    3                         S01                   初級SE         1 T910354  佐藤花子 04/01/91   B01   電算1課    O01     初級オペレータ   2                         P01                    初級プログラマ    1 S860555  高橋一雄 04/01/86   A02   開発2課     S01     初級SE        3                         S02                    中級SE        5 (2) 職種歴表 = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 +   {職種コード + 職種名 + 経験年数} (3) 【第1正規形】 職種歴表A = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表B = 従業員番号 + 職種コード + 職種名 +経験年数 【第2正規形】 職種歴表A = 従業員番号 + 従業員名 + 入社年月日 + 部門コード + 部門名 職種歴表B = 従業員番号 + 職種コード + 職種名 +経験年数 職種歴表B2 = 職種コード + 職種名

  • excel vbaでマクロが作りたいのですが

    マクロ初心者です。 番号  貸出日  返却予定日 図書名  貸出先   返却日 1   2012/12/5 2013/1/5  マクロ  ジョニーさん 上のような表を作成していて、予定日を過ぎても返却がない場合、自動的に番号欄に網掛けをして、実際に返却されて返却日が入力されたら、網掛けが消えるというマクロがつくりたいのですが。 素人なりに試行錯誤していますが、なかなか出来ずに困っています。 どなたか、わかりやすく教えていただけませんか。

  • 正規化があっているのかどうか見てください。

    最近自作サイトを作っているのですが、DBの設計がちゃんと正規化されているか自信がありません。 そこで今考えているDBのテーブル設計を書かかせていただきますので、あっているかどうかチェックしていただきたいと思って投稿しました。 例えば電子書籍のDBを設計するとして、 ・漫画ID タイトル タグ ページ数 アクセス数 Upload日 Update日 こんなテーブルがあったとして、タグには複数の項目が入るので、第一正規化を適用して ・漫画ID タイトル タグID ページ数 アクセス数 Upload日 Update日 ・タグID タグ の2つにわけました。ここで2つ疑問があります。 まずタグIDとタグからなるテーブルですが、これの主キーはタグIDとタグですよね? これは主キー以外にレコードは無いんですが、こういう設計はまちがっていませんか? 次に、もう一個のテーブルがやけに長いというか第2正規化できるような気がするのですが、 部分関数従属するカラムは見当たりません。(例:ページ数が決まったかといって、アクセス数が決まるわけではない。 つまり全て漫画IDに完全関数従属している)。これであっているでしょうか? ご回答お待ちしております。

  • テーブル設計につきまして(正規化)

    顧客情報管理サイトを作ろうと思っています。 ・非正規化  {顧客コード , 氏名 , かな名 , 性別 , 郵便番号 , 都道府県 , 市区町村 , 建物名 , 電話番号 ,  FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  の列を考えております。 ・正規化テーブル  1.顧客情報テーブル   {顧客コード , 氏名 , かな名 , 性別 ,郵便番号(外部キー) , 建物名 , 電話番号 ,   FAX番号 , 携帯番号1, 携帯メール1 , 携帯番号2 , 携帯メール2 , 顧客ランク,備考}  2.郵便情報   {郵便番号(主キー) , 都道府県 , 市区町村 これ以上、正規化できないと思っているのですが、顧客情報テーブルをもっと効率よく テーブルを設計し、正規化できるものでしょうか? よろしくお願いします。