规范化生成一个没有明确目的的表

问题描述 投票:-1回答:1

Overview

我有一个关于数据库建模的任务,我必须为商店建模数据库。当从0NF标准化为3NF时,我最终得到一个表,其属性似乎并不相关。

注意

  1. 为简洁起见,我删除了与此问题无关的大多数属性。
  2. 虽然属性的名称是不言自明的,但我在0NF中的属性旁边提供了一个简短的描述。
  3. ID表示ID是主键的一部分
  4. 一个SupplierInvoice或CustomerInvoice中可能有多个产品。

0 NF

  • SupplierInvoiceID - 商店从商店购买产品后由供应商提供的发票的ID
  • SupplierName - 供应商的名称
  • CustomerInvoiceID - 从商店购买产品后提供给客户的发票的ID
  • 客户名称 - 客户的名称
  • ProductID - 与产品关联的ID
  • ProductDesc - 产品的简要说明
  • QtySold - 在一次交易中销售给客户的产品数量
  • QtyBought - 在一次交易中从供应商处购买的产品数量
  • CustomerID - 提供给客户的ID

Functional Dependency

  • SupplierInvoiceID - > SupplierID,SupplierName
  • CustomerInvoiceID - > CustomerID,CustomerName
  • SupplierID - > SupplierName
  • 客户ID - >客户名称
  • ProductID - > ProductDesc
  • SupplierInvoiceID,ProductID - > QtyBought
  • CustomerInvoiceID,ProductID - > QtySold

1 NF

  • 购买{SupplierInvoiceID,CustomerInvoiceID,ProductID,SupplierID,SupplierName,CustomerID,CustomerName,ProductDesc,QtyBought,QtySold}

2 NF

  • 购买{SupplierInvoiceID,CustomerInvoiceID,ProductID}
  • SupplierInvoice {SupplierInvoiceID,SupplierID,SupplierName}
  • CustomerInvoice {CustomerInvoiceID,CustomerID,CustomerName}
  • 产品{ProductID,ProductDesc}
  • ProductSupply {SupplierInvoiceID,ProductID,QtyBought}
  • ProductSale {CustomerInvoiceID,ProductID,QtySold}

3 NF

  • 购买{SupplierInvoiceID,CustomerInvoiceID,ProductID}
  • SupplierInvoice {SupplierInvoiceID,SupplierID}
  • 供应商{SupplierID,SupplierName}
  • CustomerInvoice {CustomerInvoiceID,CustomerID}
  • 客户{CustomerID,CustomerName}
  • 产品{ProductID,ProductDesc}
  • ProductSupply {SupplierInvoiceID,ProductID,QtyBought}
  • ProductSale {CustomerInvoiceID,ProductID,QtySold}

The Problem

根据我用作参考的书籍和资源,当从1NF移动到2NF时,创建一个表来维持1NF的主键之间的关系(这里,Shop表假定这个工作)。但是,从逻辑角度来看,CustomerInvoiceID和SupplierInvoiceID属性之间不应存在任何关系。

database relational-database database-normalization functional-dependencies 3nf
1个回答
2
投票

你的问题的措辞并没有明确地使用技术术语,因此不清楚你的期望是什么或为什么。但是,如果你只是从下面的基础知识推理,这似乎没有实际意义。

CustomerInvoiceID和SupplierInvoiceID属性之间不应该存在任何关系

在关系模型关系(船)中,s /关联由关系表示。来自Codd's original 1970 paper

描述的关系称为组件。 [...]组件(x,y,z)的含义是部分x是部分y的立即组件(或子组件),并且需要部分x的z个单元来组装部分y的一个单元。

您的1NF表Shop已经表示CustomerInvoiceID,SupplierInvoiceID等之间的关系。它包含从语句模板((特征)谓词)创建真实语句(命题)的行,例如:

    product ProductID is described as ProductDesc
AND supplier SupplierID is named SupplierName
AND invoice SupplierInvoiceID is from supplier SupplierID
AND invoice SupplierInvoiceID bills for QtyBought of product ProductID
AND customer CustomerID is named CustomerName
AND invoice CustomerInvoiceID is to customer CustomerID
AND invoice CustomerInvoiceID bills for QtySold of product ProductID

