如果我需要一张桌子来存放销售点交易,并且被告知我需要存储:
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在许多领域的好处。(节省额外列的空间?)。
发布于 2013-03-22 14:35:38
我会说是,创建TransactionID的代理键。它将在整个表中创建一个狭窄、唯一的标识符。
代理键最好的原因之一是由于与其他表的关系。如果需要将事务表与另一个表(例如Line_Item_Detail)关联,则事务表的整个主键需要作为外键在相关表中。如果您决定使用国家ID、商店编号、POS终端号码、交易日期和项目代码的候选密钥,则需要在每个相关表中使用这些列。如果您需要更新这些字段中的任何一个,则还需要在相关表中更新这些字段。很快就会乱七八糟的。使用TransactionID的代理键,您只需要将TransactionID列添加到相关表中。由于这是,应该是,和IDENTITY列,我们永远不应该更新它。
创建Server表时应该考虑的另一件事是聚集索引。聚集索引是Server物理存储表数据的方式。您可以拥有一个没有称为堆的聚集索引的表。在大多数情况下,您确实应该创建一个聚集索引(了解更多关于堆与聚集索引的内容),Michelle有一篇关于创建有效聚类指标的优秀文章。简而言之,聚集索引应该是:
TransactionID上的聚集索引将很好地满足这一条件。
由于要向事务表添加代理键,所以还应该考虑添加国家ID、商店号、POS终端号、交易日期和项代码或其他候选密钥的备用键。这将保证不会有意外重复添加到表中。如果不添加备用键,那么复制项进入表的可能性很大。
最后一件事,您可能需要考虑进一步规范该表。在表设计中,如果向事务中添加了多个项,您将向每一行添加重复的数据(存储号、POS终端号等)。由于数据的重复,查询也将变得更加困难。
发布于 2013-03-22 04:43:47
这在某种程度上取决于您的查询,如果您只在TransactionId上进行了大量查询,那么将其作为主键就更自然了。它还将使DBMS更容易在这一个字段上创建索引。当然,您仍然应该对您提到的所有列指定一个唯一的约束。
另一方面,如果您通过指定所有字段来执行所有查找查询,我将使它们都成为复合主键。
发布于 2013-03-22 04:50:31
我很难跟上你的思路.你列出的5件事根本不应该表明任何类型的独特性。一天只能卖出一件物品吗?
按照您的建议创建TransactionId。
此外,这也是表规范化http://www.informationqualitysolutions.com/FreeStuff/rettigNormalizationPoster.pdf (即。适当设计表格)
编辑:*
克雷格你的假设是错误的。查看日期类型的SQL文档:
DATE -这描述了使用YYYY DD格式的字段(年份、月和日)的日期。长度是10。它不包括小时、分钟、秒等)
只有一个项目可以出售一天的方式,你写的原始问题。
这就是为什么主键应该与所有其他信息分开的原因。此外,我们也无法预测未来是否会有任何其他类型的独特性(例如。即使您使用日期时间,POS终端将来也有可能成为在线服务器,在该服务器中,技术上两个事务可以在同一日期时间发生)
https://dba.stackexchange.com/questions/37313
复制相似问题