Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我的表需要更多的规范化吗?_Mysql_Database_Relational Database_Normalization_Database Normalization - Fatal编程技术网

Mysql 我的表需要更多的规范化吗?

Mysql 我的表需要更多的规范化吗?,mysql,database,relational-database,normalization,database-normalization,Mysql,Database,Relational Database,Normalization,Database Normalization,我正在制作一个简单的公共现金簿DB表,用来计算我和朋友一起吃饭的费用。 我的第一个表只是一个表,它有一列“person”和非原子值,所以我将我的表分为两个表,如上所述 但我不确定这是否足够规范化。有没有应该规范化的函数依赖关系,但我不知道它的存在 (我将使用MySql,但您可以用任何类型的DBMS回答我。)嗯,让我们看看如何规范它: 在表1中,我们可以用表2的foreignkey引用替换付款人 删除表2中的DUP,使其成为主键(以后可以将其用于索引) 规范化需要了解函数依赖项(FD)和连接依赖项

我正在制作一个简单的公共现金簿DB表,用来计算我和朋友一起吃饭的费用。 我的第一个表只是一个表,它有一列“person”和非原子值,所以我将我的表分为两个表,如上所述

但我不确定这是否足够规范化。有没有应该规范化的函数依赖关系,但我不知道它的存在


(我将使用MySql,但您可以用任何类型的DBMS回答我。)

嗯,让我们看看如何规范它:

  • 在表1中,我们可以用表2的foreignkey引用替换
    付款人
  • 删除表2中的DUP,使其成为主键(以后可以将其用于索引)

  • 规范化需要了解函数依赖项(FD)和连接依赖项(FD)。你没有给他们

    您的应用程序如果我们确切知道每个表的“我想要表达的关系”(即谓词)是什么,我们只能告诉您FDs和JDs(即,我们可以查看一种情况,并知道每一行是否从谓词得出了一个真正的命题,因此属于表中)以及可能出现的具体情况(通过关于可能的应用程序情况的“业务规则”,相当于对可能的数据库状态的约束)

    你的“钥匙”你没有给FDs。您只提供了一个候选密钥(CK)和一个“唯一密钥”。但在不了解FDs的某些情况下,您无法确定部分或全部CKs。因此,当你给出CKs时,这就等于说存在或不存在确定的FD。当您给一些列集标记为PK或“unique key”时,您需要告诉我们您给了我们什么:“unique key”是CK(不包含较小的unique子集)还是superkey(unique)?你把所有的钱都给我了还是会有其他的?除了给定的超键集,还会有其他超键吗?如果您能准确地告诉我们您知道哪些FD有效(通过最小保险额),哪些FD无效,这将非常有帮助

    猜测
    我不知道计算的是什么。
    可能一对给定的
    日期
    膳食
    正好有一个
    内容

    TL;DR您确实需要检查每一组可能的列,看看它是否在功能上决定了其他列。即对于每个数据库状态,列集合的值的子行是否只显示一个列值。我们只能在不清楚谓词和应用程序的情况下进行猜测。您可以通过以下方式减少工作量:如果一组列是唯一的,则其超集确定所有其他列。如果一组列是最小唯一的(即CK),则其较小的子集都不能确定所有其他列。您可以寻找假定的FD的反例,其中两行对于假定的行列式可以具有相同的值的子行,但是对于假定的已确定属性可以具有不同的值。阿姆斯特朗的公理生成给定公理所隐含的所有FD

    JDs标准化为4NF和5NF涉及将表拆分为多个表,以消除CKs未暗示的JDs。当JD持有与谓词的列集对应的值时,表的谓词可以精确地表示为其他谓词的和。当每一个JD中的每一个结合点与至少一个CK上的另一个结合点重叠时,关系处于5NF。(费金的成员算法。)


    PS如果你关心约束条件,那么当你从一张桌子变成两张桌子时,你是否失去了一张?

    我认为付款人应该是一个外键。有没有可能一个人必须在同一天用同样的食物和内容进行交易?我认为我的解释是不够的。我想表达的关系是“约翰·多伊和简·多伊在2015-03-02年一起吃了午餐,约翰·多伊为此付出了代价”。因此,带有“交易”和“人”的桌子可能会有两面性。我正在考虑用“personal_id”和“name”创建一个新表,并使用“personal_id”作为外键。但是这是一个好主意吗?一个为名称提供ID的新表不会影响规范化。规范化从不涉及新列,只涉及新表中的旧列。请在问题中编辑每个表的整个应用程序关系语句(谓词)。还有任何关于限制和不熟悉概念的解释。这些变化都与规范化无关。normalization通过表的投影来替换表。(还有一条评论说付款人不一定是交易者,所以没有FK。)我读了你的答案好几遍,然后从头开始。我首先定义了每个实体之间的关系。在那之后,我根据这个画了ER图。最后,我可以根据图表制作表格。现在我想我得到了我想要的结果。:)