2年前データベースのリレーションを考えていて、どうしても正規化の仕方が分からない事例に直面したので質問させていただきます。下のようにMenuというテーブルがあるとします。着目していただきたいのは、カツ丼と天丼には大盛りが存在するが、親子丼には存在しないというところです。1000円ここで、検索という機能を考えます。検索結果に上の5件が出るのは冗長であり、ユーザ視点からは「メニューにはカツ丼、天丼、親子丼の3品が存在し、なかには大盛り可能なものもある」と言うことふうに表示がしたいです。NULLただ、検索結果はこのようになってほしいのですが、下のように更に売り上げテーブルを作りたく、その場合は最初のMenuテーブルのような形のほうが扱いが楽です。下の売上テーブルは「8/5に、カツ丼、ビッグ天丼、大盛りカツ丼の3品が売れた」ということを表します。TABLEidmenu_idselled_at112017-08-05252017-08-05342017-08-05今回お聞きしたいのはMenuテーブルの正規化方法です。カツ丼と大盛りカツ丼って親子関係があると思うです。売上テーブルからみたらカツ丼と大盛りカツ丼は親子とか関係なく、あくまで「どっちもメニューの1つ」ということだけで扱いたいです。単純に正規系を満たしたいだけなら、検索結果の例をそのままテーブル化してしまえばいいだけです。すると売上テーブルで何が売れたかをうまく管理できなくなります。(大盛りが売れたときにそのことを書き込めない)売上テーブルで何が売れたかをうまく管理しつつ、メニューテーブルを正規化するにはどうすればよいでしょうか?よろしくお願いします。「Menuテーブルはリンク関係をお互いのタプルが持ったり持たなかったりする、明らかに第3正規形を満たさない(?)構造です。これをもっとも正規化された形にするにはどうすればよいでしょうか」です。投稿の最後に、下書きのときに書いていた二行が入ってしまいましたが、あまり関係なことなので流してください。テーブルがどうにも見づらそうだったので、Excelで清書して画像化してみました。2年前いろいろ方法はありますが、Menuに4つめのフィールド「big_id」を追加してはどうかと。カツ丼の「big_id」は4、親子丼の「big_id」はnullです。select文は判りますよね。将来、大盛りの他に特盛やメガ盛りを追加するならば、逆に「base_id」を大盛りのメニューに設定するようにした方がスマートかも。複雑な要件の場合、親子関係を表現するテーブルを別に用意した方が判りやすくもなるでしょうが、現在必要な機能のみを実現する最小限の方法がお勧めです。たいちうさん面倒な問題なのに読んで頂き、その上ご返信までしていただいてありがとうございます。方法はありますが、Menuに4つめのフィールド「big_id」を追加してはどうかと。カツ丼の「big_id」は4、親子丼の「big_id」はnullです。select文は判りますよね。将来、大盛りの他に特盛やメガ盛りを追加するならば、逆に「base_id」を大盛りのメニューに設定するようにした方がスマートかも。複雑な要件の場合、親子関係を表現するテーブルを別に用意した方が判りやすくもなるでしょうが、現在必要な機能のみを実現する最小限の方法がお勧めです。big_id」で複合主キーにするということでしょうか?たしかにそれなら検索もidだけですればよく、また売上テーブルもほとんど変更なく管理できそうです。した場合について、1つ疑問が浮かんだのですが、このような場合にはどうすれば対処できますか?・Menuテーブルに新たにinsertする場合に、主キーをどのように設定させればいいか?Menuテーブルに、新たにうな丼をinsertする場合、複合主キーの状態だとautoincrementは効かないと思います。big_idのNULLで無い方のキーの値に+1して、それをうな丼のidにするということになるでしょうか。big_idのNULLで無い方のキー」を同時に取得されると、次の主キーが同じになって挿入されてしまう)が起こりそうなので、できればSQLだけで完結させたいです。big_id」で複合主キーにするということでしょうか?主キーはidのみ、big_idは外部キーです。big_id」で複合主キーにするということでしょうか?主キーはidのみ、big_idは外部キーです。それなら、挿入時に困ることもないし、「big_idで誰からも指されていないidはノーマルサイズである」と言えて検索もできそうですね。実際にコードを書いて動かしたところうまく動いてくれました、基本の構成を変えないような形を教えていただけたので売上テーブルからの参照にも影響なさそうです。たいちう様、どうもありがとうございました。将来このスレッドを見た人のためにsqliteで教えていただいたことを試してみたコードを貼っておきます。解決していますが,別の考え方を。「品目」とその「バリエーション」という考え方でメニューを構成する,という方法があります。この方法だと,「特盛りカツ丼」を追加してもテーブル構造を変更する必用がありません。品目とバリエーションの組み合わせでメニューの名前と値段が変わるので,本来であれば交差テーブルになるテーブルがメニューそのものになります。)の交差テーブルを作る形になるかと。オフトピックなんとなくアンチパターン臭がしている気がしますが,無視して進めます。カツ丼と大盛りカツ丼って親子関係があると思うです。メニューの親子関係はないです。概念上の「カツ丼」というのがあって,それの子として「カツ丼」と「大盛りカツ丼」があるのだと思います。ミクプラは自由にリンクできます。