主键的哪一列
Which column(s) for Primary Key(s)
螺母和螺栓的示例数据 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
最终,我尝试在 Web 应用程序中构建下拉菜单,允许用户 select 一个有效的螺栓,例如 3/4-10UNC-2A HEX Head.
3/4-6UNC-2A HEX Head
无效,因为它们不要制造每英寸有 6 个螺纹的 3/4" 螺栓(它不会在此 table 中加载)。
第一次下拉 select 螺栓类型,第二次下拉提供基于螺栓类型(在另一个数据库 table 中定义)可用的螺栓尺寸
第三次下拉将提供螺栓定义的最后部分。因此,如果用户 select 的六角头,然后是 5/16",他们会看到 UNC-18、UN-20、UNF-24、UN-28 和 UNEF-32 的选择。
我的 PK 选项可能是:
- 代理并创建唯一约束。
- 使用size和form作为复合PK,决定tpi
- 使用size和tpi作为复合PK,决定形态
- 使用form和tpi作为PK,决定大小
- 所有三个字段作为PK(可能是错误的!)
对于查询,我选择哪个 PK 选项似乎无关紧要,因为我将根据螺栓直径进行查询以获得其他两个值。我遗漏的是 2A 值,它与另一个 table 中的联合国表格相关,以及 "doozey" 进一步限制螺栓类型可以使用哪些 ThreadSeries 的要求。
我在 Java EE 中执行此操作,使用 JSF 和 JPA 实体(如果重要的话)
您的问题根本不在于键值。您正在做的是 "drilling down" 在三列中找到唯一的值组合。该进程不使用密钥。
不过,我提一个建议。您的主要分组字段是 form
。它是一个非任意的、固定的已知值列表。出于这个原因,您可以有一个表单 table,其中每种类型的表单都有一个条目:UN、UNC、UNF 等。form
字段将被定义为 table.
这会带来两个好处。
- 数据完整性:
form
字段中不能存在之前未在 Forms
table. 中定义的值
- 性能:表单 table 将提供第一个下拉框的简单来源。您可以执行
select form from Forms
而不是执行 select distinct form from ThreadSeries
。每个表单都有一个且只有一个条目,无需使用 distinct
-- 任何恰好未在 ThreadSeries 字段中列出的表单(例如当您创建新表单时,如果没有其他原因)将仍然出现。
至于主键,你有两种选择。一个是代理键。这样做的好处是能够仅使用一个值来唯一标识一行。缺点是此值对您的用户没有意义。当他们寻找 3/4-10UNC-2A HEX Head
时,他们知道如何指定它。他们可能不知道(并且非常反对必须学习)那个特定螺钉的值是 9383934747 甚至 117。这些值(根据定义)毫无意义。您可以通过向用户隐藏它来防止任何用户混淆 and/or 对 PK 的反感。这是常见的做法。
另一种是三场复合PK。这样做的好处是用户能够根据他们正在寻找的内容或在浏览时向下钻取来构建 PK 值。当然,缺点是使用三个字段而不是一个字段。但是,如果这三个字段的内容是您通常可以使用的值,那么这并不是一个不利因素。但是,这很重要,这三个字段定义了一个自然键,无论您是否明确将它们定义为主键。因此,即使您决定使用代理键,这些字段也必须定义为键:每个单独的字段都定义为 NOT NULL,并且使用所有三个字段构建一个唯一索引 -- unique( form, size, tpi )
.
这不是一个全面的分析。双方都有其他优点和缺点,但它们是次要的,通常取决于不同的因素,因此可能适用于也可能不适用于您的情况,此外,我不是在这里写书。
use size and form as composite PK, which determines tpi
use size and tpi as composite PK, which determines form
use form and tpi as PK, which determines size
所有这些都是错误的假设。随着数据库的增长,没有什么可以阻止这些假设之一被证明是错误的。例如。 1/4 UNC 28
被添加到库存中。
- 因此,如果您从其中任何一个创建了 PK,那将破坏数据库,并且您将不得不更改依赖于此 PK 的整组 table。
您不能通过 FD 确定键(除了作为理论课堂练习,使用 a、b 和 cs)。这不是教室。这些列是真实的,它们具有意义(a、b 和 c 没有意义)。您非常正确地描述了问题和含义。
密钥确定是一种直接的逻辑练习,是数据建模的重要组成部分。
您的每个示例行都是一个事实。那必须存储。那一定是独一无二的。
all three fields as PK (probably wrong!)
那是唯一正确的PK。这是提供行唯一性的唯一组合,以确保 table.
中没有重复行
surrogate and create unique constraints.
既然您无法避免提供行唯一性的主键,那将是多余的,一个额外的制造列加上什么都不做的索引。
代理不提供关系模型中要求的逻辑行唯一性(它们提供物理记录 ID 唯一性)。
如果你不明白我在说什么,请阅读,从顶部到假教师
Something I left out is the 2A values, which relate to the UN Forms in another table, and a "doozey" of a requirement that further limits which ThreadSeries can be used with a bolt type.
关系模型 基于一阶谓词演算,通常称为一阶逻辑 (FOL)。没有什么不能在 FOL 中声明的。因此,在关系数据库中没有什么是不能建模的。
- 那些写书声称是关于 关系模型 或关系数据库的“理论家*,不了解这些基础知识,他们写道各种事情无法完成;他们使用所有 table 的代理(反关系),这导致记录归档系统,具有 none 的关系完整性(与参照完整性不同)、关系数据库的能力或速度。
重新打开一个新问题 "doozey" 然后 ping 我。
螺母和螺栓的示例数据 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
最终,我尝试在 Web 应用程序中构建下拉菜单,允许用户 select 一个有效的螺栓,例如 3/4-10UNC-2A HEX Head.
3/4-6UNC-2A HEX Head
无效,因为它们不要制造每英寸有 6 个螺纹的 3/4" 螺栓(它不会在此 table 中加载)。
第一次下拉 select 螺栓类型,第二次下拉提供基于螺栓类型(在另一个数据库 table 中定义)可用的螺栓尺寸
第三次下拉将提供螺栓定义的最后部分。因此,如果用户 select 的六角头,然后是 5/16",他们会看到 UNC-18、UN-20、UNF-24、UN-28 和 UNEF-32 的选择。
我的 PK 选项可能是:
- 代理并创建唯一约束。
- 使用size和form作为复合PK,决定tpi
- 使用size和tpi作为复合PK,决定形态
- 使用form和tpi作为PK,决定大小
- 所有三个字段作为PK(可能是错误的!)
对于查询,我选择哪个 PK 选项似乎无关紧要,因为我将根据螺栓直径进行查询以获得其他两个值。我遗漏的是 2A 值,它与另一个 table 中的联合国表格相关,以及 "doozey" 进一步限制螺栓类型可以使用哪些 ThreadSeries 的要求。
我在 Java EE 中执行此操作,使用 JSF 和 JPA 实体(如果重要的话)
您的问题根本不在于键值。您正在做的是 "drilling down" 在三列中找到唯一的值组合。该进程不使用密钥。
不过,我提一个建议。您的主要分组字段是 form
。它是一个非任意的、固定的已知值列表。出于这个原因,您可以有一个表单 table,其中每种类型的表单都有一个条目:UN、UNC、UNF 等。form
字段将被定义为 table.
这会带来两个好处。
- 数据完整性:
form
字段中不能存在之前未在Forms
table. 中定义的值
- 性能:表单 table 将提供第一个下拉框的简单来源。您可以执行
select form from Forms
而不是执行select distinct form from ThreadSeries
。每个表单都有一个且只有一个条目,无需使用distinct
-- 任何恰好未在 ThreadSeries 字段中列出的表单(例如当您创建新表单时,如果没有其他原因)将仍然出现。
至于主键,你有两种选择。一个是代理键。这样做的好处是能够仅使用一个值来唯一标识一行。缺点是此值对您的用户没有意义。当他们寻找 3/4-10UNC-2A HEX Head
时,他们知道如何指定它。他们可能不知道(并且非常反对必须学习)那个特定螺钉的值是 9383934747 甚至 117。这些值(根据定义)毫无意义。您可以通过向用户隐藏它来防止任何用户混淆 and/or 对 PK 的反感。这是常见的做法。
另一种是三场复合PK。这样做的好处是用户能够根据他们正在寻找的内容或在浏览时向下钻取来构建 PK 值。当然,缺点是使用三个字段而不是一个字段。但是,如果这三个字段的内容是您通常可以使用的值,那么这并不是一个不利因素。但是,这很重要,这三个字段定义了一个自然键,无论您是否明确将它们定义为主键。因此,即使您决定使用代理键,这些字段也必须定义为键:每个单独的字段都定义为 NOT NULL,并且使用所有三个字段构建一个唯一索引 -- unique( form, size, tpi )
.
这不是一个全面的分析。双方都有其他优点和缺点,但它们是次要的,通常取决于不同的因素,因此可能适用于也可能不适用于您的情况,此外,我不是在这里写书。
use size and form as composite PK, which determines tpi
use size and tpi as composite PK, which determines form
use form and tpi as PK, which determines size
所有这些都是错误的假设。随着数据库的增长,没有什么可以阻止这些假设之一被证明是错误的。例如。 1/4 UNC 28
被添加到库存中。
- 因此,如果您从其中任何一个创建了 PK,那将破坏数据库,并且您将不得不更改依赖于此 PK 的整组 table。
您不能通过 FD 确定键(除了作为理论课堂练习,使用 a、b 和 cs)。这不是教室。这些列是真实的,它们具有意义(a、b 和 c 没有意义)。您非常正确地描述了问题和含义。
密钥确定是一种直接的逻辑练习,是数据建模的重要组成部分。
您的每个示例行都是一个事实。那必须存储。那一定是独一无二的。
all three fields as PK (probably wrong!)
那是唯一正确的PK。这是提供行唯一性的唯一组合,以确保 table.
中没有重复行surrogate and create unique constraints.
既然您无法避免提供行唯一性的主键,那将是多余的,一个额外的制造列加上什么都不做的索引。
代理不提供关系模型中要求的逻辑行唯一性(它们提供物理记录 ID 唯一性)。
如果你不明白我在说什么,请阅读
Something I left out is the 2A values, which relate to the UN Forms in another table, and a "doozey" of a requirement that further limits which ThreadSeries can be used with a bolt type.
关系模型 基于一阶谓词演算,通常称为一阶逻辑 (FOL)。没有什么不能在 FOL 中声明的。因此,在关系数据库中没有什么是不能建模的。
- 那些写书声称是关于 关系模型 或关系数据库的“理论家*,不了解这些基础知识,他们写道各种事情无法完成;他们使用所有 table 的代理(反关系),这导致记录归档系统,具有 none 的关系完整性(与参照完整性不同)、关系数据库的能力或速度。
重新打开一个新问题 "doozey" 然后 ping 我。