我有以下设置:
包含n列的表格,其中包含...披萨详细信息。此时有4种比萨饼 到目前为止,所有披萨都有相同的细节,每个细节都保存在一列中。
但是现在出现了一种叫做超级披萨的新披萨,还有另外两种需要保存的细节。
有两种方法可以做到这一点(我可以考虑):
添加到现有表的列,并将其留空/ null /其余4种披萨类型
创建一个包含3列的新表(idPizza,newDetail1和newDetail2),将比萨保存为其余的比萨饼,当我获取数据时加入2个表
第一个选项的缺点是我为所有比萨保留了无用的数据,除了新类型(平均比萨分布的80%表)。
第二种选择的缺点是,每次我得到新的披萨,我都需要加入。 db也会有点“混乱”......将披萨元素的一部分存储在表格中,将其他部分存储在另一个表格中。
我知道最终是一个品味问题,但您认为我应该怎么做?我倾向于第一选择,但欢迎第二种意见。
作为注释:表格中有很多条目(如数万条)。
第二个音符(基于答案):无法重构“披萨”表,只需添加即可。
答案 0 :(得分:1)
而不是这个你可以使用如下的平面表概念,以便在将来为具有更多细节的新比萨添加没有特征
CREATE TABLE pizza
(
id int auto_increment primary key,
name varchar(20),
details varchar(30)
);
INSERT INTO pizza
(name, details)
VALUES
('pizza1', 'nice pizaa'),
('pizza2', 'nice pizza@sqlfiddle');
CREATE TABLE details
(
id int auto_increment primary key,
name varchar(20)
);
INSERT INTO details
(name)
VALUES
('pizza_size'),
('price');
CREATE TABLE pizza_details
(
id int auto_increment primary key,
pizza_id int(10) ,
details_id int(10) ,
details_value varchar(20)
);
INSERT INTO pizza_details
(pizza_id,details_id,details_value)
VALUES
(1,1,'small'),
(1,2,'Rs 20'),
(1,1,'big'),
(1,2,'Rs 50');
并触发查询
select pizza.name as pizza_name,details.name as detail,pizza_details.details_value from pizza_details left join details ON pizza_details.details_id = details.id
left join pizza On pizza_details.pizza_id = pizza.id;
答案 1 :(得分:0)
我建议使用第一个选项。因为第二个选项比第一个选项保留更多的资源,所以需要更多的时间过程。
由于您提到的第一个选项的缺点非常明显,但是当您需要更多列时,请将新内容添加到该现有表中。
答案 2 :(得分:0)
我建议只创建一个包含属性的表(idPizza,newDetail)并保存数据如下
idPizza,newDetail1 1 1细节 2 2细节 3个超级细节 3超级细节第二
MAke idPizza,newDetail1为主要