规范化,基于问题的正确引用



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

  1. 嵌套结构是由讲师给出的,我不知道它是否正确或应该如何标注。
  2. 我得到了SCAN模型,问题指定了SCAN内的[PK],这是storeId,以及productId

以下是问题陈述:

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

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引用为外键,因为每个员工至少隶属于一个部门,但相反是错误的。如何正确确定两个实体和引用之间的关系?

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

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,我可以按此productName分组,count(productName)找到quantityPurchased

最新更新