主键的哪一列

时间:2015-06-04 19:16:41

标签: database database-design

螺母和螺栓的样本数据Thread Series。我正在尝试确定此数据集的主键。以下是一些有效组合的示例。

size     form     tpi
1/4      UNC      20
1/4      UNF      28
1/4      UNEF     32
5/16     UNC      18
5/16     UN       20
5/16     UNF      24
5/16     UN       28
5/16     UNEF     32
3/8      UNC      16
3/8      UN       20
3/4      UNC      10

最终我正在尝试在网络应用中构建下拉菜单,允许用户选择有效的螺栓,例如3/4-10UNC-2A HEX Head. A 3/4-6UNC-2A HEX Head无效,因为它们不制造3 / 4“螺栓每英寸6个螺纹(在此表中不会加载)。

第一个下拉选择螺栓类型,第二个下拉提供基于螺栓类型(在另一个db表中定义)可用的螺栓尺寸

第三次下拉将提供螺栓定义的最后部分。因此,如果用户选择HEX Head,那么5/16“他们会看到UNC-18,UN-20,UNF-24,UN-28和UNEF-32的选择。

我对PK的选择可能是:

  • 代理并创造独特的约束。
  • 使用大小和形式作为复合PK,它决定了tpi
  • 使用size和tpi作为复合PK,确定形式
  • 使用form和tpi作为PK,它决定了大小
  • 这三个字段都是PK(可能不对!)

似乎我选择哪个PK选项与查询无关,因为我会根据螺栓直径查询以获取其他两个值。我遗漏的是2A值,它与另一个表中的UN表格有关,还有一个“doozey”的要求,进一步限制了ThreadSeries可以用于螺栓类型。

我在Java EE中使用JSF和JPA实体(如果重要)

2 个答案:

答案 0 :(得分:2)

  

使用大小和形式作为复合PK,它决定了tpi
  使用size和tpi作为复合PK,它决定了形式
  使用form和tpi作为PK,它决定了

的大小

所有这些都是错误的假设。随着数据库的增长,没有什么可以阻止其中一个假设被误解。例如。将1/4 UNC 28添加到股票中。

  • 因此,如果您从其中任何一个创建了PK,那将破坏数据库,您将不得不更改依赖于此PK的整个表集。

您不能通过FD确定密钥(除了作为理论课堂练习,使用's和b和cs)。这不是教室。列是真实的,它们有意义(a和b和c没有意义)。你正确地描述了问题,意思。

关键决心是一项直接的逻辑练习,是数据建模的重要组成部分。

您的每个示例行都​​是Fact。那必须存储。这必须是独特的。

  

所有三个字段都是PK(可能不对!)

这是唯一正确的PK。这是唯一提供行唯一性的组合,以确保表中没有重复的行。

  

代理并创建唯一约束。

由于你无法避免给出行唯一性的PK,这将是多余的,一个额外的制造列加上没有任何作用的索引。

代理不提供关系模型中所需的逻辑行唯一性(它们提供物理记录ID唯一性)。

如果您不明白我的意思,请阅读this Answer,从顶部到假教师

  

我遗漏的是2A值,它与另一个表中的UN表格有关,还有一个“doozey”的要求,它进一步限制了哪些ThreadSeries可以用于螺栓类型。

关系模型基于一阶谓词微积分,通常称为一阶逻辑(FOL)。 FOL中没有任何内容无法说明。因此,没有任何内容无法在Relational数据库中建模。

  • “理论家*谁写的关于关系模型或关系数据库的书籍,不理解这些基础知识,他们写道不能做各种事情;他们使用代理人(反关系) )对于所有表,这导致记录归档系统,没有关系完整性(与参照完整性不同),关系数据库的功率或速度。

在“doozey”中打开一个新问题并ping我。

答案 1 :(得分:1)

您的问题根本没有关键值。你正在做的是"向下钻井"找到三列中唯一的值组合。该过程不使用密钥。

但是,我会提出一个建议。您的主要分组字段为form。它是已知值的非任意固定列表。因此,您可以拥有一个Forms表,其中每种类型的表单都有一个条目:UN,UNC,UNF等。form字段将被定义为该表的外键。

这将带来两个好处。

  1. 数据完整性:form字段中没有先前未在Forms表中定义的值。
  2. 性能:Forms表格将提供第一个下拉框的简单来源。您可以执行select distinct form from ThreadSeries,而不是执行select form from Forms。每个表单都有一个且只有一个条目,不需要使用distinct - 以及任何碰巧未在ThreadSeries字段中列出的表单(例如,如果没有其他原因,当您创建新表单时)还是出现了。
  3. 对于主键,您有两种选择。一个是代理键。这具有能够仅使用一个值唯一地标识行的益处。缺点是这个值对用户没有任何意义。当他们在寻找3/4-10UNC-2A HEX Head时,他们知道如何指定。{1}}。他们可能不知道(并且非常反对必须学习)特定螺钉的值是9383934747甚至是117.这些值(根据定义)是无意义的。您可以通过将PK隐藏起来来防止任何用户对PK的混淆和/或反感。这是常见的做法。

    另一种是使用三个字段作为复合PK。这具有以下优点:用户能够基于他们正在寻找的内容来构建PK值,或者在他们浏览时向下钻取。当然,缺点是使用三个字段而不是一个字段。但是,如果三个字段的内容都是您通常可以使用的值,那么这不是一个缺点。但是,这很重要,这三个字段定义了一个自然键,无论你是否明确地将它们定义为主键。因此,即使您决定使用代理键,也必须将这些字段定义为键:每个字段定义NOT NULL,并使用全部三个unique( form, size, tpi )构建唯一索引。

    这不是一个全面的分析。双方都有其他优点和缺点,但它们很小,通常取决于各种因素,因此可能适用于您的情况,也可能不适用,此外,我不会在这里写书。