3NF 和 BCNF 的简单区别(必须能够向 8 岁的孩子解释)

2023-11-22

我读过这句话:数据取决于密钥 [1NF]、整个密钥 [2NF],仅取决于密钥 [3NF].

但是,我无法理解 3.5NF 或 BCNF,因为它被称为。这是我的理解:

  • BCNF比3NF更严格
  • 表中任何 FD 的左侧必须是超级键(或至少是候选键)

那么为什么有些 3NF 表不在 BCNF 中呢?我的意思是,3NF 引用明确表示“除了键之外什么都没有”,这意味着所有属性仅依赖于主键。毕竟,主键在被选为主键之前一直是候选键。

如果到目前为止我的理解有任何错误,请纠正我,感谢您提供的任何帮助。


您的披萨可以有三种配料类型:

  • 一种奶酪
  • 一种肉
  • 一种蔬菜

所以我们点了两个披萨并选择以下配料:

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

等一下,马苏里拉奶酪不能既是奶酪又是肉!香肠不是奶酪!

我们需要防止此类错误,制作马苏里拉奶酪always是奶酪。我们应该为此使用一个单独的表,因此我们只在一个地方写下该事实。

Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable

这是八岁孩子都能听懂的解释。这是更技术性的版本。

仅当存在多个重叠候选键时,BCNF 的行为才与 3NF 不同。

原因是函数依赖X -> Y当然是真的,如果Y是一个子集X。因此,在任何只有一个候选键且处于 3NF 中的表中,它已经处于 BCNF 中,因为没有任何列(无论是键还是非键)在功能上依赖于该键之外的任何列。

因为每个披萨必须具有每种配料类型中的一种,所以我们知道 (Pizza, Topping Type) 是一个候选键。我们还直观地知道,给定的配料不能同时属于不同类型。所以 (Pizza, Topping) 必须是唯一的,因此也是一个候选键。所以我们有两个重叠的候选键。

我展示了一个异常情况,我们将马苏里拉奶酪标记为错误的配料类型。我们知道这是错误的,但导致错误的规则是依赖性Topping -> Topping Type对于该表,这不是 BCNF 的有效依赖项。它依赖于整个候选键之外的其他东西。

因此,为了解决这个问题,我们从 Pizzas 表中取出 Topping Type,并将其设为 Toppings 表中的非键属性。

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

