规范化为 3NF(第三范式)时,可以将复合键和/或外键移动到其他表吗

2023-11-29

我的数据库设计目前处于 3NF。问题是外键,在某些情况下是复合键。

如果与复合/外键关联的属性不依赖于主键,您是否可以移动复合键和/或外键来创建其他表?

我怀疑答案是肯定的,因为这个链接:

第三范式中是否包含外键?
最佳答案:仅仅因为它是外键并不意味着它也不能被视为主键的属性。事实上,它首先是一个外键,这意味着它正在定义与另一个表的关系,因此不会违反 [...] 3NF。
——《疯狂教授》
https://answers.yahoo.com/question/index?qid=20081117095121AAXWBbX#

这让我想知道我现在的正常化阶段是否是3NF。


Preamble

在纯关系数据库理论中,没有什么可以阻止您拥有复合主键 (PK),并且您可以拥有引用它们的外键 (FK),并且这些 FK 也必然是复合的。有些软件很难使用复合键,因此您经常会发现人们添加一个 ID 列,其中包含自动生成的数字,然后将其指定为表的 PK。然后,其他表可以具有引用(简单)ID 列的(简单)FK。一个常见的错误是忘记原始复合 PK 仍然是候选键 (CK),并且其唯一性应由 DBMS 通过表上的唯一约束来强制执行;它成为替代密钥 (AK)。

导流

CK、AK 和 PK 系统的工作原理如下:

  • 每个 CK 都是一组(一个或多个)列,它是表中每行数据的其余部分中的数据的唯一标识符。
  • 一个 CK 可以被指定为the PK.
  • 其他 CK 变为 AK。

考虑这个表:

CREATE TABLE elements
(
    atomic_number   INTEGER NOT NULL PRIMARY KEY
                    CHECK (atomic_number > 0 AND atomic_number < 120),
    symbol          CHAR(3) NOT NULL UNIQUE,
    name            CHAR(20) NOT NULL UNIQUE,
    atomic_weight   DECIMAL(8,4) NOT NULL,
    period          SMALLINT NOT NULL
                    CHECK (period BETWEEN 1 AND 7),
    group           CHAR(2) NOT NULL
                    -- 'L' for Lanthanoids, 'A' for Actinoids
                    CHECK (group IN ('1', '2', 'L', 'A', '3', '4', '5', '6',
                                     '7', '8', '9', '10', '11', '12', '13',
                                     '14', '15', '16', '17', '18')),
    stable          CHAR(1) DEFAULT 'Y' NOT NULL
                    CHECK (stable IN ('Y', 'N'))
);

Each of atomic_number, symbol and name是候选键。对于化学来说,symbol作为主键最方便;对于物理学来说,atomic_number是最方便的。与同位素等相关的表格引用了atomic_number列,但与化合物相关的表格引用了symbol柱子。这里的三个CK都很简单;另一方面,同位素表有一个由元素的原子序数(质子数)和中子数组成的复合PK。

Answer

回到你的问题,你的数据很可能是 3NF,或更可能是 BCNF(形式上比 3NF 更强)。

在我们评估您的设计之前,您必须向我们展示您的表架构并指定适用于列的约束(功能依赖性等)。但您所描述的任何内容都不会先验地阻止其正常化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

