归一化,根据问题正确引用

Normalization, correct referencing based on the question

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

  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)

有时我对哪个 Table 应该引用另一个感到困惑。例如,有两个table: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,我可以按此 productNamecount(productName) 分组以找到 quantityPurchased.