データベースのテーブルについておたずねします.
主キーがなくて,そのかわりに外部キー(と主キー以外の列)しか持たない
テーブルも可能だと聞きました.
テーブルには主キーが必ずあるものだと思っていましたが,
どのような使いかたをするのでしょうか.
どうやら,最初からデータがあるわけではなく,
追加されるタイミングがわからないデータを格納する場合に作っておく,
ということらしいのですが,なんのことかよくわかりません.
データベース関連書籍をいくつか調べましたが,
主キーのないテーブルの説明などは見当たりません.
また,この悩ましい問題を与えてくれた知り合いに訊ねましたが,
テーブル構成などの具体的なことは,
企業内のことなので,教えてもらえませんでした.
何か具体的な例を交えながらご説明いただければと思います.
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で質問しましょう!
似たような質問が見つかりました
- Oracle SQLについて教えて下さい。 主キーを持ったカラムを主キーの機能を持たせたまま カンマ区切りで文字列 1 2023/03/27 22:47
- MySQL 複数DBテーブルからのデータ取得 3 2022/05/17 15:02
- その他(データベース) IT用語について質問です。 以前ITパスポートの試験を受けた際にデータベースが何の集まりかについての 2 2022/12/10 12:29
- Access(アクセス) Accessテーブルの結合で別々のテーブルのフィールドを組み合わせて値を出す方法について 2 2022/07/20 19:43
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- Oracle sqlのupdate文で質問です。 テーブルBの番号をキーにテーブルAの身長をテーブルBの身長に更新 2 2022/11/02 15:15
- Oracle sqlで質問です。 Aテーブルの情報をBテーブルに更新かけたいです。 やりたいことは、Bテーブルの受 1 2023/05/17 11:17
- Oracle update文で質問です。 下記の条件でupdateをしたいですが、どのようにしたら良いでしょうか。 2 2022/06/23 10:51
- Access(アクセス) Access クエリ 同一テーブル内 複数フィールドの同時集計のやり方について 1 2022/05/18 19:01
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
「平成」を感じるもの
「昭和レトロ」に続いて「平成レトロ」なる言葉が流行しています。 皆さんはどのようなモノ・コトに「平成」を感じますか?
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
外部参照してるキーを主キーにすることは可能?
その他(データベース)
-
「マスタ」と「テーブル」の違いとはなんでしょうか?
Oracle
-
-
4
データベース関係で、データの洗い替えとはどのような事を行うことでしょう
IT・エンジニアリング
-
5
主キーにインデックスは貼らないと駄目でしょうか?
SQL Server
-
6
ADOを使ったDBアクセス後のメモリ解放
その他(データベース)
-
7
ループ処理の際、最後だけ,"をつけたくない"
Java
-
8
Integer変数をカラにしたいのですが
Visual Basic(VBA)
-
9
エクセルでブック内の倍率がバラバラなので、一括ですべてのシートの倍率を
Excel(エクセル)
-
10
ZIP解凍時のinflatingとは?
その他(パソコン・スマホ・電化製品)
-
11
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
12
「タイプ初期化子が例外をスローしました」エラー何?
Visual Basic(VBA)
-
13
DBの定義のサイズを大きくし過ぎると問題ある?
その他(データベース)
-
14
【DB】同じトランザクション内でupdateとselectをしたときの結果値
その他(データベース)
-
15
sqlserverで集計結果をUPDATEしたいです
SQL Server
-
16
python エラー
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「テーブルに座って……」という...
-
会社の飲み会の幹事になり、座...
-
外部キーだけのテーブル(主キ...
-
SQLでテーブルの値を集計して、...
-
飲み会で、座敷orテーブルどち...
-
テーブルリンク リンク元を知...
-
L2SWはARPテーブルを持っている?
-
【エクセル】データテーブルの...
-
論理名とコメント構文(?)について
-
面接のときテーブルが正面に。...
-
スペース区切りによるAND検索を...
-
MySQLで複数テーブルを作成する
-
アクセスのリンクテーブル一覧...
-
EXCEL マクロで行を挿入して貼...
-
UTF8のテーブルをODBCドライバ...
-
LAG関数に似た関数があればご教...
-
【PHP】SQL文のSUM関数で出力し...
-
オーダーの覚え方について
-
SQLです教えてください。
-
[DB設計]多対多の問題点とは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
L2SWはARPテーブルを持っている?
-
「テーブルに座って……」という...
-
まるいテーブル 円い 丸い 漢字...
-
男性と2人で飲食店に行きテーブ...
-
外部キーだけのテーブル(主キ...
-
会社の飲み会の幹事になり、座...
-
テーブルリンク リンク元を知...
-
お金持ちのテーブル
-
飲み会で、座敷orテーブルどち...
-
【エクセル】データテーブルの...
-
【PHP】SQL文のSUM関数で出力し...
-
アクセスのリンクテーブル一覧...
-
論理名とコメント構文(?)について
-
オーダーの覚え方について
-
面接のときテーブルが正面に。...
-
取数計算
-
1対1のリレーション(主キー同...
-
バイキングのトレーの形
-
SQL 外部結合
-
UTF8のテーブルをODBCドライバ...
おすすめ情報