规范化为 3NF(第三范式)时,可以将复合键和/或外键移动到其他表吗 的相关文章

  • Hibernate 复合键:外键的列数错误

    我是 Hibernate 和 JPA 的新手 在设置复合键时遇到困难 定义如下 Entity Table name Entity TABLE IdClass EntityPK class public class MyEntity exte
  • MySQL 清除表中的重复条目并重新链接依赖表中的 FK

    这是我的情况 我有 2 张桌子 patient and study 每个表都有自己的 PK 使用自动增量 就我而言 pat id 应该是唯一的 它没有在数据库级别声明为唯一 因为它在某些用途中可能不是唯一的 它不是自制系统 我找到了如何配置
  • 多态关联外键约束。这是一个好的解决方案吗?

    我们在应用程序中使用多态关联 我们遇到了经典问题 我们遇到了无效的外键引用 并且无法创建外键约束 因为它是多态关联 也就是说 我对此做了很多研究 我知道使用多态关联的缺点和优点 但我发现了一个似乎不错的解决方案 http blog meta
  • 为什么 SQL 标准允许重复行?

    中的一个核心规则 http en wikipedia org wiki Codd 27s 12 rules对于关系模型来说 元组 行 所需的唯一性是 数据库中的每个单独的标量值must通过指定包含表的名称 包含列的名称和首要的关键包含行的值
  • 在 SSIS 中插入新记录之前如何清空目标表?

    我使用 SSIS 生成和转换新数据 以便以后在新系统中使用 每次运行 SSIS 包时我都会遇到问题 它不断将新记录插入到我的目标表中 如何先清空目标表 OLE DB Destination 然后插入新生成的记录 目前此问题的解决方法是执行d
  • SQLSTATE[HY000]:一般错误:1215 无法添加外键约束 laravel 9

    尝试分配外键 但是当您运行迁移时 我收到此错误 我不明白问题是什么 SQLSTATE HY000 一般错误 1215 无法添加外键约束 SQL alter tablecategories添加约束categories parent key f
  • 外键约束可能会导致循环或多个级联路径[重复]

    这个问题在这里已经有答案了 可能的重复 外键约束可能会导致循环或多级联路径 https stackoverflow com questions 851625 foreign key constraint may cause cycles o
  • 仅包含主键和外键的数据库表的用途是什么?

    我试图理解一个简单的音乐数据库设计 有些表只包含外键和主键 我不确定如何以及何时使用这些表或向其中插入什么内容 设计如下 Track id primary key title duration live performance true o
  • Postgres 运行缓慢的删除查询

    我们有一个表 其行数刚刚超过 62k 我们正在对其运行一个非常简单的删除查询 需要 45 分钟才能完成 DELETE FROM myTable WHERE createdtime lt 2017 03 07 05 00 00 000 我们尝
  • 使用 Symfony 3 / Doctrine 进行属性形式的一对多对一

    问题是这样的 我有一个包含 3 个类的模型 person 人员 工作 job 一个人可以有多个工作 任何工作与人的关系都可以有 date start 属性 date end 和 comment 因此 我使用持有这些属性的可连接 person
  • 如何设计具有主键和多值属性的表?

    我对数据库设计很感兴趣 现在正在阅读相应的文献 通过这本书 我遇到了一个让我感到不确定的奇怪例子 有一个关系 在此表中 我们有一个复合主键 StudentID Activity 但ActivityFee部分依赖于表的key Activity
  • 字段“id”期望一个数字,但得到“natsu”django

    我想创建一个 user posts 视图 其中包含与特定用户相关的所有帖子 假设有用户 Natsu 撰写的博客帖子 那么登录用户 Testuser 将能够查看所有帖子由该用户发布 即用户 Natsu 的所有帖子 blog models py
  • 使用 hibernate 进行动态查询

    我有一个应用程序 我需要使最终用户能够通过某种类型的向导定义选项来创建临时报告 其过程如下 1 User selects the table s he wants to query eg person project activities
  • 如何将图数据结构持久化到关系数据库中?

    我考虑过创建一个顶点表和一个边表 但是在内存中构建图和遍历子图是否需要大量查找 我想避免过多的数据库读取 还有其他方法可以保存图表吗 旁注 我听说过 Neo4j 但我的问题实际上是如何在概念上表示标准数据库中的图形 不过 我对一些 NoSQ
  • 发布数据以同时创建相关的 Tastypie 资源?

    给定两个相关的 Django 模型A and B in a 一对多关系 模型 py class A models Model name models CharField max length 5 class B models Model n
  • 如何将子表的删除级联到父表?

    我准备了a fiddle这说明了问题 http sqlfiddle com 15 e25c5 2 CREATE TABLE parent parent id integer primary key CREATE TABLE child ch
  • 带外键或不带外键的引用有什么区别

    关于SQLite 带外键或不带外键的引用有什么区别 这有什么区别 CREATE TABLE players set id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL player id INTEGE
  • 实体框架以错误的顺序插入子对象

    Question 为什么 EF 首先在它所依赖的对象 TimesheetActivity 之前插入具有依赖项的子对象 PersonnelWorkRecord 另外我有哪些纠正这个问题的选择 ERD 简化 This is predefined
  • 使用Table Per Subclass时如何确保数据完整性?

    我正在使用每个子类的表Grails 中的策略通过设置tablePerHierarchy静态的性质mapping我的超类中的字段为 false 这样 Grails 会为我的超类创建一张表 并为我的每个子类创建一张附加表 然而 虽然超类和子类记
  • SQL 删除表并重新创建并保留数据

    在我们最初的设计中 我们搞砸了表中的外键约束 现在表已充满数据 我们无法在不删除表中所有记录的情况下更改它 我能想到的唯一解决方案是创建一个备份表并将所有记录放在那里 然后删除所有记录 更改表并开始将它们添加回来 还有其他 更好 的想法吗

随机推荐