• 締切済み

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

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

みんなの回答

  • hue2011
  • ベストアンサー率38% (2800/7250)
回答No.3

むつかしいことだと思うから疑問になるんです。ことはシンプルです。 たとえば販売記録があるとしますね。 日付 2018/10/20 12:22:45 バーコード 49xxxxxxxxxxx 販売品 マヨネーズ 単価  230 数量   2 合計  460 税    36 総計  436 お預かり 1000 おつり   564 これだと冗長で管理しずらいから、項目名は抜き出し、タイトルにして 日付,バーコード,商品,単価,数量,合計,税,総計,お預かり,おつり 2018/10/20 12:22:45,49xxxxxxx.マヨネーズ,230,2,460,36,436,1000,564 このように考えることが第一正規化ですね。これをすると、2枚目以降のデータは数字と文字だけであってタイトルは意識しないですみます。 ただ、同じバーコードのマヨネーズは何度も売る可能性があり、こういう記録は冗長です。 日付,バーコード,数量,合計,税,総計,お預かり,おつり564 2018/10/20,49xxxxxxxxxxx,2,460,36,436,1000,564 バーコード,商品名,価格 49xxxxxxxxxx,マヨネーズ,230 という風に2つの管理部分にわけるといいでしょうね。これが第二正規化です。 ところで、数量により合計金額とか消費税とか総合計金額なんていうのは自動的にだせますね。データ保持する理由がありますか。また、預かったお金でおつりを出すのも、簡単に出せる話ですね。 そこで 日付,バーコード,数量,お預かり 2018/10/20,49xxxxxxxxxxx,2,1000 バーコード,商品名,価格 49xxxxxxxxxx,マヨネーズ,230 としても、別段業務に差し支えないし、間違って余計なデータを破壊することもなくなりますね。 これが第三正規化ということになります。 一番わかりやすいようにあっさり説明したものがこうなります。

参考URL:
https://high-programmer.com/2017/10/21/db-normalization-difference/
spongetak
質問者

お礼

ありがとうございます。第三のご説明については、数値の集計データはデータとして保存しないという一般論は分かりますが、テキストで出てくる第三正規化はまた別の趣があるようで、なかなか理解できないのです。リンクもなかなか難しいです・・どれもある程度はしょってしまっているようで、私自身、正式なデータベースの理論のテキスト(資格試験用とかのテキストではなく)をきちんと学ばないといけないような気がしています。

noname#251548
noname#251548
回答No.2

第二正規化については、次のようなファイルでしたら店舗コードが単体に主キーになります。 ・店舗コード ・店舗名 ・地域コード ・地域名 ・店長コード ・店長名 ・累計売上額 この例と先の説明で考えてみてください。 みっともない回答となってしまいました。ごめんなさい。

noname#251548
noname#251548
回答No.1

私も第二正規化と第三正規化の違いがなかなかわからず苦労しました。 私なりの理解で説明します。 先に第三正規化を理解した方がわかりやすいと思いますので、第三正規化から先に説明します。 データベースにおいて項目の従属でよくあるのか「コード」と「名前」ですよね。 例えば店舗コードと店舗名、商品分野コードと商品分野名、商品コードと商品名、といった「コード」と「名前」がよくあります。 会社全体の日別の売り上げファイルがあったとして ・日付 ・店舗コード ・商品分野コード ・商品コード ・売上額 コードさえあればそれぞれに名前は各名前ファイルから調べる事が可能なので、このファイルのレコードには各名前を入れる必要はないですよね。 このように、「名前」を【【全て】】排除した状態が第三正規化です。 【【全て】】と強調したのは、全てではなく一部の名前を排除した状態なのが第二正規化だからです。 第二正規化で排除されている一部に名前とはどれか・・・それが、主キーの従属している名前の項目です。 各店舗ごとのこれまでの全累計売り上げファイルがあったとして ・店舗コード ・店舗名 ・商品分野コード ・商品分野名 ・商品コード ・商品名 ・売上額 ・累計売上額 このファイルの場合は店舗コードが単体の主キーです。 この状態から主キーに従属している店舗名【だけ】を排除したのが第二正規化の状態です。 第二正規化では商品分野名や商品名はまだ排除しません。 第三正規化までする場合には商品分野名や商品名も排除します。 以上でわかりますでしょうか・・・?

spongetak
質問者

お礼

確かにこの見方でだいぶすっきりするように思われます。 全てを1つの表にしたあと、その表の主キーを考える。 売上のデータでいくと、上記ですと、おそらく(解説とは変わりますが)店舗コード×商品コード(あるいは実際的には ×売上日 が付く) が複合主キーになるのではないでしょうか。 これに対して売上コードという単一の主キーを立ててもよいかと思います。 要するにそれ以上細分化できない(する必要のない)最小の各データ(行)に対して、一つ一つ割り振られたコードになります。 このコード(の生成)に直接かかわるような店舗コードと商品コードが、第二正規化で扱われ、別表化されることになる表の主キーであり、それ以外の商品グループコードという、あってもなくてもよいような、(仕事上は重要であるかもしれないが、データベース体系的には重要ではない)データで、主キーを立てて別表化できるものを、別表化するのが、第三正規化ということで、とりあえず考えておけばよいのかと理解しました。 おそらく、原始的なデータを集めて作成したデータベースを考えたとき、そのデータベース(1つの表)はどんな区別をもとに、単一の個々のデータ(個々の行)になっているのか? という問いに対して、常にどれかとどれかの列(2つか3つ)の、組み合わせとして主キーが立てられるということになっているのではないかと思います(原理的に)。 となればあるテキストで、毎回第二正規化が複合主キーになっているのも当然ということになり、またそのへんの正規化を解説した、テキストやWebサイトで、複合主キー関連の学術的説明が続くのも合点がいく気がします。 わたしはいつも複合主キーというのは主キーのイレギュラー形かと思っていたのですが、上記ふまえると、複合主キーのほうが、一番最初の主キー決定において、むしろ本質的概念であるということになります。 (私がACCESSで売上データを作るときは、複合主キーは気持ち悪いので、単一の主キーを作っていました。業務的にはそれでよいかもしれませんが、本質的には余計な情報追加ということになるかと思います) まだまだ全体をきちんと理解できていないですが、いろいろ気づかせていただきました。ありがとうございます。

