归一化,根据问题正确引用
Normalization, correct referencing based on the question
我正在练习数据库规范化,但有时我对引用感到困惑。有件事我想先澄清一下:
- 嵌套结构是老师给的,不知道对不对,应该怎么写。
- 我得到的是
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)
有时我对哪个 Table 应该引用另一个感到困惑。例如,有两个table: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
.
我正在练习数据库规范化,但有时我对引用感到困惑。有件事我想先澄清一下:
- 嵌套结构是老师给的,不知道对不对,应该怎么写。
- 我得到的是
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)
有时我对哪个 Table 应该引用另一个感到困惑。例如,有两个table: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
.