我正在制作一个简单的公共现金簿数据库表来计算我和朋友一起吃饭的费用。 我的第一张桌子只有一张桌子,而且它有一个专栏" person"使用非原子值,所以我将我的表分成两个表,如上所述。
但我不确定这是否足够正常化。是否有任何功能依赖应该归一化,但我不知道它的存在?
(我将使用MySql,但您可以使用任何类型的DBMS回答我。)
答案 0 :(得分:1)
规范化需要知道功能依赖性(FD)和连接依赖性(FD)。你没有给他们。
您的应用我们只能告诉您FD和JD如果我们确切知道每个表格的“我想表达的关系”(即谓词)(即我们可以查看一个情况,并知道每一个可能的行是否从谓词中得出一个真正的命题,因此属于表格中)以及确切可能出现的情况(通过关于可能的应用情况的“业务规则”,相当于对可能的限制)数据库状态)。
您的“密钥”您没有提供FD。你只给了一个候选键(CK)和一个“唯一键”。但是如果不知道有关FD的某些事情,你无法确定部分或全部的CK。因此,当你给CK时,就像说有和不是某些FD一样。当你给出一些标记为PK或“唯一密钥”的列集时,你需要告诉我们你给我们的东西:一个“唯一密钥”是CK(不包含更小的唯一子集)还是只是一个超级密钥(唯一)?你给了所有的CK还是有其他的?可能还有其他超级密钥而不是给定的超级密钥吗?如果您确切地告诉我们您知道哪些FD(通过最小的封面)以及您知道哪些不适用,那将是非常有用的。
<强>猜测强>
我不知道is_calculated
是什么。
也许给定的date
和meal
对只有一个content
?
TL; DR 您确实需要检查每个可能的列集,以查看它是否在功能上确定了每个列。即,对于每个数据库状态,列集的值的子列仅显示列的一个值。我们只能在没有清楚理解您的谓词和应用程序的情况下进行猜测。您可以通过以下方式减少工作:如果一组列是唯一的,则其超集将确定所有其他列。如果一组列最小唯一(是CK),则其较小的子集都不会确定所有其他列。您可以查找假定FD的反例,其中两行可以对推定的行列式具有相同的值子行,但对于推定的确定的属性具有不同的值。阿姆斯特朗的公理产生了给定的所有FD。
JDs 规范化为4NF和5NF涉及将表拆分为多个表以消除CK未暗示的JD。当JD保持对应于谓词的列集时,表的谓词可以表示为其他的AND。当每个JD中的每个合取在至少一个CK上与另一个合相重叠时,关系是5NF。 (费金的会员算法。)
PS 如果你关心约束,当你从一张桌子变成两张桌子时,你输了吗?
答案 1 :(得分:0)
payer
。