Database design 如何理解第五范式?

Database design 如何理解第五范式?,database-design,relational-database,database-normalization,Database Design,Relational Database,Database Normalization,我使用两个在线资源来了解5NF,没有任何严格的数学和证明 (由肯特撰写。这篇文章似乎是由CJ Date本人在他的一篇文章中审阅和认可的) (维基百科文章) 然而,我无法理解这些参考资料中的任何一个 让我们首先检查参考文献1(肯特的)。 它说:“但假设某个规则生效:如果一个代理商销售某个产品,他代表生产该产品的公司,那么他就为该公司销售该产品。” 然后,继续分解原始表(所有表名都是我给出的) 。。。分为3个表: ac(agent, company) cp(company, product) ap(

我使用两个在线资源来了解5NF,没有任何严格的数学和证明

  • (由肯特撰写。这篇文章似乎是由CJ Date本人在他的一篇文章中审阅和认可的)
  • (维基百科文章)
  • 然而,我无法理解这些参考资料中的任何一个

    让我们首先检查参考文献1(肯特的)。 它说:“但假设某个规则生效:如果一个代理商销售某个产品,他代表生产该产品的公司,那么他就为该公司销售该产品。”

    然后,继续分解原始表(所有表名都是我给出的)

    。。。分为3个表:

    ac(agent, company)
    cp(company, product)
    ap(agent, product)
    
    -------------------   ---------------------   ------------------- 
    | AGENT | COMPANY |   | COMPANY | PRODUCT |   | AGENT | PRODUCT |
    |-------+---------|   |---------+---------|   |-------+---------|
    | Smith | Ford    |   | Ford    | car     |   | Smith | car     |
    | Smith | GM      |   | Ford    | truck   |   | Smith | truck   |
    | Jones | Ford    |   | GM      | car     |   | Jones | car     |
    -------------------   | GM      | truck   |   -------------------
                          ---------------------
    
    但我甚至不确定我是否理解上述规则的英语含义。我对上述规则的理解是,其“then”条款是完全多余的!因为

    如果代理商正在销售产品

    如果该代理代表生产该产品的公司

    那么,显然,这家代理商正在为那家公司销售该产品

    那么,这句话中的“规则”在哪里?事实上,对我来说,这似乎是一个非陈述

    从ac、cp和ap这三个表中倒转过来看,规则似乎真的是:“一家公司可以生产一个或多个产品,一个代理商可以代表一个或多个公司,当他代表一家公司时,他可以或不可以销售其所有产品。”

    但是原始表acp已经捕获了这条规则。所以,我不确定5NF的解释到底是怎么回事

    现在让我们看看参考文献2(维基百科)。 它说:然而,假设以下规则适用:“一个旅行推销员在他的剧目中有特定的品牌和特定的产品类型。如果品牌B1和品牌B2在他的剧目中,而产品类型p在他的剧目中,那么(假设品牌B1和品牌B2都构成产品类型p),旅行推销员必须提供产品类型为P的产品,即B1品牌和B2品牌的产品。”

    再一次,仅根据这条规则的英语含义,而不是其他含义

    如果一个销售员有品牌B1和B2,以及产品p

    如果产品p同时由B1和B2品牌生产

    那么,他究竟为什么不能提供B1和B2品牌的产品p,就像他在原来的三栏表格“sbp(销售员、品牌、产品)”中所能提供的那样,而在这项新的“规则”生效之前,该表格就已经运行良好了


    有人能澄清一下吗?

    所有正常形式都是为了避免异常,即数据中的逻辑不一致

    当您违反第五范式时,可能存在异常,由以下关系表示:

    -----------------------------
    | AGENT | COMPANY | PRODUCT |
    |-------+---------+---------|
    | Smith | Ford    | car     | 
    | Smith | Ford    | truck   | 
    | Smith | GM      | car     | 
    | Jones | Ford    | car     | 
    | Jones | GM      | truck   | 
    -----------------------------
    
    所以我们知道琼斯为通用和福特工作,我们知道琼斯销售汽车和卡车。我们(从史密斯那里)知道通用汽车制造汽车。那么,为什么不为琼斯、通用汽车、汽车公司排上一行呢?这是一种反常现象。琼斯应该出售通用汽车,但这张表中没有任何东西能使这一点保持一致

    问题来自于试图使用一个关系来表示多个独立事实。
    如果我们将这些独立事实表示为独立关系
    ac
    cp
    ap
    ,则我们消除了异常的可能性


    请回复您的评论:

    在本例中,我们假设销售人员有动机销售他能销售的任何东西。如果他能销售一种类型的汽车,并且他为一家公司工作,而该公司生产这种类型的汽车,那么销售人员肯定会销售它

    威廉·肯特的文章中阐述了这一前提:

    但假设某个规则生效:如果一个代理人销售某个产品,他代表一家生产该产品的公司,那么他就为该公司销售该产品

    因此,基于这个前提,每一个可能的有效组合都应该在三列表中产生一行。这是我们希望数据满足的业务规则

    但是,如果我们的单个表不包含与该前提一致所必需的行之一,那么它就无法表示业务规则。基本上,因为它引入了冗余存储“事实”的可能性


    通过将事实分为三个表,每个事实只存储一次。三个较简单的表之间的联接结果自然会产生一个类似于原始三列表的关系,只是保证没有异常。

    请看,向后理解要容易得多

    首先是5NF;表(关系变量)在5NF中,如果分解它不会删除任何冗余。因此,就消除冗余而言,这是最终的NF

    原始表显然有一些冗余。它声称“史密斯代表福特”两次,“史密斯代表通用”两次

    让我们看看是否有可能将其分解为两个或多个投影,并减少一些冗余

    让我们从后面开始

    • 公司存在<代码>{COMPANY}

    • 代理存在<代码>{AGENT}

    • 产品存在<代码>{PRODUCT}

    • 这家公司生产这种产品<代码>{公司,产品}

    • 代理人代表公司<代码>{AGENT,COMPANY}

    在此暂停;假设一条规则是“如果一个代理人代表一家公司,而该公司生产一种产品,那么代理人就销售该产品”

    这将是简单的
    {AGENT,COMPANY}加入{COMPANY,PRODUCT}
    ;但这将生成一个额外的元组,即
    (琼斯、福特、卡车)
    ;这是不正确的,因为琼斯不卖卡车

    因此,并非每个代理商都销售每一种产品
    -----------------------------
    | AGENT | COMPANY | PRODUCT |
    |-------+---------+---------|
    | Smith | Ford    | car     | 
    | Smith | Ford    | truck   | 
    | Smith | GM      | car     | 
    | Jones | Ford    | car     | 
    | Jones | GM      | truck   | 
    -----------------------------
    
    (Smith, Honda) (Honda, truck) (Smith, truck)
                   (Honda, car)   (Smith, car)