为了存储一个人的国家/地区信息,我这样做了:
CREATE TABLE test
(
id INT IDENTITY(1, 1),
name VARCHAR(100) NOT NULL,
country VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
INSERT INTO test
VALUES ('Amy', 'Mexico'),
('Tom', 'US'),
('Mark', 'Morocco'),
('Izzy', 'Mexico');
-- milions of other rows
许多国家/地区会在国家/地区栏中重复出现。
另一种选择是将国家/地区放入其自己的表中,并在测试表中将country_id引用为FK:
CREATE TABLE countries
(
id INT IDENTITY(1, 1),
name VARCHAR(100) NOT NULL,
PRIMARY KEY(id)
);
CREATE TABLE test
(
id INT IDENTITY(1, 1),
name VARCHAR(100) NOT NULL,
country_id INT NOT NULL,
PRIMARY KEY(id),
FOREIGN KEY(country_id) REFERENCES countries(id)
);
我的问题是:从性能角度/索引角度来看,执行第二种方案是否有好处,或者这样做很麻烦? (我知道我没有打破第一个场景的任何正常形式)
第二个版本有一个明显的性能优势,即每个人-国家关系只需要存储多个国家ID。反过来,这意味着您对表和索引的存储需求将会减少。
因为第二个版本的索引将使用整数国家ID而不是字符串名称,所以我希望索引性能能够提高。您的数据库并不“知道”只有固定数量的国家/地区。因此,第一个版本的索引将是跨文本分割的 B 树,而不是整数。而且前者比后者更冗长。