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

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

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

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

Q&A

解決済

1回答

2042閲覧

データベース外部キーの設計について

annderber

総合スコア98

MySQL

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

0グッド

0クリップ

投稿2016/12/01 10:55

編集2016/12/01 12:21

お世話になります。

mysqlの使用を想定したDBの外部キーの設計について、

例1
イメージ説明

のような1対多の関係にある2つのテーブルがあり、
userがitemを登録する前にデフォルトデータとしてitemを用意しておきたいので、
itemテーブルに特定のuserとは紐づかないデータがほしいといった場合、

例2
イメージ説明

のような1対1のテーブルがあったとして、
quotation(見積書)より先にpurchase_order(注文書)を出したいといった場合、

以上のような例について
皆様はどのような設計にしますか?
・親テーブルにダミーレコードを追加
・子テーブルにnullを許容
・親と子の間に関連用テーブルを追加

などなど

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

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

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

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

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

KSwordOfHaste

2016/12/01 11:32

ユーザーに紐づけたくないItemがなんの目的で必要なのかによると思います。目的のない設計は意味がありませんよね?
annderber

2016/12/01 12:33

ありがとうございます。修正しました
guest

回答1

0

ベストアンサー

1つ目の場合は、「サンプルデータ用ユーザー」というダミーのuserデータを用意する、あるいはリレーションしないitemはデータベース外で持っておく、という解決法がいいと思います。

2つ目については、明らかにリレーション(あるいはその運用)が悪いです。注文するには「見積もり」は欠かせないと思いますが、見積「書」は直接の因果関係とはなりません。ということで、「見積書と見積そのものを別テーブルにして、見積 has one 注文書とする」、というのが適切な解決策ではないかと思います

むろん、リレーションはそのままにして「注文書を作る場合、表示はしなくても見積書のデータは作っておく」という選択肢もありといえばありです。

投稿2016/12/01 12:57

maisumakun

総合スコア145064

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

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

annderber

2016/12/02 09:42

コメントありがとうございます。参考になります。 現在実際に1のような設計のテーブルでダミーレコードを用意して対応していたのですが、 この形に若干の気持ち悪さを感じ、nullを許容するのもありなのかなと思っていました。 コメントのおかげで自信が持てました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問