Database-Design

數據庫設計的實體關係

  • September 30, 2021

在此處輸入圖像描述

客戶可以選擇不提供評論或留下盡可能多的評論,但他們不能對同一產品有多個評論。我該如何建模?

在開始之前,讓我們解決目前數據模型的一些問題:

  1. 這不是關係數據模型。你沒有鑰匙。您已經定義了表之間的指針,僅此而已。
  2. 因為這不是一個關係模型,所以實現某些關於基數的約束更難建模,更不用說強制執行了。

這導致我們:

ID 本身不是鍵

每個人都喜歡在表格上添加自動遞增的整數並將它們稱為鍵。它們是行指針,僅此而已。密鑰保證數據的唯一性*,*並且Ids不是數據,它們是由系統生成的。

例如,在您目前的數據模型中,可以將完全相同的資訊插入Product表中,直到我用完整數。沒有鑰匙。

ID 可以是鍵,但只能作為另一個鍵的補充

您範例中的主鍵Product很可能類似於(ProductCategory, ProductName, Color). 這相當寬(以字節為單位),因此將該鍵降級為備用鍵並使ProductId1成為表的主鍵是合理的。

在這種情況下,我們說它ProductId是原始主鍵的代理項。

將客戶限制為每個產品 1 條評論

在您的問題的上下文中,主鍵Review(ProductId, CustomerId). 如果我們嘗試插入由相同Product作者撰寫的相同評論的兩條評論Customer,這將違反主鍵並且插入將失敗。

作為一個好處,我們可以放棄無用的Id列,這意味著我們不需要額外的索引來訪問Review給定的Product2

其他注意事項

  1. ProductCategory應該是它自己的表,並且Product應該對該表具有外鍵約束以強制一致性。
  2. 現在 anOrder只能完成一個Product. 通常這是在(primary key )Order之後實現的,這將允許 a以不同的價格出售(對銷售/折扣有用)。OrderLine``(OrderId, LineNbr)``Product
  3. 我知道這只是一個例子,但是為了所有神聖的事物的愛,不要將信用卡資訊儲存在Customer表中。ACustomer可以有多種付款方式,無論如何,將數據加密並放在訪問權限非常有限的表中會更安全。

1更好的密鑰應該是ProductCd反映製造商零件程式碼、條碼或某些內部指示符(業務內部,而不是數據庫)的密鑰。

2您仍然需要一個索引CustomerId,以便更快地訪問特定的評論Customer

引用自:https://dba.stackexchange.com/questions/300338