连接表或为几行创建列

时间:2017-09-15 05:13:44

标签: mysql database-schema

我有一个表main,其中包含不同类型的信息。

我们称之为A B C DE,因为每个人都有同样的细节'存储在N列中。

问题:但我需要一个新的细节'仅适用于类型E

所以,我认为有两种解决方案

  

(1)在表格

中创建一个列new_detail
  • 这会将NULL放入A B C D类型。

  • 类型E为每10 000行1个,main表每年约有5万行

  

(2)使用new_table main_id创建new_detail并加入

  • 只有在使用E类型时才需要加入(并非总是如此)

哪种方法是最佳做法,为什么?接受其他解决方案

2 个答案:

答案 0 :(得分:1)

我认为您的主要问题是关于可用于生成新列的内存,但不要害怕生成新列,通过一个简单的实验表明,除信息外,null不会占用内存列的

我认为第一种解决方案更简单,更简洁,第二种解决方案更多的是关于数据的规范化,而并非如此,只是更多的属性。


首先创建一个包含大量垃圾的 table_a

CREATE TABLE `table_a` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `value` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

#Execute this a lot of times.
INSERT INTO `table_a` (value) VALUES ('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum'),('Lorem Ipsum');

我创建了1980行,大小为9 + 176 KB

table_a_size

然后创建一个 table_b 克隆 table_a ,但具有多个NULL

CREATE TABLE `table_b` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `value` varchar(255) NULL DEFAULT NULL,
  `a` varchar(255) NULL DEFAULT NULL,
  `b` varchar(255) NULL DEFAULT NULL,
  `c` varchar(255) NULL DEFAULT NULL,
  `d` varchar(255) NULL DEFAULT NULL,
  `e` varchar(255) NULL DEFAULT NULL,
  `f` varchar(255) NULL DEFAULT NULL,
  PRIMARY KEY (`Id`)
)  ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `table_b` (value) SELECT value FROM `table_a`;

与table_a一样,它的大小相同,但头部更大。 (13 + 176 KB)
table_b_size_1

但是我们将value列复制到a上。

 UPDATE table_b SET A=value;

table_b_size_2

如果数据为NULL,则不会影响

答案 1 :(得分:-1)

方法2更好:创建一个单独的表来存储与" E"类型。这是data normalization的基本原则。