関連するQ&A

  • DataBaseの主キーについて

     今晩は、現在Databaseを勉強中です。  DataBaseの正規化について質問致します。  第2正規化、第3正規化のあとは、全てのキー列が主キーに対して完全従属、そして推移的関数従属でない表が出来ているはず なのですが、これを考えると、第3正規化後も何故主キーが2つ以上になることがあるのでしょうか。  あるフィールド(主キーの列)に対して他の列は完全従属で且つ、推移的従属であれば、主キーは1個しかないと考えられるのですが、 これについての疑問を色々と調べてみましたが納得のいく参考書等も見当たりません。    この内容について詳しい方がおられましたら是非教えて下さい、宜しくお願い致します。

  • また正規形について。

    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
  • 【データベース】 正規形を答える問題

    正規形を答える問題で悩んでいます。 次のような問題です。 属性{A,B,C,D}をもつ表に対して、次の二つの従属性が見られる。 (1)A,B → C,D (2)C→B この表の正規形は何か。 第2正規形か第3正規形で迷っています。 第2正規形の条件を満たす理由は 候補キーは{A,B},{A,C}で どの候補キーも非キー属性に対して完全関数従属だからです。 その後、非キー属性が候補キーに対して推移的に関数従属していないかを考えたのですが、「おそらくしていない…」というくらいで第3正規形であると確証ができません。 確証ができない理由が一つあります。 実際の業務でこのテーブルをつくるときに、 {A,C}→D, C→Bを利用して、  ACD とCBの二つの表に分けると思うからです。 うまく分けられるってことは第2正規形だからかな…と考えてしまいます。 アドバイスいただけないでしょうか… よろしくお願いします。

  • ボイスコッド正規形

    http://www.techscore.com/tech/sql/16_02.html を参考に勉強しているのですが、ここのサイトでの疑問点です。 ボイスコッド正規形の説明の一番最後のほうに、 --引用-- 受注番号を主キーとし、下のテーブルでは納入業者を主キーとします。それぞれ、受注番号→商品番号、納入業者→商品番号という完全関数従属関係が成立しています。これらのテーブルは、ボイスコッド正規形の条件を満たしています。 --引用終わり-- ココの点で、受注番号→商品番号の関数従属はなりたっているのでしょうか?? 12345は商品番号001,002の二つを指している気がするのですが。

    • ベストアンサー
    • MySQL
  • 正規化があっているのかどうか見てください。

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

  • データベースでの質問です。

    データベースの正規化で第一正規化、第二正規化、第三正規化 がありますが 「第一正規化」では、データの重複をなくす事をする 「第二正規化」では関数従属をおこないxの値が決まればyの値が決まるのと同じように あるキーが決まれば、他のキーも決まるようになること 「第三正規化」では関数従属をなくすと聞いたんですが、意味がわかりません 解釈としてはキー項目を2つ組み合わせてある項目を決めると解釈であってるでしょうか?? 第一正規化と第二正規化はこの解釈でいいでしょうか?? バカな質問ですいません データベースの正規化の理解に苦しんでいます 回答おねがいします。

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

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

  • 第3正規化するかどうか

    第3正規化ってどういう条件でやるものなのでしょうか? http://su10.sgu.ac.jp/~morita/Seminar/6thStudent/siohara/formalize.html 上記だと第3正規化でGenre_nameを分離していますが、 Genre_codeで定まる値が一つならGenre_codeをなくしてGenre_nameをCinemaに直接書いても大差ないように思えます。 (Genre_codeに従属している項目が複数だったらやるべきだと思いますが) 現在テーブルを作成しているのですが、 上記のようにコードをつけて分離しようと思えばできる項目が複数あり、 やるべきかやらざるべきかで悩んでおります。 基本的にやれるところはやった方がいいのでしょうか? (個人的にはテーブルが増えると管理が面倒なのでコードにするにしても、 参照するプログラム側で連想配列でも持たした方が楽かなと思っているのですが)

  • 正規化・リレーションシップについて

    テーブル(表)というのは、売り上げ伝票とうをデータに起こしたものだと思っております。 その中で、起票したテーブルを 部分的・推移的関数を排除すれば第三正規化までが出来ると考えております。 「質問1」 つまり正規化で対象となる表は、起票したデータ(表=伝票等)が対象になる? で間違い無いでしょうか? 「質問2」 1つのデータ(表=伝票等)を、正規化したため、 その関連付けるために、リレーションシップというのがあるのでしょうか?

  • 正規形の定義

    第二正規形と第三正規形の定義を教えてください。 どの文献を参考にしても「候補キー」や「主キー」という語を用いて説明がしてあります。が、私はそのあたりからさっぱりわからないので、とても理解しづらいです。もっと噛み砕いた、わかりやすい表現での定義を求めています。どうか、よろしくお願いします。

専門家に質問してみよう