【发布时间】:2013-06-13 09:20:25
【问题描述】:
我刚读到Coding Horror: Maybe Normalizing Isn't Normal,他们特别说规范化会降低 SELECT 查询的性能,因为有很多 INNER JOIN 语句。
但是我有一个表,我打算将几个 TEXT 列放在单独的表中,这样我就可以比较整数索引而不是字符串,但是现在我阅读了这篇文章,我不确定是否应该这样做。
作为一个例子,如果我们比较这个非规范化的表:
CREATE TABLE addresses (country TEXT, city TEXT, address TEXT);
SELECT address FROM addresses WHERE Country=? AND City=?;
使用规范化形式:
CREATE TABLE countries (name TEXT UNIQUE);
CREATE TABLE cities (name TEXT UNIQUE);
CREATE TABLE addresses (country INT, city INT, address TEXT);
SELECT addresses.address FROM addresses INNER JOIN countries ON countries.ROWID=addresses.country INNER JOIN cities ON cities.ROWID==addresses.city WHERE countries.name=? AND cities.name=?;
对于 SQLite,第二种形式是更慢、更快还是与第一种形式的速度相同?
【问题讨论】:
-
他们错了。标准化是一件好事。
-
那么它会提高我的 SELECT 查询的速度吗?它看起来和这个例子一模一样,只是列名不同:)
-
文章还说没关系,直到你达到数百万或数十亿(用户数/帖子数等)
-
除非您在人员和地址之间存在一对多关系,否则您有一个地址表这一事实很奇怪。
-
这是一个虚构的例子,不是我的实际表格。我只有 2 个文本列,可以放在另一个表中。这些列包含的值通常相同,就像国家和城市通常是相同的文本一样。
标签: sql performance sqlite normalization