使用复合键识别行的指南

Bra*_*tie 8 schema sql-server

使用一组 4 列将一行标识为唯一的(一个是外键,其他三个是浮点数据类型)是一种好的做法(或者它会不会有任何不利影响)?我正在尝试构建一个表(链接 4 个键)将描述表中的唯一条目。我很好奇这是否是一个好的攻击计划,或者是否有更好的方法。

出于视觉目的,请绘制下表。我们有如下表组织的库存项目:([K]是主键的象征,线条是关系)

    Sheet_Class        Sheet_Type         Sheet_Size
    ===========        ==========         ==========
[K] Sheet_Class-.  [K] Sheet_Type--.  [K] Sheet_Size
                 '---- Sheet_Class  '---- Sheet_Type
                                          Length
                                          Width
                                          Thickness
Run Code Online (Sandbox Code Playgroud)

数据可能以下列方式呈现,但为简洁起见,我排除了引入链接列的可能性:

 Sheet_Class    Sheet_Type    Sheet_Size                        (Tables)
[Sheet_Class]  [Sheet_Type]  [Length], [Width], [Thickness]     (Column Values)
=============  ============  ==============================

Aluminum
               5052-H32
                             48, 96, 0.032
                             48, 96, 0.040
                             48, 96, 0.063

               6061-T6
                             60, 120,0.032
                             60, 120,0.040
                             60, 120,0.063

Steel
               1018-CRS
                             48, 96, 0.018
                             48, 96, 0.023
                             48, 96, 0.031
Run Code Online (Sandbox Code Playgroud)

就目前情况而言(并且我已经在上面的“架构”中显示),我对Sheet_Size表中的条目使用了一个简单的(自动递增)整数主键。但是,我想知道使用Sheet_TypeLengthWidthThickness列的组合是否更好?鉴于 Sheet_Size 中的每个条目都应该共享所有这些独特的品质,并且自动递增字段不能很好地证明这一点,这是最好的选择吗?

如果我没有很好地解释情况,请告诉我。我发现自己需要为其他逻辑目的分解库存材料的这些部分(类别与类型与实际库存大小),但我准备接受任何其他类型的反馈。

任何指导将不胜感激。

更新 (08-12-2011)

发布答案后,我决定将Mark 的答案X-Zero 的答案结合起来。我认为对长度、宽度和厚度列设置独特的约束是个好主意,但我也喜欢将材料尺寸分解为独特的行并将它们与关系联系起来的想法。

不幸的是,我不能同时接受这两个答案,因此我将接受 X-Zeros 以(我的感觉)更批判地看待问题并提供架构调整。

谢谢大家的回答。

小智 6

考虑到这一点后,我会稍微修改一下您的表结构。
首先,修改您的图纸尺寸表:

Sheet_size
===========
Id
Length
Width
Thickness
Run Code Online (Sandbox Code Playgroud)

其次,创建一个sheet-size/type关系表:

Sheet_size_type
================
Sheet_Type_Id
Sheet_Size_Id
Run Code Online (Sandbox Code Playgroud)

然后,创建以下约束:

  1. 的主键(和索引)Sheet_size应该是 id 列
  2. 中的维度应该强制执行某种唯一键(和索引)Sheet_size。考虑一下,两张尺寸 (48, 96, .5) 和 (96, 48, .5) 是否相等(也就是说,尺寸的方向是否重要)?如果通过使用列作为主键的一部分,这种问题可能难以解决,但在使用约束和存储过程时变得更易于管理。
  3. 的主键(和索引)Sheet_size_type应该使用两个外键,从基数较低的那个开始(可能是sheet_type,给定你的例子)。您可能需要另一个方向的附加索引,但这可能不是必需的。

此版本将节省您的数据库空间(作为使用相同大小的工作表类型数量的比率),并且不会对开销产生太大影响。


如果您使用float数据类型,还有其他关于相等性/唯一性的潜在问题,因为不精确可能会意外地绊倒您。您应该考虑定点类型是否更适合某些给定的精度。


Mar*_*ith 6

看起来像是自然替代的关键决定,其意见范围从考虑和实用学术,接近教条。根据 RDBMS,需要考虑物理模型,这可能会对性能产生重大影响,例如 SQL Server 中的群集键选择。

就个人而言,如果我有一个狭窄的、单一属性的候选键,我很想使用它。宽键和/或复合键,默认情况下我会向模型添加代理。在你的情况下,我会投票支持 Sheet_Size 上的标识列作为主聚集键和类型/长度/宽度/厚度的唯一约束。