2013-05-10 83 views
3

我有以下设置:MySQL的 - 列添加到表或创建新表并加入

与N列包含比方说......比萨饼细节的表格。这里有4种比萨饼 到现在为止,所有比萨饼都有相同的细节,每个细节都保存在一列中。

但是现在出现了一种称为超级比萨饼的新型比萨,它有两种需要保存的细节类型。

有2种方式来做到这一点(我可以考虑一下):

  1. 添加到列到现有的表,并让他们空/空/无论对于4种比萨饼类型

    休息
  2. 创建具有3列(idPizza,newDetail1和newDetail2)的新表,保存比萨饼比萨饼的休息,当我得到的数据加入2个表

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

第二个选项的缺点是,每次我得到新的比萨我需要进行连接。此外,数据库将是一种“混乱”...有一部分比萨饼元素存储在一个表中,另一部分存储在另一个表中。

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

作为说明:表中有很多条目(如数以万计)。

第二个注意事项(基于答案):无法重构“比萨”表,只需添加它即可。

+0

是否有可能超过3列 – 2013-05-10 07:18:33

+0

当然这是...这只是我的想法之一。 – zozo 2013-05-10 07:22:35

+0

你可以简单地将列添加到它 – 2013-05-10 07:42:57

回答

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 [email protected]'); 


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'); 

whic hwill容易和火查询

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 Fiddle

+0

是啊......不幸的是不能真正改变一些工作,并在过去6年写了代码:)。我会添加问题,我不能删除/重构第一个表,只需添加它。仍+1。 – zozo 2013-05-10 07:24:16

+0

你可以花一点时间做这件事,因为这个结构非常灵活,可以为任何项目添加n个细节。 – 2013-05-10 07:41:40

0

那么我建议只创建与属性(idPizza,newDetail)的表和数据保存为下面

idPizza,newDetail1 1 1详细 2 2详细 3超级详细 3超级详细第二

将idPizza,newDetail1作为主

相关问题