データベースのテーブルについておたずねします.
主キーがなくて,そのかわりに外部キー(と主キー以外の列)しか持たない
テーブルも可能だと聞きました.
テーブルには主キーが必ずあるものだと思っていましたが,
どのような使いかたをするのでしょうか.
どうやら,最初からデータがあるわけではなく,
追加されるタイミングがわからないデータを格納する場合に作っておく,
ということらしいのですが,なんのことかよくわかりません.
データベース関連書籍をいくつか調べましたが,
主キーのないテーブルの説明などは見当たりません.
また,この悩ましい問題を与えてくれた知り合いに訊ねましたが,
テーブル構成などの具体的なことは,
企業内のことなので,教えてもらえませんでした.
何か具体的な例を交えながらご説明いただければと思います.
No.2ベストアンサー
- 回答日時:
難しく考える必要はないと思いますよ。
主キーというのがそのテーブルの行をユニークに規定する独立したIDと考えると、その設置有無は必要性で判断すれば良いことです。不要でも設置して構いませんが、それは分かり易さとシステムリソース、レスポンス、メンテナンス性との兼合いでしょう。では、好例ではありませんが、一つ具体例をあげてみましょう。
日本語が下手でごめんなさい。よ~く読んで、ER図を書いてみてください。
とある組立工場を思い浮かべてください。そこで生産される製品の条件を以下とします。
・製品は複数の部品から構成される。
・部品は複数の製品に使用される。
・部品は複数の仕入先から調達される。
・部品の仕入先は製品によって規定される。
・製品を構成する部品は、部品毎に仕入先が異なる。
ここで登場する実態(エンティティ)は、
・製品
・部品
・仕入先
の3つですね。各々の実態の関係は、
・製品:部品=N:N
・部品:仕入先=N:N
・製品:仕入先=N:N
となり、N:Nの関係ばかりですね。
さて、この関係でリレーションを張ってみましょう。単純に考えると各実体(テーブル)の構成項目は以下になりますね。
・製品=製品ID+製品情報
・部品=部品ID+製品ID+仕入先ID+部品情報
・仕入先=仕入先ID+仕入先情報
ここで問題になるのは、部品テーブルの部品情報ですね。同じ部品でも仕入先毎に複数の行が発生するので、データの重複になります。メンテナンス性からこれは望ましくありません。リソース的にも不利ですね。
そこで、リレーションを一つ実態に昇格させましょう。製品別部品別仕入先テーブルを作るのです。その結果各テーブルは、
・製品別部品別仕入先=製品ID+部品ID+仕入先ID
・部品=部品ID+部品情報
になります。これで、データの重複を排除できます。この時、製品別部品別仕入先テーブルには外部キーしか必要ないですね。敢えて主キーを付けても活用されません。
ひとつの例でしたが、こんなもんでどうでしょう?
丁寧な説明をありがとうございました.
このあとも,上の例を参考にしながらいろいろ本を読んで調べていくうちに,
だいぶわかってきました.
MSACCESSのサンプル(Northwind)における受注明細テーブルでは,
主キーを連結キーとして設定してありますが,
これが実は外部キーなのだと思います.
とにかく,どうもありがとうございました.
No.6
- 回答日時:
storkです。
ymmasayanさんより指摘を受けました。
回答#4は、ちょっと言葉が足りなかったようです、すみません。
補足します。
>正規化すると、m_chappyさんのようにすべて1:nの
>テーブルになるが、重要性が低いので非正規化したと
>いうことではないでしょうか。
<修正>
正規化すると、m_chappyさんのように1:nのテーブルになります。
puplixさんのご質問のケースでは、重要性が低いので非正規化したためそのようなテーブルが出来上がったのではないでしょうか。
「重要性が低いので非正規化した」かどうかはわかりませんが,
非正規化についても必要でしょうから,
引き続き勉強していきたいと思います.
どうもありがとうございました.
No.5
- 回答日時:
No.4のstork さんの回答には誤解があるようです。
> 正規化すると、m_chappyさんのようにすべて1:nのテーブルになるが、重要性が低いので非正規化したということではないでしょうか。
部品表を2つに分けて、「製品別部品別仕入先表」を作り出したのは、あくまでも正規化であって、非正規化では有りません。m_chappy さんの言われる通り、重複を避けるために「リレーションを一つ実態に昇格させた」ので明らかに正規化です。本来の実態との間に違和感があり、又、データベースが複雑になったように見えるのも事実ですが、この事から単純に非正規化と断定できるものではないはずです。
非正規化については今後勉強していくつもりですが,
いまは正規化についてとことん身に付けようと思っています.
どうもありがとうございました.
No.4
- 回答日時:
正規化すると、m_chappyさんのようにすべて1:nのテーブルになるが、重要性が低いので非正規化したということではないでしょうか。
すべてを正規化すると、細かいテーブルがたくさん出来るので、簡略化したのだと思います。
ここで注意したいのは、『最初から正規化しなかった』と『重要性が低いので非正規化した』は結果が同じもしくは非常に似ていることが多いです。
しかし『最初から...』の場合は、データに対する認識がユーザと設計者の間で食い違っている場合があるので注意してください。システムの柔軟性が損なわれるおそれがあります。
お盆にDBの勉強をはじめたばかりなので,
非正規化については,まだまだ先のことになりそうです.
とにかく,回答をありがとうございました.
No.3
- 回答日時:
RDBの表には主キーが必ず必要だと言う話と、主キーの宣言を行うかどうかと言う話を分離する必要があるように思います。
No.2のm_chappy さんの言われる「主キーというのがそのテーブルの行をユニークに規定する独立したIDと考えると、その設置有無は必要性で判断すれば良いことです。」と言うのはそれを言われていると思います。
m_chappy さんの上げられた「製品別部品別仕入先テーブル」の例では
製品別部品別仕入先=製品ID+部品ID+仕入先ID
の主キーは、「製品ID+部品ID」で必要十分であるわけですが、あえてこれを主キーというかどうか、又、主キー宣言するかどうかということだと思います。
私は「主キーがない」のではなく「主キーはあるが、それを意識する必要がないし、主キー宣言も不要だ」と言うべきだと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
歩いた自慢大会
「めちゃくちゃ歩いたエピソード」を教えてください。 長時間でも長距離でも結構です。
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
外部参照してるキーを主キーにすることは可能?
その他(データベース)
-
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
-
4
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
5
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
6
Oracle 8i コンマ(,)を含むデータをinsertしたい
その他(データベース)
-
7
<a href=#" …>の意味を教えてください。"
HTML・CSS
-
8
DTOとEntityの差は何ですか。
Java
-
9
主キーの変更
Oracle
-
10
外部キーが設定されているテーブルのupdateについて
PostgreSQL
-
11
CREATE テーブルでの複数外部キーの設定
その他(データベース)
-
12
CloseとDisposeの違い
Visual Basic(VBA)
-
13
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
14
データを削除しても表領域の使用率が減りません
Oracle
-
15
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
16
svnでファイル移動すると履歴がついてこない
その他(コンピューター・テクノロジー)
-
17
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
男性と2人で飲食店に行きテーブ...
-
お金持ちのテーブル
-
まるいテーブル 円い 丸い 漢字...
-
L2SWはARPテーブルを持っている?
-
外部キーだけのテーブル(主キ...
-
ACCESS テーブルのRENAME
-
会社の飲み会の幹事になり、座...
-
コンボボックスにレコードセッ...
-
SQL 外部結合
-
MACアドレス見えない
-
[DB設計]多対多の問題点とは
-
MySQLで複数テーブルを作成する
-
テーブルリンク リンク元を知...
-
テーブル名の前のドットの意味
-
アクセスのリンクテーブル一覧...
-
複数テーブル表示
-
「テーブルに座って……」という...
-
(初歩的なSQL文?)あるテーブ...
-
飲み会で、座敷orテーブルどち...
-
オーダーの覚え方について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
L2SWはARPテーブルを持っている?
-
男性と2人で飲食店に行きテーブ...
-
外部キーだけのテーブル(主キ...
-
お金持ちのテーブル
-
テーブルリンク リンク元を知...
-
飲み会で、座敷orテーブルどち...
-
「テーブルに座って……」という...
-
面接のときテーブルが正面に。...
-
会社の飲み会の幹事になり、座...
-
オーダーの覚え方について
-
テーブル(構造)のコピー
-
論理名とコメント構文(?)について
-
MySQLで複数テーブルを作成する
-
SQL クエリ データ数
-
SQL 外部結合
-
アクセスのリンクテーブル一覧...
-
【エクセル】データテーブルの...
-
【PHP】SQL文のSUM関数で出力し...
-
件数の多い順にselect
-
1対1のリレーション(主キー同...
おすすめ情報