3

我有以下设置:

一个包含 n 列的表,其中包含比萨饼的详细信息。此时有 4 种比萨饼 到目前为止,所有比萨饼都有相同的详细信息,每个详细信息都保存在一个列中。

但是现在出现了一种叫做超级披萨的新型披萨,它还有两种需要保存的细节。

有两种方法可以做到这一点(我可以考虑):

  1. 将列添加到现有表中,并将它们留空/空/其他 4 种比萨饼类型

  2. 创建一个包含 3 列(idPizza、newDetail1 和 newDetail2)的新表,将比萨饼保存为其余比萨饼,当我获得数据时加入 2 个表

第一个选项的缺点是我保留了除新类型之外的所有比萨饼的无用数据(平均比萨饼分布的表的 80%)。

第二种选择的缺点是每次我得到新的比萨饼时,我都需要加入。此外,数据库将有点“凌乱”......将披萨元素的一部分存储在一个表中,而将其他部分存储在另一个表中。

我知道这最终是一个品味问题,但你认为我应该如何继续?我倾向于第一个选项,但欢迎第二个意见。

注意:表中有很多条目(如数万个)。

第二个注释(基于答案):无法重构“披萨”表,只需添加即可。

4

3 回答 3

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;

SQL小提琴

于 2013-05-10T07:15:17.563 回答
0

好吧,我建议只创建一个带有属性(idPizza,newDetail)的表并保存数据如下

idPizza, newDetail1 1 1 细节 2 2 细节 3 超细节 3 超细节第二

将 idPizza、newDetail1 设为主要

于 2013-05-10T07:33:25.483 回答
0

我建议使用第一个选项。因为第二个选项比第一个选项保留更多的资源,并且需要更多的时间处理。

由于您提到的第一个选项的缺点非常明显,但是当您需要更多列时,请向该现有表添加新列。

于 2013-05-10T07:24:30.840 回答