3NF 和 BCNF 的简单区别(必须能够向 8 岁的孩子解释) 的相关文章

  • MongoDB 中递归文档的结构和查询语法?

    我最近开始在工作项目中研究 MongoDB 我对 JSON 和 MongoDB 的查询结构相当陌生 所以我希望你们中的一位能够提供一些说明 我已将这个问题翻译成 Excel 术语 因为它很常见并且很好地代表了我的问题 如果我尝试将 Exce
  • Firebase 查询 - 查找包含字符串的子项

    我在使用 Firebase 查询时遇到了一些问题 我想查询对象 其中对象子值包含特定字符串 到目前为止 我有一些看起来像这样的东西 Firebase ref Firebase alloc initWithUrl https dinosaur
  • 我需要进行哪些更改才能让我的表在 AppEngine 的 BigTable 上运行?

    假设我有一个预订数据库 其中包括users user id fname lname 和他们的tickets ticket id user id flight no 以及相关的flights flight no airline departu
  • MySQL Workbench:如何将 mysql 数据库导出到 .sql 文件?

    我需要将 mysql 工作台中的数据库导出到文件 sql 该怎么办 在 MySql Workbench 版本 8 0 中 您只需按照以下步骤操作即可 Go to Server tab Go to 数据库导出 这会打开类似这样的东西 在中选择
  • 如何使用 Google App Engine 作为 Android 应用程序的后端数据库

    我实际上是 android 的初学者 需要很多帮助 我制作了一个带有嵌入式数据库的应用程序 现在想将其放在某个动态位置 具有简单的数据形式 一些地址和分支机构信息等 我实际上不知道如何使用放置在动态位置的动态服务器 我怎样才能做到这一点 请
  • 如何使用 php 命令使注册表单高度安全?

    我想让代码对用户来说真正安全 下面的代码显示了 php 代码 我已将其用于我的网站 现在我已经使用了一些验证 例如密码和重复密码必须匹配 并且用户必须输入所有字段 为了使其更安全 我想插入安全命令 例如 PDO mysqli crypto
  • 在插入 SQLite 之前检查表 B 中的日期是否在表 A 中的日期之间

    我有一个名为 项目 的表 其中包含开始日期和结束日期 我还有一个名为 Plan 的表 它有自己的开始日期和结束日期列 但我通过某种方式验证计划开始 结束日期是否在匹配的项目开始 结束日期之间 我不知道在创建表或向计划表中插入行时添加检查是否
  • CodeIgniter 数据库连接未关闭

    我在 CodeIgniter 中建立了一个社交社区网站 该网站现在获得了相当多的流量 托管公司已经开始抱怨并说数据库正在接收空连接以及未关闭的连接 我不完全确定空查询是什么或者最终如何发出空查询 有什么想法吗 我添加了额外的代码以在代码结束
  • 面向对象的数据库是否比带有 ORM 的关系数据库更好?

    只是认为带有 ORM 的关系数据库在很多方面与面向对象的数据库非常相似 我的经验仅在于带有一点 ORM 的 RDMS 所以在我看来 面向对象的数据库非常相似 但没有经验我不能肯定地说 如果您使用过面向对象数据库和 ORM 您能比较它们吗 与
  • 如何在MySQL数据库中插入数据?

    我有一个 ASP NET 应用程序和一个 MySQL 数据库 我想编写一个类来插入 删除和显示数据库中的数据 我有到数据库的连接 但无法在数据库中插入数据 我的班级插入方法 public string CreateEntry string
  • 该模型已具有同名的元素 - ASP.NET

    我正在使用 ASP Net Web 应用程序 每当我尝试添加FOREIGN KEY此错误出现在数据工具操作中 SQL71508 该模型已具有同名的元素 dbo FK Sellers Users SQL71508 该模型已经有一个元素 具有相
  • 实体框架以错误的顺序插入子对象

    Question 为什么 EF 首先在它所依赖的对象 TimesheetActivity 之前插入具有依赖项的子对象 PersonnelWorkRecord 另外我有哪些纠正这个问题的选择 ERD 简化 This is predefined
  • 在 MongoDB 中查找 7 天前的记录

    我有一个包含对象的集合 如下所示 1 id ObjectId 551c6605e4c6ac495c923aab sender id ObjectId 551c6605e4c6ac495c923aac rep sender id 38 sen
  • 同步2个具有不同模式的数据库

    我们有一个使用通用表设计的标准化 SQL Server 2008 数据库 因此 我们没有为每个实体 例如产品 订单 订单项等 使用单独的表 而是使用通用表 实体 实例 关系 属性等 我们决定建立一个单独的非规范化数据库来快速检索数据 您能否
  • Azure:用户登录失败

    我做了什么 我在 Azure 中添加了资源组 添加了带有先前资源组的 Web 服务 添加了带有先前资源组的 SQL Server 数据库 从此数据库检索生成的连接字符串并在此处提供用户名和密码 将此连接字符串添加到Web服务中的应用程序设置
  • Rails 5:迭代的数据库设计

    我目前有一个包含用户 餐食和订单表的网站 Users表保存用户信息 餐食表包含餐食名称 描述 img url 我目前正在使用迭代来显示餐食 span class mealname span p p p p div class qty INP
  • 使用您正在散列的内容的散列作为盐?

    假设用户注册了您的网站 您对他们选择的密码进行哈希处理 然后使用该哈希值作为盐 并使用该盐重新哈希其密码 Example String hash1 MD5 password String endHash MD5 hash1 password
  • 一个大连接或多个查询哪个提供更好的性能?

    我有一个名为订单的表 订单上的一列是 customer id我有一个名为 customers 的表 有 10 个字段 给定两个选项 如果我想构建订单对象数组并嵌入订单对象中的是客户对象 我有两个选择 选项1 A 首先查询订单表 b 循环遍历
  • 限制 sqlite 表的最大行数

    我希望实现一种 活动日志 表 其中用户执行的操作存储在 sqlite 表中 然后呈现给用户 以便他们可以看到他们所做的最新活动 然而 自然地 我觉得没有必要保留每一个历史记录 所以我想知道是否有一种方法可以配置表以在达到最大设置限制后开始修
  • 通过 Matlab 访问 Physionet 的 ptbdb 中的数据库

    我首先设置系统 old path which rdsamp if isempty old path rmpath old path 1 end 8 end wfdb url http physionet org physiotools ma

