前提
MySQL以外あまり知らないので、MySQLを前提とします。
聞きたいこと
リレーショナルデータベースの主キーはなぜ必要なのでしょう?
テーブルには主キーを設定することができますが、主キーを設定しないテーブルも作ることができます。
ユニーク制約や外部キー制約によって、テーブル内で一意にレコードが特定できるキーが存在する場合、主キーはなくても問題ないのでしょうか?
補足
個人的には、テーブルには主キーが設定されているのが当然だと思っていますが、
なぜ設定されていて当然なのかうまく説明できないため、本質問をさせていただきます。
7/15 3:10追記
DB設計の概念的な意味での主キーと、
実際のテーブルの設定としての主キーの二つの意味があると思ったので、補足します。
概念的には主キーが存在するテーブル(非Nullableかつユニーク制約があるカラムが存在する)について、
テーブルの設定として主キーを設定しないメリットはありますか? というのがお聞きしたい内容です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答8件
0
概念的には主キーが存在するテーブル(非Nullableかつユニーク制約があるカラムが存在する)について、
テーブルの設定として主キーを設定しないメリットはありますか? というのがお聞きしたい内容です。
ログなんかはこれに該当するんじゃないでしょうか、無駄な制約もインデックスもいらないと思うので。
例えば特に参照する予定の無い、ログを溜め込む事だけが目的のテーブルには主キーつけなくてもいいと思います
テーブル自体は一定期間単位(一年とか)で分けておいて、既定の期間が過ぎたら圧縮するなり削除するなししていく
税務署対策に過去5~7年分の取引の記録を取っておくようなものに近いかも
万が一記録の提出を求められたらそのままログを提出、みたいな
外部キーはデータ次第ですね。他のテーブルと合わせて整合性が取れている必要があるかどうかなので、整合性が取れてる必要の無いログなら外部キーもいらない
もちろんそのログを元にデータを集計したり統計取ったりとかする予定があるならキーはあった方がいいですね
実際にこれらの用途をした事は無くて今思い付くものを回答しただけなので、他にも色々パターンあるかも
投稿2019/07/14 19:07
総合スコア6426
0
概念的には主キーが存在するテーブル(非Nullableかつユニーク制約があるカラムが存在する)について、
テーブルの設定として主キーを設定しないメリットはありますか? というのがお聞きしたい内容です。
外部からの取込データを一時的に格納するテーブルなどは、主キーとはせず候補キーとすることで一旦は取り込めるというメリットがあります。
※マスターとチェックするとかがあると一旦取り込んでからの方が効率が良かったりしますので。
主キーが設定されるのは、DBMSにとって効率が良いという事も当然ありますので、使い捨てするようなデータでない限り、基本的に設定するものと考えておいた方が良いものです。
尚、質問されている主キーはナチュラルキーを指しているものと思いますが、主キーをサロゲートキーにするかナチュラルキーにするかは、状況に応じてですけど。
投稿2019/07/15 10:19
総合スコア25327
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ユニーク制約や外部キー制約によって、テーブル内で一意にレコードが特定できるキーが存在する場合、主キーはなくても問題ないのでしょうか?
そのような列が存在するなら、それを主キーに設定する、という選択肢もあるかと思うのですが。
ただし、フレームワークの都合上、特定の形の主キーが必要になるような状況も考えられますし、複合主キーも扱いづらい面はあります。
投稿2019/07/17 02:21
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
社員マスターで考えてみましょう。同性同名って珍しくありません。総務部の山田太郎さんと営業部の山田太郎さんをいちいち使い分けるのは大変ですし、他の部門に移動したら、結婚などで名字が変わったら、って情報を加味して山田太郎さんの社内での移動情報を管理するとシステムはとっても複雑になります。出張の旅費精算、家族手当などもろもろのシステムでどの社員かをきちんと特定できないと経理部が怒り出します。
そこで、社員IDなどの入社から退社までずっと変わらずにその人を特定できる主キーを持つと、主キーだけで社員を特定できてシステムもかなりシンプルになります。
投稿2019/07/14 17:42
総合スコア16417
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/14 21:02
2019/07/15 05:32
0
--->ユニーク制約や外部キー制約によって、テーブル内で一意にレコードが特定できるキーが存在する場合、主キーはなくても問題ないのでしょうか?
やり続けるとテーブル数は少なくて済むと思いますが、なんだかんだでカラムが増えやすくなると思います。そうなると、保守性(メンテナンスなど)という観点からあまりよくない設計方法になると思います。人のミスも増えますし...。なので、外部キーを設定することによってリレーションを構築し、データ間のつながりを直感的にわかりやすくするのが良いのではないかと思います。
昔、以下のURLで直感的に理解できたので、もし良かったら参考にしていただければと思います。
https://www.accessdbstudy.net/entry/20141020/p1#02000
投稿2019/07/14 17:41
総合スコア1408
0
ベストアンサー
主キーは必要ではありません。
ご自身で書いている通り、
主キーを設定しないテーブルも作ることができます。
これが可能なので。(必要、なら強制になるはずです)
「データを一意に識別できるキー」は複数の候補が存在する可能性があり、テーブルによって参照するものがバラバラだと困るので、代表として1つに定めるもの、と思えばわかりやすいんじゃないでしょうか。
投稿2019/07/14 17:38
総合スコア8947
0
主キーは特定や重複問題が発生する等用途がある場合のみ、必要ならば付ければよいです。ので、貴方の感覚は正しいと思います。忖度して「主キーがあって当然」と思う必要はないと思います。
SQLアンチパターンという書に、アンチパターンとして「とりあえずIDを付ける」というのを紹介する以下の章があります。
3章 IDリクワイアド(とりあえずID) 3.1 目的:主キーの規約を確立する 3.2 アンチパターン:すべてのテーブルに「 id」列を用いる
投稿2019/07/23 01:03
編集2019/07/23 01:04退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/15 04:42