加入 table 或为几行创建列

Join table or create column for few rows

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

我们调用类型 A B C DE,对于每个类型,我都将相同的 'details' 存储在 N 列中.

问题: 但是我只需要一个新的 'detail' 类型 E

所以,我想到了两种解决方案

(1) Create a column new_detail in table

(2) Create a new_table with main_id new_detail and join it

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

方法 2 更好:创建一个单独的 table 来存储与 "E" 类型关联的数据。这是data normalization.

的基本原则

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

我认为第一个解决方案更简单、更清晰,第二个解决方案更多地是关于数据的规范化,事实并非如此,只是更多的属性。


先创建一个有很多垃圾的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_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)

但是我们将 value 列复制到 a 我们得到了这个。

 UPDATE table_b SET A=value;

如果数据是NULL这个不影响