随机推荐

  • 为什么 Google Compute Engine 不运行我的容器?

    我可以成功地做到这一点 将我的应用程序捆绑到 Docker 镜像中 Build this image into a container using Google Cloud Build upon push to master 此容器存储在注
  • 将 jiffies 转换为秒

    我有一段用户空间代码正在解析 proc PID task TID stat 以获取 cpu 使用情况 我可以使用 HZ 获取每秒的 jiffies 但此代码可以移动到另一台具有不同配置值的机器 有没有办法在运行时从用户空间获取HZ的值 你把
  • j_security_check 重定向

    我正在Tomcat环境中学习Java servlet 我正在学习如何使用 j security check 使用基于表单的登录身份验证 因此 在我的 servlet 中 我有一个包含 j username 和 j password 的登录页
  • 在 pyspark 中拆分列

    我正在尝试在 pyspark 中拆分数据框 这是我拥有的数据 df sc parallelize 1 Foo 10 2 Bar 11 3 Car 12 toDF Key Value df df withColumn Splitted spl
  • htaccess 设置单个文件的 mimetype

    在 htaccess 文件中 可以为给定的扩展名设置 mimetype 例如 AddType application javascript js 如何为单个文件而不是扩展名设置 mimetype 我有一个 Javascript 需要与同一文
  • PHP中获取调用网页的URL

    我正在为一个班级开发网站统计引擎 这个想法是 您可以简单地在网页中嵌入一些代码 该代码将在每个页面加载时调用统计网站 然后统计网站将跟踪您的点击率等等 没有什么突破性的 我想做的是能够按网页细分网站点击量 例如 一个人可以在每个页面上包含相
  • 如何在 Docker 上运行 Spark?

    无法在 Docker 上运行 Apache Spark 当我尝试从驱动程序与 Spark Master 进行通信时 我收到下一个错误 15 04 03 13 08 28 警告 TaskSchedulerImpl 初始作业尚未接受 任何资源
  • Windows 服务安装程序不读取 App.Config 文件

    我已经在我的项目中添加了 App Config 我有一个安装程序类 ProjectInstaller cs 它需要从 App config 读取值 我正在提供钥匙 以下是示例代码 ConfigurationManager AppSettin
  • Android 谷歌地图片段

    我正在开发一个应用程序 顶部有一个菜单 菜单内有一些按钮 我正在尝试将谷歌地图添加到其中一个按钮 但我不是很成功 我正在关注本教程但不是直接实施谷歌地图MainActivity我将它们添加到按下按钮时启动的片段中 一切都很好 当我按下按钮时
  • 通过 pyspark.ml.tuning.TrainValidationSplit 调整后如何获得最佳参数?

    我正在尝试调整 Spark PySpark 的超参数ALS模型由TrainValidationSplit 它运行良好 但我想知道哪种超参数组合是最好的 评估后如何获得最佳参数 from pyspark ml recommendation i
  • PHP 的 mysql_real_escape_string() 的 Java 等效项

    Java 是否有相当于 PHP 的 mysql real escape string 这是为了在将 SQL 注入尝试传递给 Statement execute 之前逃避它们 我知道我可以使用PreparedStatement代替 但我们假设
  • 将不同长度的向量保存在矩阵/数据框中

    我有一个称为区域的长度为 166860 的数字 它由 412 个不同的元素组成 大部分长度为 405 一些长度为 809 我有它们的开始和结束 id 我的目标是提取它们并将它们放入具有 412 列的矩阵 数据框中 现在 我正在尝试这段代码
  • 文件的拖放是如何完成的?

    如在winamp或vlc播放器中 如何拖放文件 我的意思是我想知道什么样的编码进入应用程序 我想知道 c 在 Windows 上的纯 C C 中 开始阅读有关拖动接受文件函数和WM DROPFILES信息 如果您使用更强大的 C 库 Qt
  • 在 perl 中匹配字符串数组进行搜索的最简单方法?

    我想要做的是根据我的搜索字符串检查字符串数组并获取相应的密钥 以便我可以存储它 有没有一种神奇的方法可以用 Perl 来做到这一点 或者我注定要使用循环 如果是这样 最有效的方法是什么 我对 Perl 比较陌生 我只编写了另外 2 个脚本
  • .NET 中的窗口句柄可以改变它的值吗?

    在 NET 进程的生命周期中 System Windows Forms Form 假设使用的主要形式Application Run form 实际上改变它的值 即如果在不同的进程中使用句柄的值 例如IntPtr handle User32
  • 在 Django 模型中表示工作日的多选字段

    我一直在寻找一种优雅的方式来在 Django 模型中表示多选工作日字段 周一 周二 周三 我最初考虑使用按位数学来处理整数字段 但我不确定这是否是正确的方法 这将是一个最常被阅读的领域 我希望 Queryset 方法类似于Entry obj
  • 如何在Android中从网络加载React Native JS包?

    对于我的 Android 应用程序 我需要能够在运行时动态更新捆绑包 并使用资产中预先保存的捆绑包作为后备 我在官方文档 在 iOS 版本的 React Native 中 有一个方法可以让你指定一个 URL 来加载 JS 包 但我还没有看到
  • Cordova + Angularjs + 设备就绪

    我正在使用 Cordova 和 AngularJS 开发移动应用程序 如何在 Cordova 设备准备就绪之前限制 AngluarJS 的引导 基本上我不想在设备准备好之前使用任何 AngularJS 控制器 手动引导您的 Angular
  • 如何排除调试代码

    假设我有一个简单的记录器 void main var logger new MyLogger logger log hello Dart 我希望这段代码在开发模式 虚拟机检查模式 下运行 但我不希望它出现在我的生产代码中 我希望它能被 da
  • 3NF 和 BCNF 的简单区别(必须能够向 8 岁的孩子解释)

    我读过这句话 数据取决于密钥 1NF 整个密钥 2NF 仅取决于密钥 3NF 但是 我无法理解 3 5NF 或 BCNF 因为它被称为 这是我的理解 BCNF比3NF更严格 表中任何 FD 的左侧必须是超级键 或至少是候选键 那么为什么有些