質問: お世話になります。 mysqlの使用を想定したDBの外部キーの設計について、 例1 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/86ac0b1307048e67e15dea57d871cc97.png) のような1対多の関係にある2つのテーブルがあり、 userがitemを登録する前にデフォルトデータとしてitemを用意しておきたいので、 itemテーブルに特定のuserとは紐づかないデータがほしいといった場合、 例2 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/effa2410c141c5c6c616105793f27b42.png) のような1対1のテーブルがあったとして、 quotation(見積書)より先にpurchase_order(注文書)を出したいといった場合、 以上のような例について 皆様はどのような設計にしますか? ・親テーブルにダミーレコードを追加 ・子テーブルにnullを許容 ・親と子の間に関連用テーブルを追加 などなど
回答: 1つ目の場合は、「サンプルデータ用ユーザー」というダミーのuserデータを用意する、あるいはリレーションしないitemはデータベース外で持っておく、という解決法がいいと思います。 2つ目については、明らかに**リレーション(あるいはその運用)が悪い**です。注文するには「見積もり」は欠かせないと思いますが、見積「書」は直接の因果関係とはなりません。ということで、「見積書と見積そのものを別テーブルにして、見積 has one 注文書とする」、というのが適切な解決策ではないかと思います むろん、リレーションはそのままにして「注文書を作る場合、表示はしなくても見積書のデータは作っておく」という選択肢もありといえばありです。