【问题标题】:Normalization, correct referencing based on the question规范化,根据问题正确引用
【发布时间】:2020-10-03 06:43:00
【问题描述】:

我正在练习数据库规范化,但有时我对引用感到困惑。我想先澄清一点:

  1. 嵌套结构是导师给的,不知道对不对也不知道怎么标注。
  2. 我得到了SCAN模型,问题指定了SCAN里面的[PK],分别是storeIdproductId

这是问题陈述:

客户将他们的商品带到结账处并购买:我们将此记录为一次购买,包括不同产品的数量。我们必须记录在结账时扫描的每件商品,以及用于支付购买的方法。我们记录货物是在哪家商店购买的。我们不识别我们的客户。

SCAN (storeId, storeAddress, purchaseId, whenPurchased, paymentMethod, (productId, productName, quantityPurchased))

我可以看到 [PK] 及其与属性的关联,并得出如下:

Table1(storeId [PK], storeAddress)
Table2(purchaseId [PK], whenPurchased, paymentMethod, quantityPurchased)
Table3(productId [PK], productName)

但是,当我尝试引用外键时,我选择如下所示。原因是购买是围绕客户,即Table2。因此,当客户在商店购买产品时,我需要引用storeIdproductId 作为外键,如下所示:

Table1(storeId [PK], storeAddress)
Table2(purchaseId [PK], whenPurchased, paymentMethod, productId [FK], storeId [FK])
Table3(productId [PK], productName, quantityPurchased)

有时我对哪个表应该引用另一个表感到困惑。例如,有两个表:departmentempemp 应该引用departmentId 作为外键,因为每个员工至少隶属于一个部门,但相反是错误的。如何确定两个实体之间的关系并正确引用?

【问题讨论】:

  • 现在您只是要求我们使用定制教程重写您的教科书。请参阅How to Ask,点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。按照教科书的理由展示您的工作步骤,并在您遇到困难的第一个地方提出 1 个经过研究的特定非重复问题。引用您所依赖的定义、定理和算法。所有步骤也是常见问题解答。 PS 确定 FK 不是更高 NF 标准化的一部分。确定它们也在您的教科书和常见问题解答中。
  • 我希望你能关注我的评论并编辑这篇文章。 PS当你给SCAN时你嵌套括号。那不是标准符号。--但你没有解释它。也许您的意思是 SCAN 不是关系。--但是,您没有解释它是什么。也许您的意思是 SCAN 是与属性与组件的关系。无论如何,productId 不是 SCAN 属性,因此它不能成为 SCAN PK 的一部分。同样无论如何,您最初是标准化为 1NF。但是"1NF" has no single meaning。因此,您需要告诉我们您的定义,最好还告诉我们教科书名称和版本。
  • 不清楚你从什么开始,或者你想用它做什么,或者你第一次卡在哪里,或者你的第一个具体问题是什么。请确定输入是什么以及您要做什么并告诉我们。清楚地给出必要的东西。除非您说出它们的含义,否则不要发布嵌套括号。 (问你的教练。)除非你给出一个 NF,否则对更高 NF 的“规范化”并不意味着任何特定的东西。请对我所有的cmets采取行动。 PS“我可以简单地推导出下面的表格。”不是“按照教科书的理由展示你的工作步骤”。等等。
  • 为什么您的帖子除了最后一句之外还包含其他内容,您的教科书对此有何评论,包括谷歌搜索在内的其他研究提供了什么? (包括“site:stackoverflow.com”。)何时声明 FK 是一个常见问题。

标签: sql database database-design foreign-keys database-normalization


【解决方案1】:

我已经想出了这个问题的解释。规范化基于主键。因此,对于这个问题,形式应该是这样导出的:

Store(storeId [PK], storeAddress)
Customer(purchaseId [PK], whenPurchased, paymentMethod)
Product(productId [PK], productName, quantityPurchased)

假设有客户购买产品。每条购买记录都被记录为收据。因此,用于指定哪个商店的哪个产品。我们需要在收据中引用storeIdproductId。因此,标准化形式将是:

 Store(storeId [PK], storeAddress)
 Customer(purchaseId [PK], whenPurchased, paymentMethod, storeId [FK], productId [FK])
 Product(productId [PK], productName, quantityPurchased)

quantityPurchased 应使用Product 形式,因为每个产品都有其唯一的productId,但可以有相同的productName。例如,一部 iPhone 11 手机可以将iphone 11 128GB black 用作productName,但每个iphone 11 128GB black 将具有不同的productId。如果我想统计卖出了多少iphone 11 128GB black,我可以按productNamecount(productName) 分组,找到quantityPurchased

【讨论】:

  • 这并没有反映任何关于标准化的任何事情,无论是在 1NF 还是更高的 NF 上。我希望你能找到它,祝你好运。
  • 我的问题既不是关于规范化的任何反映,也不是关于规范化过程应该有多详细。很明显,问题在于规范化后的引用以及如何以更快的方式进行规范化。祝你有美好的一天。
猜你喜欢
  • 2011-11-04
  • 2018-01-02
  • 2012-07-30
  • 1970-01-01
  • 2011-07-26
  • 2010-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多