商品とセット商品のデータの持ち方!データベース(DB)のテーブル設計
2023年10月07日2023年10月10日 PR
飲食店のWebアプリを開発にあたり商品とセット商品のデータの持ち方を考えてみました。
データベース(DB)のテーブル設計として例を紹介できればと思います。
与えらえた仕様
今回のWebアプリ開発の仕様になります。
- セット商品は単品の商品を使って安く提供したい。
- セット商品は単品の寄せあつめだが、セット商品として在庫を持ちたい。
- 在庫は大量注文を防ぐために簡易的でよい
DBのテーブルを設計
与えられた仕様をもとにテーブル設計を行います。
ER図のイメージ
ER図になります。ER図はテーブル間の関連が分かれば良いと思っているので項目名とかは割愛しています。
テーブルのデータ
■商品テーブル(products)
id | product_type | name | price | stock_count |
---|---|---|---|---|
1 | 1 | 弁当A | 500 | 100 |
2 | 1 | 弁当B | 500 | 100 |
3 | 1 | 味噌汁 | 100 | 100 |
4 | 1 | サラダ | 100 | 100 |
5 | 2 | セット商品A | 550 | 100 |
6 | 2 | セット商品B | 550 | 100 |
※ product_type・・・1:単品 2:セット商品
■セット商品テーブル(product_components)
id | product_id | component_product_id | display_order |
---|---|---|---|
1 | 5 | 1 | 1 |
2 | 5 | 2 | 2 |
3 | 6 | 3 | 1 |
4 | 6 | 4 | 2 |
セット商品テーブルでセット商品で販売する商品テーブルの情報を管理しています。
在庫に関しては簡易的に数字で増減を管理できるようにしています。
データの取得について
フレームワークを使用している場合は、リレーションシップで簡単に取得できます。
商品一覧であれば、商品テーブル(products)からデータを取得します。
※ Laravelで書いています。
Laravel
$products = Product::query()->get();
foreach ($products as $product) {
// 商品ID
$product->id;
// 商品名
$product->name;
}
商品詳細でセット商品に紐づく商品を表示する場合。
Laravel
products = Product::query()->with('productComponents.product')->get();
oreach ($products as $product) {
// 商品ID
$product->id;
// 商品名
$product->name;
foreach ($products->productComponents as $productComponent) {
// セット商品に紐づく商品ID
$productComponent->product->id;
// セット商品に紐づく商品名
$productComponent->product->id;
}
}
フレームワークのリレーションシップ機能を使用すれば簡単にデータ取得ができます。
最後に
データベース(DB)のテーブル設計は、要件によってデータの持ち方が大きく変わります。
また設計者によっても変わってきます。何が正解はありませんので運用保守、コーディング時のデータの取得方法を考えながら設計すると良いと思います。
おすすめ書籍
テーブル設計で参考にしている書籍です。書籍で紹介されているテーブル設計をもとに業務に活かしたりしています。テーブル設計で悩んだら読んでみてください。
コメント
コメントを残す