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

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

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

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

6回答

2895閲覧

外部キーにnullを入れない設計をしたい

zendendo

総合スコア43

MySQL

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

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

1クリップ

投稿2018/12/12 00:54

編集2018/12/12 02:20

前提・実現したいこと

データベースにはmysqlを使い、送金を記録するシステムをつくりたいと考えています。

送金が行われたら記録をするのですが、想定される状況として
「注文なしで行われる送金」(送金のみ)と、
「注文ありで行われる送金」(何かを購入して送金した)と、
「一つの注文から複数の送金」が
あるとします。

この場合、以下のようなデータベース構造になるかと思います。

注文テーブル

ID取引先ID担当ユーザーID合計額

注文詳細

ID品物ID品物数量品物価格

送金記録テーブル

ID送金額担当ユーザーID注文ID

※担当ユーザーテーブルと取引先テーブルと品物テーブルは問題の箇所ではないため省略しています。

###問題点
ただ、上記のようなデータベース構造では送金記録テーブルの注文IDがない(NULL)パターンが発生することがあるので、外部キー制約にひっかかってしまい作成することができません。

NULLを許容するという方法も考えたのですが、調べたところ「極力nullはさけた方がいい(値ありか空値かnullかという確認がややこしくなるから)」と書かれていたため、not nullなデータベース構造にしたいと考えています。

今回の様なケースの場合でも、not nullなデータベース構造にすることはできるのでしょうか?
教えて頂ければ幸いです。

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

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

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

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

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

guest

回答6

0

極力nullはさけた方がいい(値ありか空値かnullかという確認がややこしくなるから)

質問の根拠である上記の情報源は何でしょう?
「極力nullはさけた方がいい」については前提条件がありませんでしたか?

内容からすると、Not Null制約は付けるべきでは無いと思われます。

※どうしてもという事であれば、注文IDが取り得ない値をデフォルト値に設定することでしょうか。

投稿2018/12/12 01:18

編集2018/12/12 01:39
sazi

総合スコア25173

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

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

0

今回の様なケースの場合でも、not nullなデータベース構造にすることはできるのでしょうか?

「送金だけのダミーの注文を記録する」というような方法はあるかと思いますが、状況によっては余計に煩雑になる気はします。

投稿2018/12/12 01:01

maisumakun

総合スコア145183

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

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

zendendo

2018/12/12 06:46 編集

回答ありがとうございます。 送金のみのダミー注文(と注文詳細)についてなのですが、1件だけダミー注文を作成して、送金記録を作成するとき「送金のみ」しかない場合は、このダミー注文IDを入れておけばいいということでしょうか?
guest

0

「一つの注文から複数の送金」に対して「複数の注文に対して一つの送金で済ます」
ことがあるかどうかで処理が変わります

正直注文テーブルにダミーで「注文なし」というレコードを1つ作っておけばよいだけのような気がしますが・・・

投稿2018/12/12 02:08

編集2018/12/12 02:10
yambejp

総合スコア114784

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

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

0

モデルとして考えられているのはおそらく
[注文]0..1 ------ 0..*[送金記録]
だと思います。

現状の業務はそうなのでしょう。
しかし拡張性を考えると複数の注文に対して送金をまとめることも考慮しておくことをお勧めします。
[注文]0..* ------ 0..*[送金記録]
この場合には中間テーブルを作って多対多結合を表現します。

投稿2018/12/12 01:56

hihijiji

総合スコア4150

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

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

zendendo

2018/12/12 06:55

回答ありがとうございます。 確かによくよく考えたら複数の注文をまとめるケースも 発生するかもしれません。 そう考えると、多対多にしとく必要がありますね。ついでに、中間テーブルを作ったことで送金記録テーブルの注文idカラムを作る必要がなくなり、nullの問題もなくなりますね。
hihijiji

2018/12/12 08:03

売掛に対する入金なども多対多パターンを採用することが多いです。 モデリングパターンは多いようでも、会計-経理-帳簿付けはわりと似たり寄ったりなのです。
guest

0

以前にも似たような質問がありましたのでリンクしておきます。
https://teratail.com/questions/157051

今回のケースではNULLを許容でよいと思います。
NULLを許容しないのであれば、注文なしでも注文なし用の注文テーブル・注文詳細のレコードを作るしかないのでは。
どちらもメリット・デメリットはあるので、業務内容から検討するしかないですね。
注文なしが頻発するのであれば、NULLを許容していないと注文テーブル・注文詳細にダミー的なレコードが溢れることになって管理しづらくなるとかあるかもしれません。

投稿2018/12/12 01:36

ttyp03

総合スコア16998

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

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

0

業務内容がよく分からないのですが、つまり「送金だけの注文がある」という事でしょうか?

あと、よくある設計としては、IDは1からにして、0を空と見るのもありますね。

投稿2018/12/12 01:11

yoorwm

総合スコア1305

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

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

zendendo

2018/12/12 07:39

回答ありがとうございます。 nullの代わりになる値を入れて、not nullを表現するということですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問