gpt4 book ai didi

sql - 值唯一时 SQL Server 中的标识字段和主键

转载 作者:行者123 更新时间:2023-12-02 08:38:20 25 4
gpt4 key购买 nike

当要存储在表中的一组值的名称或代码在整个系统中应该是唯一的时,是否应该使用 ID 自增(int)的主键创建它?

以State Abbreviations为例。除了一致性之外,除了州名或缩写之外,作为主键的表上的 ID 的用途是什么?

例如,如果来自送货地址的外键引用了不可变的州缩写,那么......是否有自动递增 int ID 的目的?

最佳答案

您强调了单独表格的一个积极方面:一致性。拥有这个要容易得多:

CREATE TABLE dbo.States
(
StateID TINYINT PRIMARY KEY,
Name VARCHAR(32),
Abbreviation CHAR(2)
);

CREATE TABLE dbo.CustomerAddresses
(
AddressID INT PRIMARY KEY,
...,
StateID TINYINT NOT NULL FOREIGN KEY REFERENCES dbo.States(StateID)
);

比起拥有触发器或检查约束,例如:

CHECK StateAbbreviation IN ('AL', 'AK', /* 50+ more states/territories... */)

现在,有了像 2 个字符的州缩写这样的静态和小的东西,这种设计可能更有意义,消除了缩写和一些代理 ID 之间的一些不必要的映射:

CREATE TABLE dbo.States
(
Abbreviation CHAR(2) PRIMARY KEY,
Name VARCHAR(32)
);

CREATE TABLE dbo.CustomerAddresses
(
AddressID INT PRIMARY KEY,
...,
StateAbbreviation CHAR(2) FOREIGN KEY REFERENCES dbo.States(Abbreviation)
);

这将数据限制为已知状态集,允许您将实际数据存储在表中(这可以消除查询中的大量连接),实际上节省您一些空间,并且避免有任何困惑的硬编码检查约束(或使用 UDF 的约束,或触发器验证数据)。

总而言之,没有满足所有设计的神奇一揽子答案。随着您的字符串变大,使用整数而不是仅存储字符串会更有意义。一个反例是存储您的网络日志中的所有用户代理字符串——存储相同的字符串一次并为其分配一个整数比一遍又一遍地存储相同的 255 个字符的字符串更有意义再来一遍。

其他可能使此设计麻烦的事情:

  • 如果您以后扩展到美国以外的地区怎么办?
  • 暂时忘掉州的缩写(这是非常静态的);如果您的查找是经常更改的事情怎么办?

关于sql - 值唯一时 SQL Server 中的标识字段和主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19038412/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com