在您引用的短语中,您可能试图捕获某种形式的供应商发票ID和客户发票ID在某种意义上是独立的印象。从某种意义上说,他们是。但从另一个意义上说,它们不是:我们可以设想一个业务规则,即发票ID受到限制,以致客户发票涉及供应商发票涉及的产品。当然,在这种关系/表格中,ID是如此受限制。无论为解决这些想法可能产生什么样的精确定义和主张,对更高NF(正常形式)的归一化只是从给定的关系/表格中产生关系/表格。组件关系是原始关系的合并的某些转换。 (有时在逻辑上等同于合取本身。)不知道某个组件代表一种关系及其含义可能就是为什么2NF / 3NF Shop对你来说很奇怪。

当从1 NF移动到2 NF时,创建一个表以维持1个NF的主键之间的关系

归一化到更高的NF会将一个表替换为其自然联接回来的其他人的表。它涉及FD(功能依赖)和CK(候选键)。不是PK(主键)本身 - PK只是你决定称之为“PK”的CK。规范化“维持”原始关系,因为该关系可表示为组件关系的连接/ AND,并由其自然连接表示。

您的1NF设计无法记录未开具发票的产品,供应商或客户。您可能会发现这一事实,同时归一化为更高的NF - 但归一化到更高的NF并不能消除这些问题(更新和删除异常) - 尽管(差)演示文稿说它确实如此。此外,它仅记录出现在某个供应商发票和某些客户发票中的重新产品。这可能就是为什么你觉得这很奇怪。从所有这些属性上的单个表开始不是良好信息建模方法的一部分。 2NF / 3NF Shop是正确标准化的产物,但不是来自“好”原件。

它也不是来自“良好”的正常化。通常,对NF的分解不止一次。我们使用一些经过验证的优点和缺点的算法,我们可能仍然需要决定我们喜欢多个分解中的哪一个。我们没有通过较低的NF来规范化给定的NF - 尽管(差)演示说我们这样做。在这里,您选择了带有组件Shop的2NF设计 - 但是当您选择其他组件时,组件Shop变得多余 - 它是其他组件的自然连接的投影。这可能就是为什么你觉得这很奇怪。

Re the relational model, database design & normalization. Is there any rule of thumb to construct SQL query from a human-readable description?

PS "0NF" & "1NF" have no fixed meaning.

PS Re 2NF / 3NF商店

组件是原件的投影。它是行,其列形成原始的子行。因此,存在其他列的值的行,以便组件列值和其他列值在原始列中形成一行。这就像说组件的关系是应用于原始关系的其他列上的FOR SOME或THERE EXISTS一样。

假设并重复上述1NF Shop关系的表达式,2NF / 3NF Shop表示以下关系:

FOR SOME values for ProductDesc,
    SupplierID, SupplierName, QtyBought,
    CustomerID, CustomerName & QtySold
    [   product ProductID is described as ProductDesc
    AND supplier SupplierID is named SupplierName
    AND invoice SupplierInvoiceID is from supplier SupplierID
    AND invoice SupplierInvoiceID bills for QtyBought of product ProductID
    AND customer CustomerID is named CustomerName
    AND invoice CustomerInvoiceID is to customer CustomerID
    AND invoice CustomerInvoiceID bills for QtySold of product ProductID
    ]

即行:

    product ProductID is described as something
AND some supplier is named something
AND invoice SupplierInvoiceID is from that supplier
AND invoice SupplierInvoiceID bills for some quantity of product ProductID
AND some customer is named something
AND invoice CustomerInvoiceID is to that customer
AND invoice CustomerInvoiceID bills for some quantity of product ProductID

假设产品有描述,供应商和客户有名称并且发票对某个数量或数量的产品进行开票,这是以下行:

    invoice SupplierInvoiceID bills for product ProductID
AND invoice CustomerInvoiceID bills for product ProductID

这些是1NF Shop的3个属性上的投影返回的行。如果我们为1NF Shop谓词 - 3NF设计的表格 - 或2NF设计表格的每个合取作为基础/组件的表格,那么,您可以因此查询这些行,2NF / 3NF Shop作为基础/组件是多余的。

© www.soinside.com 2019 - 2024. All rights reserved.