database - 一个表可以有不依赖于主键的列,并且仍然在 2NF 中吗?
问题描述
我是数据库新手,过去两天一直在学习正常的表单/数据库实践。我为飞机检查数据创建了以下模型表,但我不确定它是否处于第二范式。检查 ID 是主键,但真正依赖于检查 ID 的唯一信息是日期。技术指令是机械师在进行飞机检查时遵循的指南,但它不会以任何方式影响检查 ID。检查员姓名也不依赖于检查 ID。
如果两列不依赖于主键,这个表会破坏 2NF 吗?
下表如下:
解决方案
您的表的主键是单列,没有其他唯一键(或者看起来如此),因此它自动处于第二范式,因为主键没有(非空)正确子集。
我的其余答案涉及表格是否满足第三范式的问题(感谢您指出这一点,philipxy)。
主键和数据之间不必有任何逻辑依赖关系。事实上,主键通常是人为生成的数字。
关键是任何字段都不应依赖于除主键之外的任何字段。
例如,如果Inspector Name
您的示例中的 a 始终相同Technical Order
,则该表将不是第二范式。在这种情况下,您将创建第二个表,其中Technical Order
主键Inspector Name
是一个字段。然后,您的原始表将仅包含第二个表Technical Order
的外键。
以这种方式规范化您的数据模型可以避免冗余,从而减少存储空间并自动降低不一致的危险(现在不可能发生两行具有相同Technical Order
但不同的Inspector Name
.
要判断一个表是否被规范化,你必须知道数据的语义。
推荐阅读
- html - 具有高度的 IE11 垂直弹性框布局:自动和溢出不起作用
- html - 侧边导航栏左侧的空白区域
- javascript - Redux-Form 字段未编辑
- css - 在 Bootstrap 4 中,如何消除导航栏和切换菜单项之间的间隙?
- c++ - 无长度初始化 C++ std::array
- javascript - 从画布视频在线录制
- android - FMX - TAction OnUpdate 不起作用
- linux-kernel - 为什么 /proc/iomem 在 64 位 linux 中只显示零而不是地址?
- xamarin.ios - xamarin ios 发布错误-缺少 Info.plist 值-缺少 Info.plist 键“CFBundleIconName”的值
- c# - Double ToString 给出四舍五入的结果