質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

403閲覧

SQLにおけるキー制約

Chandler_Bing

総合スコア673

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

1グッド

0クリップ

投稿2018/12/24 15:03

以下のSQLのテーブルは生徒の講義受講履歴です。
生徒のIDと講義番号を格納します。生徒ID,講義番号で一つの値とします(この並びの重複は許さない)。

SQL

1CREATE TABLE `classhistories` ( 2 `classhistory_id` INT(11) NOT NULL AUTO_INCREMENT, 3 `student_id` varchar(100), 4 `class_id` INT(11), 5 PRIMARY KEY (`classhistory_id`), 6 UNIQUE KEY `ix01_classhistories` (`student_id`,`class_id`) 7)

このSQL文ではstudent_id、class_idを一つのように捉えてえいるため
student_id、class_id(1,3)が存在すればstudent_id、class_id(1,3)という1,3 の並びは挿入してもエラーが返ってきますがこのSQL分について質問が複数あります。

質問❶
PRIMARY KEY (classhistory_id)が特に必要でない場合、classhistory_idを削除し
PRIMARY KEYをstudent_id、class_idをこの二つにつけるという運用でも問題ないでしょうか。そういう例をいくつか見かけた気がします。

質問❷
UNIQUE KEY ix01_classhistories (student_id,class_id)のようにしている理由は
student_id、class_idの並びの重複だけ気にすれば良いため、UNIQUE KEYとPRIMARY KEYを分けているのでしょうか。(つまりを3つのカラムの値全てで一つとして捉える必要がないからでしょうか)

bochan2👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

質問❶

このテーブルだけ見ると問題ない気はしますが、全体的な設計レベルの話かと思います。

質問❷

サロゲートキーという考え方があります。
業務キーとシステムキーを分けたいのではないかと。
ただ、履歴なのに一意制約があるのは気持ち悪いです。

投稿2018/12/24 16:34

szk.

総合スコア1400

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

前回の質問の講義と学部、及びその関係テーブルは一般にマスタデータと呼ばれます。
今回の、講義受講履歴のようなものはトランザクションデータと呼ばれます。
(※トランザクション処理と混同しやすいので注意)
マスタデータはナチュラルキーを使うことが結構あります。
キーアンドバリューのように構造がシンプルで、かつ変更することが稀の場合はナチュラルキーのほうが向いているのです。
トランザクションデータはサロゲートキー(人工キー)一択です。理由は以下に述べます。

質問❶
直接SQLを叩く場合はナチュラルキーを使ってもサロゲートキーを使っても大差ないかもしれません。
しかし、フレームワークやミドルウェアを使う場合はPRIMARY KEYの変更が出来なかったり、変更が面倒だったりします。
一度登録した生徒ID-講義番号を変更しない前提だとしても、アプリケーションを組む場合は誤入力も考慮する必要があります。
プログラマによってはナチュラルキーを見たとたん露骨に嫌な顔をしたり、「ゲッ」とか言ったりします。

質問❷
UNIQUE KEY はその名の通り重複を避けるためのものです。多くのDBMSではインデックスもおまけについてきます。
ナチュラルキーにすれば不要かもしれませんが、ナチュラルキーはやめておいたほうが無難です。

投稿2018/12/25 05:28

hihijiji

総合スコア4150

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2018/12/25 06:53

ありがとうございます。 では、私の解釈で問題ないということでしょうか。
hihijiji

2018/12/25 07:00 編集

提示のSQLがベストプラクティスです。 classhistory_idはそのまま残しておいて下さい。
guest

0

基本的に主キーはレコードを特定するためだけに使い、検索項目として利用しない方が
良いという考え方があります。
したがって例示のようにauto_incrementによって処理された主キーを独立して持ったほうが
よりSQL的なデータ管理になります。

ただし、実際問題として複合キーで主キーは持てますし、マスターデータに外部キー制約を
かけるときなどはidとなるコードに主キーを与えることもあるので必要性にあわせた
対応をすれば良いと思います

投稿2018/12/25 02:27

yambejp

総合スコア114585

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chandler_Bing

2018/12/25 05:11

いつもありがとうございます。 私の解釈で正しいという事でございますか。
yambejp

2018/12/25 05:32

回答したとおり正しくはないです しかし場合によってはそういう解釈でも問題ない場合があるということです
Chandler_Bing

2018/12/25 06:54

ありがとうございます。 質問❷の解釈であれば 問題ないでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問