Database design 数据库设计[项目详情、成分]

Database design 数据库设计[项目详情、成分],database-design,Database Design,我有以下表格结构: 项目 身份证 名字 价格 身份证 成本 项目\u id\u fk 比如说,商品名称是“含可乐和炸薯条的汉堡”。这三个项目在项目表中被视为单个项目。要计算出项目,我的想法是创建下表: 项目(详情) 身份证 名称 项目\u id\u fk 成分 身份证 名称 bundle\u id\u fk 因此,在项目_详情下,我可以添加“汉堡”、“可乐”、“炸薯条”。然后,我可以为每个项目添加各自的成分 因此,它被认为是一个好的设计吗?hm。。不是真的!商品、价格和细节之间存在一对一的关系

我有以下表格结构:

项目 身份证 名字

价格 身份证 成本 项目\u id\u fk

比如说,商品名称是“含可乐和炸薯条的汉堡”。这三个项目在项目表中被视为单个项目。要计算出项目,我的想法是创建下表:

项目(详情) 身份证 名称 项目\u id\u fk

成分 身份证 名称 bundle\u id\u fk

因此,在项目_详情下,我可以添加“汉堡”、“可乐”、“炸薯条”。然后,我可以为每个项目添加各自的成分


因此,它被认为是一个好的设计吗?

hm。。不是真的!商品、价格和细节之间存在一对一的关系

我想你需要更像这样的东西

餐桌

id  meal_name
id  meal_id  item_id
id   name   price   description
id   item_id   ingredient_id
id  name
餐饮项目表

id  meal_name
id  meal_id  item_id
id   name   price   description
id   item_id   ingredient_id
id  name
项目表

id  meal_name
id  meal_id  item_id
id   name   price   description
id   item_id   ingredient_id
id  name
项目成分表

id  meal_name
id  meal_id  item_id
id   name   price   description
id   item_id   ingredient_id
id  name
配料表

id  meal_name
id  meal_id  item_id
id   name   price   description
id   item_id   ingredient_id
id  name
然后是另一张桌子,像

这个想法是。。。三餐可以有很多项目。。。物品可以有多种成分。
有了它,MySQL可以很容易地算出每顿饭的价格

此查询将显示膳食25中使用的所有成分:

SELECT ig.*
FROM `item_ingredients` as ii,
    `ingredients` as ig,
    `meal_items` as mi,
    'meals` as me
WHERE me.`id` = 25
  AND mi.`meal_id` = me.`id`
  AND ii.`item_id` = mi.`item_id`
  AND ig.`id` = ii.`ingredient_id`
这将显示第25餐的价格总和:

SELECT SUM(it.`price`)
FROM `items` as it,
    `meal_items` as mi,
    'meals` as me
WHERE me.`id` = 25
  AND mi.`meal_id` = me.`id`
  AND it.`id` = mi.`item_id`

如果这将成为排序系统的一部分,则需要使用表继承,以便可以将外键从订单行项指向一个表,而不使用表继承

您需要了解数据库表继承

为了简单起见,我们将使用单表继承

模式:

create table product_types (
  product_type_id int primary key,
  name text not null,
  parent_id int null references product_types(product_type_id)
);

create table products (
  product_id int primary key,
  type int not null references product_types(product_type_id),
  name text not null
);

create table combo_products (
  combo_id int references products(product_id),
  product_id int references products(product_id),
  quantity int not null default 1,
  primary key (combo_id, product_id)
);

create table catalogs (
  catalog_id int primary key,
  name text not null 
);

create table catalog_items (
  catalog_id int references catalogs(catalog_id),
  product_id int references products(product_id),
  price numeric(19,2) not null
);

create table bill_of_materials (
  good_id int references products(product_id),
  item_id int references products(product_id),
  quantity int not null default 1,

  primary key (good_id, item_id)
);
用法:

insert into product_types values 
(1, 'Product', null),
(2, 'Good', 1),
(3, 'Combo', 1);

insert into products values
(1,2, 'Burger'),
(2,2, 'Fries'),
(3,2, 'Pop'),
(4,3, 'Combo 1'),
(5,2, 'Bun'),
(6,2, 'Patty'),
...;

insert into bill_of_materials values
(1, 5, 1), /*bun in burger*/
(1, 6, 1)  /*patty in burger*/
...;

insert into combo_products values 
(4, 1, 1), /*burger*/
(4, 2, 1), /*fries*/
(4, 3, 1); /*pop*/

insert to catalog values
(1, 'Default Catalog');

insert into catalog_items values
(1, 1, 4.99), /*burger*/
(1, 2, 2.49), /*fries*/
(1, 3, 1.99), /*pop*/
(1, 4, 7.99); /*combo1*/

这会成为订购系统的一部分吗?我想的是这样的:物品[id,名称],物品详细信息[id,名称,物品[id,fk],成分[id,名称,单位,数量….]。以这种方式,1项具有许多项详细信息。那么每种食物都有很多成分。例如,我创建了一个项目[汉堡配薯条和可乐]。在我的商品明细表中,我有分类[汉堡、薯条、可乐]。然后,我可以为每个项目的详细信息指定配料(可口可乐除外)。