Database design 理解外键

Database design 理解外键,database-design,foreign-keys,database-normalization,functional-dependencies,Database Design,Foreign Keys,Database Normalization,Functional Dependencies,我将下面的单个表分解为3个表,以便根据以下依赖项和组合键(FirstName、LastName、Career)将其分解为3NF: 第一范式: FirstName, LastName, Address, Career, Pay, Managerial People (FirstName, LastName, Career) Addresses (FirstName, LastName, Address) Careers (Career, Pay, Managerial) 依赖项: FirstN

我将下面的单个表分解为3个表,以便根据以下依赖项和组合键(FirstName、LastName、Career)将其分解为3NF:

第一范式:

FirstName, LastName, Address, Career, Pay, Managerial
People (FirstName, LastName, Career)
Addresses (FirstName, LastName, Address)
Careers (Career, Pay, Managerial)
依赖项:

FirstName, LastName -> Address
Career -> Pay, Managerial
第三范式:

FirstName, LastName, Address, Career, Pay, Managerial
People (FirstName, LastName, Career)
Addresses (FirstName, LastName, Address)
Careers (Career, Pay, Managerial)
在本例中,我们可以假设(FirstName、LastName)和(Career)都是唯一的,以避免在address和Careers表中为它们创建id


我认为这个模式中没有外键,对吗?地址和职业的关键只是部分地构成了人的关键。或者人们实际上有两个外键:FK(FirstName,LastName)和FK(Career)以及一个主键:PK(FirstName,LastName,Career)?

你不正确。我不同意你的模式,但是
Person.Career
是对
Careers.Career
的外键引用


类似地,模式中的某个地方可能会有地址id和人员id。

实际上,您有多对多关系。因此,一个地址可以由许多人使用。一个人可以有许多地址。 在这种情况下,persons表中有重复项,addresses表中有重复项。外键将不同,但其他部分将重复。 通常有以下表格:

人员地址(人员id、地址id、发生时间、占用时间)

人员(人员id、职业id、员工自、员工至)


另一部分是,没有像您提到的那样提供复杂键的RDBMS,正如关系数据库理论中所描述的那样,通过分解将表规范化为更高级别的NFs会将表替换为其他表,这些表自然地连接到表中,这些表是表的投影。因此,对于任何共享列,这两个组件都具有相同的一组子程序值,因为它们都是原始列的投影。因此,当/iff后一列集合在后一个表中形成CK(候选键)时,从一个列集合和表到另一个列集合和表有一个FK(外键)

在这里,如果您的原始FD构成封面:您有人员CKs{{{FirstName,LastName,Career}},地址CKs{{{FirstName,LastName}}和Careers CKs{{{Career}。因此,FK是人FK{FirstName,LastName}到地址&{Career}到职业

PS在进行规范化时,我们经常会意识到,我们不需要原始表的投影,而是需要具有标题的表,如某些组件,但包含更多行。(有时这被误传为规范化的一部分。)(我们检测并重新设计删除和插入异常,尽管规范化只处理更新异常。)然后,我们选择的这些不同的表通常没有与规范化组件相同的CKs或subrow值集

PS规范化到更高的NFs不会引入新列。其中包括id列


PS关系上的“FK”通常包含一个列集。但它可能意味着一个列列表引用另一个列列表。或列列表,其中每个名称都会引用另一个名称出现一次。但是SQL“FK”并不意味着FK的任何关系概念——它或多或少意味着外部超键。类似地,SQL“PK”或多或少地表示主超键

编辑后添加“为了本例的目的,我们可以假设(FirstName,LastName)是唯一的,也可以假设(Career)是唯一的,以避免在address和Careers表中为其创建ID。”除非您告诉我们假设所有组件CKs或FDs是什么,并假设您的分解是正确的,否则我们无法告诉您FKs是否有效。(即使这样,你也可能给我们提供相互矛盾的信息。)换句话说,持有的FK取决于FK的定义&而不是标准化分解所特有的任何东西。SQL中的PS“FK”并不意味着FK。它或多或少意味着外键。PS标签SQL与此有什么关系?一个人需要CKs来分解&这需要FD覆盖,但你不能说这是一个。Re“is this right”:按照参考资料/教科书展示你的工作步骤,并说明理由——你可能会发现错误,使你的问题变得不必要&我们想检查你的工作,但不想重做&当算法允许时,我们需要你的选择&否则我们无法告诉你哪里错了&哪里对了。请看,点击谷歌的“stackexchange家庭作业”和鼠标文本上方的投票箭头。通过分解将PS规范化为higherf NFs不涉及引入新列。“(FirstName,LastName)是唯一的,并且(Career)“在哪个表中?”?问题的原始表没有这些列&它特别指出FirstName,LastName->Address。此外,规范化到更高级别的NFs不会引入新列。你提到了一大堆与问题无关和矛盾的事情。这些事情与现实生活中的解决方案有关,因为我已经过期了。因此,我提到了它们作为一种常见的解决方案。不认为这是科学考试。这不是问题的答案。