1

假设我有一个看起来像这样的数据库;

Product with columns [ProductName] [Price] [Misc] [Etc]
Order with columns [OrderID] [ProductName] [Quantity] [Misc] [Etc] 

ProductName 是 Product 的主键,是某种字符串类型,并且是唯一的。
OrderID 是主键并且是某种整数类型,而 ProductName 是外键。

假设我将 Product 的主键更改为整数类型的新列,即[ProductID].

这会减少数据库大小并优化连接这两个表的查找(以及类似的操作),还是这些优化是由(大多数/通用/主要) SQL 数据库实现自动执行的?

从技术上讲,使用 (String) ProductName 作为 inProduct的主键,数据库应该能够将 ProductName 列Order简单地实现为指向行的指针,并像使用整数作为外键一样快速地Product执行 a ,这是标准吗? JOINSQL的实现方式。

更新: 这个问题是关于 SQL 服务器如何处理外键,而不是产品表是否需要序列号,或者我如何处理数据库中的产品名称更改。

4

5 回答 5

2

字符串主键是一个坏主意,因此将其更改为 INT 将有助于提高性能。大多数数据库使用主键索引进行查找和比较,如果可能,请选择一个简短的主键——一列。您将主键列用于连接(根据连接列中的公共值组合来自两个或多个表的数据)、查询检索以及对查询结果集进行分组或排序。索引条目越简短,数据库执行查找和比较的速度就越快。

更何况,如果产品名称发生变化,你怎么处理呢?更新包含产品名称作为外键的所有行?

我不能说得更好,所以看看这个答案:我应该设计一个主键为 varchar 或 int 的表,引用该答案:

使用 VARCHAR(10) 或 (20) 只会占用太多空间 - 10 或 20 个字节而不是 4 个字节,而且很多人不知道 - 集群键值将在每个索引条目上重复表上的单个非聚集索引,因此可能会浪费大量空间(不仅在磁盘上 - 这很便宜 - 而且在 SQL Server 的主内存中)。此外,由于它是可变的(可能是 4 个,可能是 20 个字符),SQL 服务器更难正确维护良好的索引结构

于 2010-05-26T11:52:03.197 回答
0

主键应该是唯一的,在行创建时存在并且尽可能不可变。IMO,关于是否使用代理密钥的讨论应该次要于数据完整性问题。

例如,如果产品上印有序列号,该序列号必须在输入数据库中的行时就存在并得到保证是唯一的,然后 IMO 将成为一个很好的主键。原因是此值将用作其他表中的外键,它可以节省您额外查找以获取产品序列号的费用。在您进入数百万行之前,额外的存储空间是无关紧要的。但是,如果序列号是由其他制造商盖章的,因此您不能保证唯一性(“它可能是唯一的”还不够好),那么代理是合适的。事实上,如果不是大多数“产品”表都使用代理键,我什至会说很大一部分,因为没有保证在输入时可用的值,保证是唯一的并且相对不可变的值是可用的关键。

但是,许多使用代理键的开发人员忽略了每个具有代理键的表还应该另一个键(即唯一约束)的需求。因此,在您使用产品的情况下,即使您添加整数主键,您仍然应该对产品名称具有唯一约束。产品名称的唯一约束创建了所谓的候选键,其中整数值是主键。

代理键是幕后的粘稠物。虽然整数键性能最好并且易于创建,但它们有一个缺点:应用程序开发人员向用户显示键值很容易,甚至很诱人。这是国际海事组织的错误。用户不应该看到键值,否则他们将依赖值本身,如果您需要重新对值进行排序(例如使用数据库合并),或者如果您使用在由身份值,它们依赖于顺序的值。只要您从不向用户显示价值,使用整数 PK 就可以了。

于 2010-05-26T14:03:58.533 回答
0

整数列在连接中比字符串表现更好

整数 autoinc 列作为主聚集键适用于插入

于 2010-05-26T11:52:49.357 回答
0

我不会减少数据库大小(大概你会保留产品名称字段),但肯定会提高查​​找性能。

于 2010-05-26T11:53:42.817 回答
0

在大多数实现中,整数数据类型的大小将小于字符串(CHARVARCHAR),这将使您的索引的大小更小。

此外,比较字符串存在一些问题:

  1. 一些数据库,即MySQL压缩字符串键,这会使搜索效率降低。

  2. 使用自然语言标识符的字符串B-Trees往往比整数更不平衡B-Trees。由于自然语言单词在整个字母表中分布不均,更多的更新和插入将进入同一个块,从而增加页面拆分的数量并最终增加索引大小。要解决此问题,Oracle支持REVERSE索引中的子句。

  3. 比较两个字符串时,应考虑排序规则。通常,这并不重要,但是,它确实会增加一些开销。

于 2010-05-26T11:54:26.187 回答