数据库设计问题:多种类型的产品

时间:2015-03-28 22:15:36

标签: database database-design

我遇到了一个我应该为一家制造公司建立数据库的问题。基本上问题如下:

该公司以不同的产品名称生产多种类型的鞋(产品)。

例如,"鞋子设计" (即它看起来如何,无论使用何种材料)代码可以是" 1048"而这个特定设计的最简单的产品将是" 1048 P07"在任何地方使用相同的材​​料(P07)。但是,你可以制作一些非常先进的鞋子,也就是将许多不同的材料拼接在一起,因此最终的代码可以是" 1048 P07 T44L T22 L18"。

我不确定我应该如何设置表格和关系。

问题在于鞋子的不同部位可以使用特定的材料(即将不同的区域/工作放在那里),所以这不是简单添加数字的问题。

例如鞋子" 1048 P07 T44"比#34; 1048 T44 P07"因为材料T44更贵,并且在第二种鞋型的较大区域使用。

此外,每一个鞋子设计",意味着例如在设计" 995"最多只使用3种不同的材料(分成大约3个同样大的部分),但在" 548"最多可以有8个(分为2个大的相等部分和6个其他较小的部分)。

这意味着,如果我用"产品"制作表,我认为它们在同一个表中是非常不同的(即一个有3个部分需要缝合,另外8个和一些可以甚至有15)。如何轻松归因于需要对不同产品执行哪些操作并将产品放在同一个表中?

我很乐意提供任何进一步的信息,以帮助您了解我的问题。

1 个答案:

答案 0 :(得分:1)

这是我推荐的MySql版本。希望有所帮助:

create table design_list (
    did int primary key,
    dname varchar(30) not null
);
create table part_list (
    pid int primary key,
    pname varchar(30) not null,
    price decimal(10,3)
);
create table material_list (
    mid int primary key,
    mname varchar(30) not null
);
create table design_part_material (
    did int references desing_list (did),
    pid int references part_list (pid),
    mid int references material_list (mid),
    constraint primary key (did , pid , mid)
);

insert into design_list values (1,'Panic Sneaks');
insert into design_list values (2,'Rubber Sole');

insert into part_list values (1,'Toe cap',1.2);
insert into part_list values (2,'Heel1',2);
insert into part_list values (3,'Heel2',.6);
insert into part_list values (4,'Heel cap',1.1);

insert into material_list values (1,'Egg Yolk');
insert into material_list values (2,'Asfalt');

insert into design_part_material values (1,1,1);
insert into design_part_material values (1,2,1);
insert into design_part_material values (1,4,2);
insert into design_part_material values (2,1,1);
insert into design_part_material values (2,3,2);

您可以像查询一样查询:

select 
    dl.dname,
    group_concat(concat(pl.pname, '(', ml.mname, ')')
        order by pl.price desc) parts, sum(pl.price) price
from
    design_part_material dpm
        join
    design_list dl USING (did)
        join
    part_list pl USING (pid)
        join
    material_list ml USING (mid)
group by dl.dname
;