データベースで、親子のようで同一のリーレーションの表現の仕方
Posted: 2017年8月05日(土) 01:16
データベースのリレーションを考えていて、どうしても正規化の仕方が分からない事例に直面したので質問させていただきます。
例えば、下のようにMenuというテーブルがあるとします。
着目していただきたいのは、カツ丼と天丼には大盛りが存在するが、親子丼には存在しないというところです。
Menu TABLE
id name price
1 カツ丼 700円
2 天丼 800円
3 親子丼 500円
4 大盛りカツ丼 800円
5 ビッグ天丼 1000円
ここで、検索という機能を考えます。しかし検索結果に上の5件が出るのは冗長であり、ユーザ視点からは「メニューにはカツ丼、天丼、親子丼の3品が存在し、なかには大盛り可能なものもある」と言うことふうに表示がしたいです。
検索結果
id name price has_big big_name big_price
1 カツ丼 700円 大盛りあり 大盛りカツ丼 800円
2 天丼 800円 大盛りあり ビッグ天丼 1000円
3 親子丼 500円 大盛りなし NULL NULL
ただ、検索結果はこのようになってほしいのですが、下のように更に売り上げテーブルを作りたく、その場合は最初のMenuテーブルのような形のほうが扱いが楽です。
例えば下の売上テーブルは「8/5に、カツ丼、ビッグ天丼、大盛りカツ丼の3品が売れた」ということを表します。
売上 TABLE
id menu_id selled_at
1 1 2017-08-05
2 5 2017-08-05
3 4 2017-08-05
今回お聞きしたいのはMenuテーブルの正規化方法です。
例えば、カツ丼と大盛りカツ丼って親子関係があると思うです。しかし、売上テーブルからみたらカツ丼と大盛りカツ丼は親子とか関係なく、あくまで「どっちもメニューの1つ」ということだけで扱いたいです。
単純に正規系を満たしたいだけなら、検索結果の例をそのままテーブル化してしまえばいいだけです。しかし、そうすると売上テーブルで何が売れたかをうまく管理できなくなります。(大盛りが売れたときにそのことを書き込めない)
売上テーブルで何が売れたかをうまく管理しつつ、メニューテーブルを正規化するにはどうすればよいでしょうか?
よろしくお願いします。
「Menuテーブルはリンク関係をお互いのタプルが持ったり持たなかったりする、明らかに第3正規形を満たさない(?)構造です。これをもっとも正規化された形にするにはどうすればよいでしょうか」です。
例えば、下のようにMenuというテーブルがあるとします。
着目していただきたいのは、カツ丼と天丼には大盛りが存在するが、親子丼には存在しないというところです。
Menu TABLE
id name price
1 カツ丼 700円
2 天丼 800円
3 親子丼 500円
4 大盛りカツ丼 800円
5 ビッグ天丼 1000円
ここで、検索という機能を考えます。しかし検索結果に上の5件が出るのは冗長であり、ユーザ視点からは「メニューにはカツ丼、天丼、親子丼の3品が存在し、なかには大盛り可能なものもある」と言うことふうに表示がしたいです。
検索結果
id name price has_big big_name big_price
1 カツ丼 700円 大盛りあり 大盛りカツ丼 800円
2 天丼 800円 大盛りあり ビッグ天丼 1000円
3 親子丼 500円 大盛りなし NULL NULL
ただ、検索結果はこのようになってほしいのですが、下のように更に売り上げテーブルを作りたく、その場合は最初のMenuテーブルのような形のほうが扱いが楽です。
例えば下の売上テーブルは「8/5に、カツ丼、ビッグ天丼、大盛りカツ丼の3品が売れた」ということを表します。
売上 TABLE
id menu_id selled_at
1 1 2017-08-05
2 5 2017-08-05
3 4 2017-08-05
今回お聞きしたいのはMenuテーブルの正規化方法です。
例えば、カツ丼と大盛りカツ丼って親子関係があると思うです。しかし、売上テーブルからみたらカツ丼と大盛りカツ丼は親子とか関係なく、あくまで「どっちもメニューの1つ」ということだけで扱いたいです。
単純に正規系を満たしたいだけなら、検索結果の例をそのままテーブル化してしまえばいいだけです。しかし、そうすると売上テーブルで何が売れたかをうまく管理できなくなります。(大盛りが売れたときにそのことを書き込めない)
売上テーブルで何が売れたかをうまく管理しつつ、メニューテーブルを正規化するにはどうすればよいでしょうか?
よろしくお願いします。
「Menuテーブルはリンク関係をお互いのタプルが持ったり持たなかったりする、明らかに第3正規形を満たさない(?)構造です。これをもっとも正規化された形にするにはどうすればよいでしょうか」です。