加入 table 或为几行创建列
Join table or create column for few rows
我有一个 table main
,其中包含不同类型的信息。
我们调用类型 A
B
C
D
和 E
,对于每个类型,我都将相同的 'details' 存储在 N 列中.
问题: 但是我只需要一个新的 'detail' 类型 E
所以,我想到了两种解决方案
(1) Create a column new_detail
in table
这会将 NULL
放入类型 A
B
C
D
.
type E
是每 10 000 行 1 个,而 main
table 大约有 50 000 rows/year
(2) Create a new_table
with main_id
new_detail
and join it
- 只有在使用
E
类型时才需要连接(并非总是如此)
哪种方法是最佳做法,为什么?接受其他解决方案
方法 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
这个不影响
我有一个 table main
,其中包含不同类型的信息。
我们调用类型 A
B
C
D
和 E
,对于每个类型,我都将相同的 'details' 存储在 N 列中.
问题: 但是我只需要一个新的 'detail' 类型 E
所以,我想到了两种解决方案
(1) Create a column
new_detail
in table
这会将
NULL
放入类型A
B
C
D
.type
E
是每 10 000 行 1 个,而main
table 大约有 50 000 rows/year
(2) Create a
new_table
withmain_id
new_detail
and join it
- 只有在使用
E
类型时才需要连接(并非总是如此)
哪种方法是最佳做法,为什么?接受其他解决方案
方法 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
这个不影响