在 RDBMS 中使用 int FK 替换具有重复值的字符串列是否有任何性能优势?

问题描述 投票:0回答:1

为了存储一个人的国家/地区信息,我这样做了:

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

我的问题是:从性能角度/索引角度来看,执行第二种方案是否有好处,或者这样做很麻烦? (我知道我没有打破第一个场景的任何正常形式)

sql normalization rdbms database-optimization
1个回答
0
投票

第二个版本有一个明显的性能优势,即每个人-国家关系只需要存储多个国家ID。反过来,这意味着您对表和索引的存储需求将会减少。

因为第二个版本的索引将使用整数国家ID而不是字符串名称,所以我希望索引性能能够提高。您的数据库并不“知道”只有固定数量的国家/地区。因此,第一个版本的索引将是跨文本分割的 B 树,而不是整数。而且前者比后者更冗长。

© www.soinside.com 2019 - 2024. All rights reserved.