我正在练习数据库规范化,但有时我对引用感到困惑。有一点我想先澄清一下:
- 嵌套结构是由讲师给出的,我不知道它是否正确或应该如何标注。
- 我得到了
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
。因此,当客户在商店购买产品时,我需要将storeId
和productId
作为外键引用,如下所示:
Table1(storeId [PK], storeAddress)
Table2(purchaseId [PK], whenPurchased, paymentMethod, productId [FK], storeId [FK])
Table3(productId [PK], productName, quantityPurchased)
有时我对哪个表应该引用另一个表感到困惑。例如,有两个表:department
和emp
。emp
应将departmentId
引用为外键,因为每个员工至少隶属于一个部门,但相反是错误的。如何正确确定两个实体和引用之间的关系?
我已经找到了这个问题的解释。规范化基于主键。因此,对于这个问题,形式应该是这样的:
Store(storeId [PK], storeAddress)
Customer(purchaseId [PK], whenPurchased, paymentMethod)
Product(productId [PK], productName, quantityPurchased)
假设有客户购买产品。每个购买记录都记录为收据。因此,用于指定哪个商店中的哪个产品。我们需要在收据中引用storeId
和productId
。因此,规范化形式将是:
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
。