我正在尝试为设备建模电缆映射。每个设备都有多个卡,每个卡都有多个端口。由于卡和端口的数量各不相同,我对如何建立正确的规范化形式和关系感到困惑,以解决具有任意数量卡的设备记录和具有任意数量端口的卡。有什么想法吗?
我有一个person带有属性的表:
id
name
city
state
country
Run Code Online (Sandbox Code Playgroud)
id是主键。这个表是 3NF 吗?如果 1000 人住在同一个城市,那么为州、城市和国家存储相同的数据似乎是多余的。
我经常看到,您不应该将所有地址字段(邮编、街道、城市、州、国家/地区等)与用户信息表(pk_id、姓名、电子邮件...)放在同一个表中。
这将违反第 3 次规范化。这是有道理的,所有地址字段都不是基于用户(或用户的 pk)。
但是,我已经不止一次看到邮政编码是解决这个问题的一个很好的主/外键?嗯?示例:数据库规范化
显然不止一个人可以住在同一个邮政编码中,所以这对我来说没有意义。将邮政编码保留在用户表中但将其余地址保留在另一个表中对我来说似乎很奇怪。
分离地址表但仍遵守规范化规则的标准最佳方法是什么?
假设我有一个包含架构的表:
id value
1 0.3
2 0.6
5 0.1
4 0.7
Run Code Online (Sandbox Code Playgroud)
由...提供
CREATE TABLE foo AS
SELECT * FROM (
VALUES (1,0.3::float),(2,0.6),(5,0.1),(4,0.7)
) AS x(id, value)
Run Code Online (Sandbox Code Playgroud)
我想离散值列。
这个想法是对值进行排序,并将 1 与前半部分相关联,将 2 与第二部分相关联。
id value normalized
1 0.3 1
2 0.6 2
5 0.1 1
4 0.7 2
Run Code Online (Sandbox Code Playgroud)
我不知道如何在 SQL 中做到这一点,有什么帮助吗?
PS:我正在使用 Postgres,所以任何依赖 Postgres 的解决方案也可以
好吧,基本上我觉得我倾向于过度规范化事情,也许我这样做是以牺牲性能为代价的。因此,为了阐明这个问题,我创建了以下模式作为示例:

如您所见,我概述了两种不同的方法。这里的想法是所有大学都有课程(例如工程),并且所有课程都有专业(例如电气工程)。为了让这个例子起作用,我们必须假设有 40 个项目,比如 1000 个专业,并且学校有相同的项目/专业。
现在,我在这种情况下的典型做法是将任何可能重复的内容(即专业和课程)放入自己的表中;然后有一个关系,如上所示。另一种我倾向于远离的方法是第二种模型,其中 program 和 major 是具有重复值的列(例如,Engineering 可能会在表格中重复 1,00 次)。基本上,如果值重复,我会为它创建一个表。
现在,我对其中哪一种更好的方法不太感兴趣,因为我只是用它们作为一个例子来阐明真正的问题:人们如何知道它们何时过度规范化?我知道您在规范化表格方面做得太过分了,但我从来不知道衡量标准是什么。
附录
大学不需要在一个项目中拥有所有专业,因此大学与专业相关,而不是项目(例如,大学 X 有工程学院,但没有核工程,这是工程项目的一部分)。
以下是 SQL 表的列:
Course_Code
Course_Name
Tutor_ID
Tutor_Name
Student_No
Student_Name
DateOfBirth
Gender
LastAttDate
Run Code Online (Sandbox Code Playgroud)
通过检查下面的所有 NF1 要求,我相信这张表是 NF1。
All data is atmoic
There is no grouping of columns.
Each column can be identified by a primary key. (Course_Code)
Run Code Online (Sandbox Code Playgroud)
但是在我得到这个问题的这个网站上,他们对表格进行了一些修改,使其成为 NF1。我相信这些修改是不必要的,表格已经在 NF1 中了。
我在这里错过了什么吗?
为了使关系在 1NF 上,它需要将所有值都作为原子,如果有一个集合,它甚至不是第一个范式:
但直觉上,我认为具有该集合的表会比不将该集合的值仅用作实体的属性的表更规范化。
例如,让我们想象这张关于绘画的表格:
绘画名称,作者,使用的技术,使用的颜色
现在,如果我们使用一组颜色,如{蓝色、绿色、黄色、黑色、白色、紫色},我们会得到一张甚至不在 1NF 中的表格。
如果我们将表传递给 1NF,那么我们需要有 6 行,每行重复 Painting_name、Author 和 Used 技术。
这看起来比甚至不在 1NF 中的表更不规范化,而且我不明白为什么在那里有一个集合会损害任何可能的规范化,因为这些集合只会在该表中使用。
那么需要原子值才能拥有规范化表的原因是什么?
我有一个 3NF 规范化数据库设计,并试图理解强实体类型与弱实体类型的概念,我的理解是弱实体类型是没有主键的表。但是,所有表都应该有一个主键,从而使它们成为一个强大的实体吗?那么我所有的表都是强实体吗?或者我错过了什么?
重新思考,我的连接表有复合键,(在 maria db 中也制作了一个复合键,您执行 PRIMARY KEY(column1, column2)),那么这些类会作为弱实体吗?