#7
by YuO » 6年前
解決していますが,別の考え方を。
「品目」とその「バリエーション」という考え方でメニューを構成する,という方法があります。
この方法だと,「特盛りカツ丼」を追加してもテーブル構造を変更する必用がありません。
ただ,品目とバリエーションの組み合わせでメニューの名前と値段が変わるので,本来であれば交差テーブルになるテーブルがメニューそのものになります。
コード:
CREATE TABLE item
(
item_id INTEGER PRIMARY KEY,
item_name TEXT NOT NULL
);
CREATE TABLE variation
(
variation_id INTEGER PRIMARY KEY,
variation_name TEXT NOT NULL
);
CREATE TABLE menu
(
menu_id INTEGER PRIMARY KEY,
item_id INTEGER NOT NULL,
variation_id INTEGER NOT NULL,
menu_name TEXT NOT NULL,
price INTEGER NOT NULL,
UNIQUE ( item_id, variation_id ),
FOREIGN KEY ( item_id ) REFERENCES item ( item_id ),
FOREIGN KEY ( variation_id ) REFERENCES variation ( variation_id )
);
INSERT INTO item ( item_id, item_name ) VALUES
( 1, 'カツ丼' ),
( 2, '天丼' ),
( 3, '親子丼 ');
INSERT INTO variation ( variation_id, variation_name ) VALUES
( 1, '普通盛り' ),
( 2, '大盛り' ),
( 3, '通常' ),
( 4, 'ビッグ' );
INSERT INTO menu ( menu_id, item_id, variation_id, menu_name, price ) VALUES
( 1, 1, 1, 'カツ丼', 700 ),
( 2, 2, 3, '天丼', 800 ),
( 3, 3, 1, '親子丼', 500 ),
( 4, 1, 2, '大盛りカツ丼', 800 ),
( 5, 2, 4, 'ビッグ天丼', 1000 );
「ビッグ天丼大盛り」のようなメニューがあり得るなら,menuから交差テーブルを分離して,variation_groupテーブルを追加し,
item_id → variation_group_id,menu_id → ( item_id, variation_id )の交差テーブルを作る形になるかと。
オフトピック
なんとなくアンチパターン臭がしている気がしますが,無視して進めます。
墨汁 さんが書きました:例えば、カツ丼と大盛りカツ丼って親子関係があると思うです。
たぶん,メニューの親子関係はないです。
概念上の「カツ丼」というのがあって,それの子として「カツ丼」と「大盛りカツ丼」があるのだと思います。
解決していますが,別の考え方を。
「品目」とその「バリエーション」という考え方でメニューを構成する,という方法があります。
この方法だと,「特盛りカツ丼」を追加してもテーブル構造を変更する必用がありません。
ただ,品目とバリエーションの組み合わせでメニューの名前と値段が変わるので,本来であれば交差テーブルになるテーブルがメニューそのものになります。
[code=SQL]CREATE TABLE item
(
item_id INTEGER PRIMARY KEY,
item_name TEXT NOT NULL
);
CREATE TABLE variation
(
variation_id INTEGER PRIMARY KEY,
variation_name TEXT NOT NULL
);
CREATE TABLE menu
(
menu_id INTEGER PRIMARY KEY,
item_id INTEGER NOT NULL,
variation_id INTEGER NOT NULL,
menu_name TEXT NOT NULL,
price INTEGER NOT NULL,
UNIQUE ( item_id, variation_id ),
FOREIGN KEY ( item_id ) REFERENCES item ( item_id ),
FOREIGN KEY ( variation_id ) REFERENCES variation ( variation_id )
);
INSERT INTO item ( item_id, item_name ) VALUES
( 1, 'カツ丼' ),
( 2, '天丼' ),
( 3, '親子丼 ');
INSERT INTO variation ( variation_id, variation_name ) VALUES
( 1, '普通盛り' ),
( 2, '大盛り' ),
( 3, '通常' ),
( 4, 'ビッグ' );
INSERT INTO menu ( menu_id, item_id, variation_id, menu_name, price ) VALUES
( 1, 1, 1, 'カツ丼', 700 ),
( 2, 2, 3, '天丼', 800 ),
( 3, 3, 1, '親子丼', 500 ),
( 4, 1, 2, '大盛りカツ丼', 800 ),
( 5, 2, 4, 'ビッグ天丼', 1000 );[/code]
「ビッグ天丼大盛り」のようなメニューがあり得るなら,menuから交差テーブルを分離して,variation_groupテーブルを追加し,
item_id → variation_group_id,menu_id → ( item_id, variation_id )の交差テーブルを作る形になるかと。
[offtopic]なんとなくアンチパターン臭がしている気がしますが,無視して進めます。[/offtopic]
[quote="墨汁" id=3,19462,147185]例えば、カツ丼と大盛りカツ丼って親子関係があると思うです。[/quote]
たぶん,メニューの親子関係はないです。
概念上の「カツ丼」というのがあって,それの子として「カツ丼」と「大盛りカツ丼」があるのだと思います。