首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >主键效率

问主键效率
EN

Database Administration用户
提问于 2013-03-22 04:39:15
回答 3查看 589关注 0票数 6

如果我需要一张桌子来存放销售点交易,并且被告知我需要存储:

代码语言:javascript
复制
Country ID
Store Number
POS Terminal Number
Transaction Date
Item Code
Teller ID
Another Field
More Fields

现在,在这种情况下,惟一性将是:

国家ID,商店号码,POS终端号码,交易日期,项目代码

我总是不确定是否最好以标识词作为主键--在本例中,可能是TransactionID INT NOT NULL PRIMARY KEY,然后是唯一字段的唯一约束。

或者,是否应该在所有唯一字段中创建主键?

我猜,TransactionId的好处是加入。若要重新加入事务,只需使用单个字段。我看不到PK在许多领域的好处。(节省额外列的空间?)。

EN

回答 3

Database Administration用户

发布于 2013-03-22 14:35:38

我会说是,创建TransactionID的代理键。它将在整个表中创建一个狭窄、唯一的标识符。

代理键最好的原因之一是由于与其他表的关系。如果需要将事务表与另一个表(例如Line_Item_Detail)关联,则事务表的整个主键需要作为外键在相关表中。如果您决定使用国家ID、商店编号、POS终端号码、交易日期和项目代码的候选密钥,则需要在每个相关表中使用这些列。如果您需要更新这些字段中的任何一个,则还需要在相关表中更新这些字段。很快就会乱七八糟的。使用TransactionID的代理键,您只需要将TransactionID列添加到相关表中。由于这是,应该是,和IDENTITY列,我们永远不应该更新它。

创建Server表时应该考虑的另一件事是聚集索引。聚集索引是Server物理存储表数据的方式。您可以拥有一个没有称为堆的聚集索引的表。在大多数情况下,您确实应该创建一个聚集索引(了解更多关于堆与聚集索引的内容),Michelle有一篇关于创建有效聚类指标的优秀文章。简而言之,聚集索引应该是:

  • 窄-越窄越好,它存储的字节数越少越好
  • Unique --为了避免Server添加“唯一性”来复制键值
  • 静态-理想情况下,从未更新过
  • 不断增加--避免碎片化,提高写入性能。

TransactionID上的聚集索引将很好地满足这一条件。

由于要向事务表添加代理键,所以还应该考虑添加国家ID、商店号、POS终端号、交易日期和项代码或其他候选密钥的备用键。这将保证不会有意外重复添加到表中。如果不添加备用键,那么复制项进入表的可能性很大。

最后一件事,您可能需要考虑进一步规范该表。在表设计中,如果向事务中添加了多个项,您将向每一行添加重复的数据(存储号、POS终端号等)。由于数据的重复,查询也将变得更加困难。

票数 5
EN

Database Administration用户

发布于 2013-03-22 04:43:47

这在某种程度上取决于您的查询,如果您只在TransactionId上进行了大量查询,那么将其作为主键就更自然了。它还将使DBMS更容易在这一个字段上创建索引。当然,您仍然应该对您提到的所有列指定一个唯一的约束。

另一方面,如果您通过指定所有字段来执行所有查找查询,我将使它们都成为复合主键。

票数 2
EN

Database Administration用户

发布于 2013-03-22 04:50:31

我很难跟上你的思路.你列出的5件事根本不应该表明任何类型的独特性。一天只能卖出一件物品吗?

按照您的建议创建TransactionId。

此外,这也是表规范化http://www.informationqualitysolutions.com/FreeStuff/rettigNormalizationPoster.pdf (即。适当设计表格)

编辑:*

克雷格你的假设是错误的。查看日期类型的SQL文档:

DATE -这描述了使用YYYY DD格式的字段(年份、月和日)的日期。长度是10。它不包括小时、分钟、秒等)

只有一个项目可以出售一天的方式,你写的原始问题。

这就是为什么主键应该与所有其他信息分开的原因。此外,我们也无法预测未来是否会有任何其他类型的独特性(例如。即使您使用日期时间,POS终端将来也有可能成为在线服务器,在该服务器中,技术上两个事务可以在同一日期时间发生)

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/37313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档