「第1正規化」の定義について
- 「第1正規化」とは、データベース設計の基本的な概念の一つであり、繰り返しの部分を複数のレコードに分割して繰り返しを排除する操作のことです。
- 一方、別の定義では、「第1正規化」とは、主キーによる表の分割を行い繰り返しを排除することで、データベースを正規化する手法の一つとして言及されています。
- 定義Aと定義Bのどちらが正しい「第1正規化」なのかは意見が分かれており、定義によって異なる解釈がされています。しかし、どちらの定義もデータの重複をなくし、データベースの正規化を目指すという共通の目的を持っています。
- ベストアンサー
「第1正規化」の定義について
はじめまして。 今までなんとなくAccessを使っていたのですが、一度きちんと勉強しておこうと思い、データベースの入門から始めているところです。 そこで、どうしても解らないところがでてきてしまいました。タイトル通り「第1正規化」についてなのですが、 http://www.kogures.com/hitoshi/webtext/db-seikika/ http://www.microsoft.com/japan/office/previous/xp/suminaka/access/database/database1_3.htm 上記最初のURL内「第1正規化」の項を参照すると、第1正規化とは 「繰り返しの部分を複数のレコードにして,繰り返しを排除する操作」 とあります。 これは、 「1レコードに繰り返しデータが存在している状態」を「非正規形」とし 「1レコードに存在する繰り返しデータを全て独立したレコードに書き出す」 事をもって「第1正規化」(第1正規形)と呼んでいるようです。 (便宜的に「定義A」と呼びます) 表を主キーで分割してはいません。 一方、以下のURLを参照すると・・・ http://sql.main.jp/cont/norm/nto1.html http://d.hatena.ne.jp/end0tknr/20080830/1220044407 http://www.techscore.com/tech/sql/SQL16/16_02.html/ 最後のURL内では、非正規形の定義は同様ですが、 「主キーによる表の分割を行い繰り返しを排除する」 事によって、「第1正規化」と呼んでいます。 (定義Bと呼びます) また、上記中段のURL内では、定義Aの状態も「非正規形」であると表現しているように読み取れます。 つまり解らない事というのは、「定義A」と「定義B」のどちらが正しい「第1正規化」(第1正規形)なのか?という事です。 Webや解説書等を漁ってみると、体感で 定義A:定義B=4:6 くらいのようで、定義Bが多いものの、かなり割れています。 個人的には、「データの重複を無くし」「汎用性を持たせる」という目的からすれば定義Bを第1正規形と扱った方が良いような気はしますが、こんなに書かれ方が分かれていると、どちらを信じて良いのか迷ってしまいます。 それとも、どちらも第1正規化の範疇なのでしょうか? 仕事上後進の指導もする事になるため、極力正確な理解をしておきたいのです。 どうか、お知恵を貸していただけないでしょうか。
- sethunaryo
- お礼率100% (1/1)
- その他(データベース)
- 回答数1
- ありがとう数2
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
結論から言うと,定義A,定義Bどちらも正しいということになります。 -------- コンピュータ科学の観点から関係データベース(RDB)を解説した解説書を読むと,関係代数とか関係論理という数学を基にした用語が登場します。RDBというのは集合に対する演算なんです。 このようなコンピュータ科学の観点で捉えた,第一正規形の本来の定義は「定義A」です。 コンピュータを勉強しはじめたばかりの初心者が,この「定義A」の第一正規形の表を見て,次のような感想を漏らすときがあります。 「繰り返しの部分を複数のレコードにして繰り返しを排除する操作,と言っているけれど……。たしかに伝票の明細部分は複数行に分かれたけれど,伝票のヘッダ部分は複数行に同じ内容が繰り返し書かれているよね。繰り返しは排除されていないじゃん?」 これは「繰り返しを排除する」という意味を勘違いしているわけです。 正しい解釈は,(Excelにおける1つのセルに)複数の値が格納されているようでは個別の値を扱えない。社員1,社員2,社員3のように同一定義域の属性が繰り返されているようでは社員というものを簡潔に扱えない。だから同一定義域の属性は1つにまとめて,なおかつ1セル=1値の形式にしなさいということです。 数学的には,同じデータが繰り返されているというのは問題ではないんです。 まったく同じ行(tuple)が絶対に存在しないのであれば,行中のいくつかの属性値が他の行と同じデータの繰り返しであろうとも,RDBとしては整合性がとれています。 集合に対する演算で正しい結果が得られるのならば,それがどれだけ肥大化したデータ群であろうとも,数学的にはなんの問題もありません。 -------- しかし,システム開発の観点からすると,そうもいきません。 「定義A」の表が,数学的には正しいRDBだとしても,それをそのまま実装すると同じデータを複数行繰り返して記録する羽目になります。 時代的にDBというものを知らず,昔のファイル設計しか経験していないシステムエンジニアであっても,というかコンピュータを知らない一般人であっても,「定義A」の同じデータの繰り返しをそのまま実装することには相当な違和感を覚えるのではないですか。 ですから,システム開発の現場では「定義B」が第一正規形だと教えるのです。 定義Aが本来の定義なのですが,理論屋的な定義Aの形式を経なければならないなんてことはシステム開発の現場ではまったく?無いので,実務屋的な定義Bで大丈夫なのです。
関連するQ&A
- 同じ構造の2つのテーブルで登録済みかを確認したい
あるデータベースの中に、テーブルAとテーブルBがあります。 テーブルAにはレコードが600件ほど登録されています。 テーブルBは、テーブルAと同じ構造を持ち、レコードが100件ほど登録されています。 この2つのテーブルについて、次のような動作を行うSQL文が知りたいです。 ---------------------------------------------------- テーブルBの任意のレコードについて、「そのレコードのURLの値」と同じURLの値を持つレコードがテーブルAに登録されてない場合、レコードをAに登録する。 なお実行の際、比較するのはURLの値のみであり、URLが同じなら他の値が異なっても登録しないものとする。 ---------------------------------------------------- たとえば、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com テーブルB NAME URL (フィールド名) d ddd.com y eee.com f fff.com g ggg.com としたとき、そのSQL文を実行すると、 テーブルA NAME URL (フィールド名) a aaa.com b bbb.com c ccc.com d ddd.com e eee.com f fff.com g ggg.com となります。 最初はテーブルBをPHPで読み込み、レコード一つ一つを登録済みかチェックしてテーブルAに登録する、という方法を考えました。 しかし、SQLを使っている以上、もっといい方法があるのではないかと思い、質問させていただきました。 このような動作を行うSQL文をどなたか教えてください。 よろしくお願いします。
- 締切済み
- MySQL
- 正規化について
データベースを勉強していて、正規化についての問題についてお聞きしたいです。とりあえず問題をまず書いてその後自分の考えたことを述べます。以下問題です。 いま表R(A,B,C,D)があり、 Aの列の値が(a1,a2,a3,a4,a4) Bの列の値が(b1,b2,b1,b2,b3) Cの列の値が(c1,c2,c1,c3,c4) Dの列の値が(d1,d2,d1,d2,d3) となっている。 1.このとき、表Rで成り立つ関数従属を選べ。 (1)A→CD(2)B→D(3)BC→A(4)AB→CD(5)D→A 2.表Rは第一正規形であるか? 3.表Rは第二正規形であるか? 4.表Rは第三正規形ではないが、この表Rを第三正規形になるような二つの表に分割せよ。 1.について 考え方がいまいちわからないのですが、自分で考えてみて、正解は(2)のB→Dかなと思ったのですが、どうやら正解は(2)と(4)っぽいのです。 これはどのように考えたらよいのでしょうか? 社員番号、とか社員名とかいう具体的な値ならまだわかるのですが、a1とかb1とかいう値のときにどのように考えたらいいのかがわかりません。 2.について これは第一正規形でよろしいですよね? 3.について これはもし1.の正解が(2)のB→Dであった場合、R1(A,B,C),R2(B,D)と分割できるので第二正規形ではないと考えました。答えはわかりません。 4.について 第三正規形と第二正規形の違いがわからないのでぜんぜんわかりません。 以上についてわかる方いらっしゃいましたら教えてください。よろしくお願いします。
- ベストアンサー
- PostgreSQL
- 正規表現の書き方に困っております。
あるSQLのダンプを変換するプログラムをPerlで書いているのですが、 うまく正規表現が書けなくて困っております。 データの途中に,が有ると、うまくいきません。 ''の中に囲まれた,は無視するという正規表現を書きたいのです。 また、'''B'も正しく処理できれば、完璧です。 #!/usr/bin/perl use strict; use warnings; #my $a = qq{'A','B',1}; --> うまくいく ['A']['B'][1] #my $a = qq{'A,','B',1}; --> うまくいかない ['A] ['] ['] my $a = qq{',','''B',1}; --> もっとうまくいかない ['][']['] if($a =~ /(.+?),(.+?),(.+?)/){ print "[$1]\n"; print "[$2]\n"; print "[$3]\n"; }else{ print "ERR!\n"; } exit; __END__
- ベストアンサー
- Perl
- URL正規化・www付き、無しそれぞれの内容
よろしくお願いいたします。 ・xxx.com(www無、以降A)とwww.xxx.com(www有、以降B)をBに統一して正規化しようと思っています。 ・301リダイレクトの.htaccessファイルの書き方はわかります。 ・A、Bが参照しているフォルダは現状同じです。 以上のような状況です。 301リダイレクトでは.htaccessファイルをフォルダ内に置くとのことですが、Aの参照フォルダとBの参照フォルダの場所を変えて、Aの方には.htaccessファイルのみ置いて、他のhtmlなどのサイトを構成するファイルは置かない、Bの参照フォルダには.htaccessは必要ないのでhtmlなどのサイトを構成するファイルだけを置くようにすれば良いのでしょうか。 現状のように同じフォルダを参照したままで、そこに.htaccessを置くだけでは、結局A、Bは複製コンテンツとしてマークされてしまう危険があるのではと心配しています。
- ベストアンサー
- HTML
- 正規化?の戻しについて
お世話になってます。 データの結合SQLについて教えてください。 以下の2つのテーブルがあります。 <TBL1> KEY A B --- -- -- 111 A1 B1 222 A2 B2 333 A3 B3 <TBL2> KEY COL C --- --- -- 111 1 AA 111 2 BB 222 1 CC 222 2 DD 333 1 EE 333 2 FF 正規化?を行った結果このようになったようなのですが、運用では下記イメージで利用してます。 KEY A B C1 C2 --- -- -- -- -- 111 A1 B1 AA BB 222 A2 B2 CC DD 333 A3 B3 EE FF TBL1とTBL2から、このイメージを取り出すために前任者がPL/SQLの複雑なロジックで実現しているのですが、処理が遅い状態です。 SQLのみで実現できれば、もう少し早くなるのでは?と考えております。 いろいろ考えてみましたが実現方法が思いつかないため、お知恵をお貸しください。 TBL1は特に規則性もない普通のテーブルです。 TBL2は、TBL1のキーが必ず存在します。 COLは、キーごとに1,2が固定で設定されます。結合イメージのC1,C2項目に該当します。 TBL2の件数はTBL1件数*2になります。 以上、つたない説明ですが、よい手がありましたら、ご指摘お願いします。
- ベストアンサー
- Oracle
- 正規表現を使って?
置換の正規表現を使ってこのURLを (例) <A href="http://123.com/456/789/"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://123.com/456/789/">リンク先</A> このようにしたいです。 <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F">リンク先</A> :は%3aに /は%2fに 最後にリンク先のURLにhttp://tesuto=を追加したいです。 (<IMG src="からのURLはそのままにしたいです。) ちなみにhtml内には様々なタグが入っていてリンク先も様々なURLが書かれているとします。 (http://123.com/456/789/やhttp://123.com/456/789/abc/dehg/など) 正規表現についてはまったく分からず悩んでいます。 どなたかよろしくお願いします。
- ベストアンサー
- その他(プログラミング・開発)
- MySQLでテーブル一致条件に正規表現は使用可能?
・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT * FROM a LEFT JOIN a.url = b.id REGEXP '^(/color)'? where a.★★ = b.id
- ベストアンサー
- MySQL
- 名前定義で定義している値が、自動的に可変してしまう
Excel の質問です。 名前の定義について、教えて下さい。 僕が仕様を理解していないのか、関数の記述が間違っているのでしょうか ■現象 シートクリック時に、定義している関数の値が可変してしまう ■データ ワークシート[Sheet1]上データ |A |B ------------------------------------ 1|りんご | 2|みかん | 3|バナナ | 4|パイナップル| 5|もも | A1 ~ A5 は、データを直接入力 ■名前の定義 (1).数式リボン> 名前の管理> 新規作成 (2).以下 名前: 最終行番号 範囲: Sheet1 参照範囲: =MAX(INDEX((Sheet1!A:A<>"")*ROW(Sheet1!A:A),0)) (3).D10 に、「=最終行番号」と入力 ■結果 ・入力直後、D10 は、5 となるが、どこかのセルをクリック後、名前の定義を見ると「A:A」になっていない。 ・異なる列範囲になっている ・規則性不明 ■期待結果 ・上記の場合、どのセルをクリックしても、名前の定義で定義した範囲が「A:A」のままであって欲しい。 ■現象確認 Excel2010 ■その他 ・参照範囲で設定している記述が、参照ではないからでしょうか?(自己定義関数を、名前の定義で呼び出している感じで、間違った使い方をしているから?)
- ベストアンサー
- Excel(エクセル)
- 正規化されていないテーブルの分割について
正規化されてない下記のようなテーブルがあります。 テープル1(主キー:得意先、商品コード) 得意先 商品コード A 1 A 2 B 5 B 6 B 7 C 1 C 2 これを以下のようにテーブル2つに分けたいです。 テーブル2(主キー:得意先) 得意先 パターン A x B y C x テーブル3(主キー:パターン、商品コード) パターン 商品コード x 1 x 2 y 5 y 6 y 7 このとき、テーブル1のデーターをもとに テーブル2やテーブル3のレコードを生成したいのですが、 テーブル3を抽出するSQL文がどうしても思いつきません。 (やりたいのは、あらかじめ登録したパターンを得意先ごとに選択するという形にしたいです。) 簡単にできるような気もするのですが... パターンについては、ランダムな文字列で構わないです。 SQL文等アドバイスの程、よろしくお願い致します。
- 締切済み
- SQL Server
- 「/」を利用した正規表現
PHPバージョン5.2.4を使用しています。 http://www.hoge.com/abc/f.php というURLを「/」で区切った結果を取得したいのですが、 普通にsplit('/', $url);の条件でやってしまうと http:のあとの「//」があるので、そこも分割してしまいうまくいきません・・・ この場合、スラッシュ1つで区切って3つに分割したいのです。 スラッシュが1つの場合だけ区切るという正規表現はどのようになるのでしょうか? 取得したい結果 http://www.hoge.com abc f.php
- ベストアンサー
- PHP
お礼
とてもよく解りました! 理論上と実務上の違いだったのですね。 本当にありがとうございました。