Cra*_*aig 6 sql-server primary-key
如果我需要一张表来保存销售点交易,并且被告知我需要存储:
Country ID
Store Number
POS Terminal Number
Transaction Date
Item Code
Teller ID
Another Field
More Fields
Run Code Online (Sandbox Code Playgroud)
现在,在这种情况下,唯一性将是:
国家/地区 ID、商店编号、POS 终端编号、交易日期、项目代码
我总是不确定是否最好将标识列作为主键 - 在这种情况下,可能是TransactionID INT NOT NULL PRIMARY KEY
,然后是跨唯一字段的唯一约束。
或者,是否应该跨所有唯一字段创建主键?
TransactionId
我猜的好处是,加入。要加入交易,您只需使用单个字段。我在许多领域都看不到 PK 的好处。(节省额外列的空间?)。
小智 5
我会说是的,创建 TransactionID 的代理键。它将在整个表中创建一个狭窄的唯一标识符。
代理键最好的原因之一是与其他表的关系。如果您需要将 Transaction 表与另一个表(例如 Line_Item_Detail)相关联,则 Transaction 表的整个主键需要作为外键出现在相关表中。如果您决定使用 Country ID、Store Number、POS Terminal Number、Transaction Date 和 Item Code 等候选键,这些列将需要出现在每个相关表中。如果您需要更新这些字段中的任何一个,它们也需要在相关表中进行更新。这很快就会变得混乱。使用 TransactionID 的代理键,您只需将 TransactionID 列添加到相关表中。由于这将,应该是,并且IDENTITY
列,我们永远不必更新它。
创建 SQL Server 表时应该考虑的另一件事是聚集索引。聚集索引是 SQL Server 物理存储表数据的方式。您可以拥有一个没有聚集索引的表,称为堆。在大多数情况下,您确实应该创建一个聚集索引(阅读有关堆与聚集索引的更多信息)Michelle Ufford 有一篇关于创建有效聚集索引的优秀文章。简而言之,您的聚集索引应该是:
TransactionID 上的聚集索引将很好地满足此条件。
由于您将向 Transaction 表添加代理键,您还应该考虑添加 Country ID、Store Number、POS 终端编号、Transaction Date 和 Item Code 的备用键或其他一些候选键。这将保证不会在表中意外添加重复项。如果您不添加备用键,则重复项很可能会蔓延到表中。
最后一件事,您可能需要考虑进一步规范化表格。使用您提供的表格设计,如果将多个项目添加到交易中,您将向每一行(商店编号、POS 终端编号等)添加重复数据。由于数据重复,查询也会变得更加困难。
小智 2
这在某种程度上取决于您的查询,如果您仅对 进行大量查询TransactionId
,那么将其作为主键会更自然。它还将使 DBMS 更轻松地仅针对该字段创建索引。当然,您仍然应该对您提到的所有列指定唯一约束。
另一方面,如果您通过指定所有字段来执行所有查找查询,我会将它们全部设置为复合主键。
归档时间: |
|
查看次数: |
500 次 |
最近记录: |