我的 table 需要更多规范化吗?
Does my table need more normalization?
我正在制作一个简单的 public 现金簿数据库 table 来计算我和我的朋友一起吃饭花了多少钱。
我的第一个 table 只有一个 table 并且它有一列 "person" 具有非原子值,所以我将我的 table 分成两个 table以上。
但我不确定这是否足够规范。是否有任何应该归一化但我不知道它存在的函数依赖?
(我将使用 MySql,但您可以使用任何类型的 DBMS 回答我。)
嗯,让我们看看如何对其进行归一化:
- 在 table1 中,我们可以用 table2.
的外键引用替换 payer
- 删除table2中的重复项,使其成为主键,(以后可以用它来索引)
规范化需要了解函数依赖性 (FD) 和连接依赖性 (FD)。你没给。
您的申请 如果我们确切知道每个 table(即到这样的程度,我们可以查看一种情况,并了解每一行可能的行是否从谓词中得出一个真命题,因此属于 table)以及可能出现的确切情况(通过 "business rules"关于可能的应用情况,相当于对可能的数据库状态的约束。
你的"keys"你没有给FD。您刚刚给出了一个候选密钥 (CK) 和一个 "unique key"。但是你不能在不了解 FD 的某些事情的情况下确定部分或全部 CK。因此,当您给出 CK 时,就等于说存在和不存在某些 FD。当你给出一些标记为 PK 或 "unique key" 的列集时,你需要告诉我们你给了我们什么:"unique key" 是 CK(不包含更小的唯一子集)还是只是一个超级键(唯一)?你给了所有的 CK 还是可以有其他的?除了给定超级键的超集之外,还有其他超级键吗?如果您只是准确地告诉我们您知道持有哪些 FD(通过最小覆盖)以及您知道哪些不持有,那将是最有帮助的。
猜测
我不知道 is_calculated
是干什么用的。
也许给定的 date
和 meal
对正好有一个 content
?
TL;DR 您确实需要检查每组可能的列,看看它是否在功能上决定了其他列。即对于每个数据库状态,一组列的值的子行是否只与该列的一个值一起出现。我们只能在没有清楚了解您的谓词和您的应用程序的情况下进行猜测。您可以通过以下方式减少工作量:如果一组列是唯一的,则其超集确定所有其他列。如果一组列是最小唯一的(是 CK),则其较小子集的 none 确定所有其他列。您可以寻找推定 FD 的反例,其中两行对于推定行列式可以具有相同的值子行,但对于推定确定属性具有不同的值。阿姆斯特朗公理生成所有由给定公理隐含的 FD。
JDs 标准化为 4NF 和 5NF 涉及将 table 拆分为多个 tables 以消除 CKs 未暗示的 JDs。 table的谓词恰好可以表示为其他谓词的AND,当一个JD对应于谓词的列集时。当每个 JD 中的每个合取与至少一个 CK 上的其他合取重叠时,关系就属于 5NF。 (Fagin 的成员算法。)
PS 如果你关心限制,你从一个 table 到两个时是否失去了一个?
我正在制作一个简单的 public 现金簿数据库 table 来计算我和我的朋友一起吃饭花了多少钱。 我的第一个 table 只有一个 table 并且它有一列 "person" 具有非原子值,所以我将我的 table 分成两个 table以上。
但我不确定这是否足够规范。是否有任何应该归一化但我不知道它存在的函数依赖?
(我将使用 MySql,但您可以使用任何类型的 DBMS 回答我。)
嗯,让我们看看如何对其进行归一化:
- 在 table1 中,我们可以用 table2. 的外键引用替换
- 删除table2中的重复项,使其成为主键,(以后可以用它来索引)
payer
规范化需要了解函数依赖性 (FD) 和连接依赖性 (FD)。你没给。
您的申请 如果我们确切知道每个 table(即到这样的程度,我们可以查看一种情况,并了解每一行可能的行是否从谓词中得出一个真命题,因此属于 table)以及可能出现的确切情况(通过 "business rules"关于可能的应用情况,相当于对可能的数据库状态的约束。
你的"keys"你没有给FD。您刚刚给出了一个候选密钥 (CK) 和一个 "unique key"。但是你不能在不了解 FD 的某些事情的情况下确定部分或全部 CK。因此,当您给出 CK 时,就等于说存在和不存在某些 FD。当你给出一些标记为 PK 或 "unique key" 的列集时,你需要告诉我们你给了我们什么:"unique key" 是 CK(不包含更小的唯一子集)还是只是一个超级键(唯一)?你给了所有的 CK 还是可以有其他的?除了给定超级键的超集之外,还有其他超级键吗?如果您只是准确地告诉我们您知道持有哪些 FD(通过最小覆盖)以及您知道哪些不持有,那将是最有帮助的。
猜测
我不知道 is_calculated
是干什么用的。
也许给定的 date
和 meal
对正好有一个 content
?
TL;DR 您确实需要检查每组可能的列,看看它是否在功能上决定了其他列。即对于每个数据库状态,一组列的值的子行是否只与该列的一个值一起出现。我们只能在没有清楚了解您的谓词和您的应用程序的情况下进行猜测。您可以通过以下方式减少工作量:如果一组列是唯一的,则其超集确定所有其他列。如果一组列是最小唯一的(是 CK),则其较小子集的 none 确定所有其他列。您可以寻找推定 FD 的反例,其中两行对于推定行列式可以具有相同的值子行,但对于推定确定属性具有不同的值。阿姆斯特朗公理生成所有由给定公理隐含的 FD。
JDs 标准化为 4NF 和 5NF 涉及将 table 拆分为多个 tables 以消除 CKs 未暗示的 JDs。 table的谓词恰好可以表示为其他谓词的AND,当一个JD对应于谓词的列集时。当每个 JD 中的每个合取与至少一个 CK 上的其他合取重叠时,关系就属于 5NF。 (Fagin 的成员算法。)
PS 如果你关心限制,你从一个 table 到两个时是否失去了一个?