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

4ngedf3f  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(339)

我正在练习数据库规范化,但有时会对引用感到困惑。我想先澄清一下:
嵌套结构是由讲师给出的,我不知道它是否正确,也不知道应该如何表示。
我拿到钱了 SCAN 模型,问题指定了 SCAN ,它们是 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 作为外键是因为每个员工至少隶属于一个部门,反之则是错误的。如何正确确定两个实体和引用之间的关系?

hvvq6cgz

hvvq6cgz1#

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

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 . 例如,一部iphone11手机可能 iphone 11 128GB black 作为一个 productName ,但每个 iphone 11 128GB black 会有不同的 productId . 如果我想数数 iphone 11 128GB black 都卖了,我可以按这个分组 productName 以及 count(productName) 找到 quantityPurchased .

相关问题