我正在制作一个简单的公共现金簿db表来计算我和朋友一起吃饭的费用。
我的第一个表只有一个表,它有一个列“person”和非原子值,所以我把表分成了两个表,如上所述。
但我不确定这是否足够正常化。是否有任何函数依赖性应该归一化,但我不知道它的存在?
(我将使用mysql,但您可以用任何类型的dbms回答我。)

最佳答案

规范化需要知道功能依赖项(fds)和连接依赖项(fds)。你没有给他们。
你的应用程序我们只能告诉你fds和jds,如果我们确切地知道每一个表的“我想要表达的关系”(即谓词)是什么(即我们可以看到一种情况,并知道每一个可能的行是否从谓词中得到一个真正的命题,因此属于表中),以及确切地知道什么是可能的可能会出现这种情况(通过“业务规则”了解可能的应用程序情况,相当于对可能的数据库状态的约束)。
你的“钥匙”你没有给FDS。你只给了一个候选密钥(ck)和一个“唯一密钥”。但是如果你不知道关于FDS的某些事情,你就不能确定一些或所有的CK。所以当你给cks的时候,这和说有没有确定的fds是一样的。当你给一些列集合贴上pk或unique key标签时,你需要告诉我们你给了我们什么:unique key是ck(不包含更小的unique子集)还是superkey(unique)?你把所有的钱都给了还是还有其他的?除了给定的超集之外,还有其他的超键吗?如果你能准确地告诉我们你知道哪些FD持有(通过一个最小的掩护)哪些FD不持有,那将是非常有帮助的。
猜测
我不知道is_calculated是干什么用的。
也许一对给定的datemeal正好有一个content
dr您真的需要检查每个可能的列集合,看看它是否在功能上决定了其他列。即对于每个数据库状态,列集合的值的子行是否只显示列的一个值。我们只能在不清楚谓词和应用程序的情况下猜测。您可以通过以下方法减少工作量:如果一组列是唯一的,则其超集将确定所有其他列。如果一组列是最小唯一的(是一个ck),那么它的任何较小的子集都不能确定所有其他列。您可以寻找假定的fds的反例,其中两行对于假定的行列式可以具有相同的值子行,但是对于假定的确定属性具有不同的值。阿姆斯壮公理产生了所有给定的FD隐含的。
jds规范化为4nf和5nf涉及将表拆分为多个表,以消除cks未暗示的jds。当jd持有与谓词的列集相对应的列集时,表的谓词可以精确地表示为and of others。当每个jd中的每个连接点在至少ck上重叠另一个连接点时,关系是5nf。(费金的成员算法。)
如果你关心约束,当你从一张桌子变成两张桌子的时候,你是不是丢了一张?

关于mysql - 我的表需要更多规范化吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28791747/

10-10 13:30