Database-Design
數據庫設計的實體關係
客戶可以選擇不提供評論或留下盡可能多的評論,但他們不能對同一產品有多個評論。我該如何建模?
在開始之前,讓我們解決目前數據模型的一些問題:
- 這不是關係數據模型。你沒有鑰匙。您已經定義了表之間的指針,僅此而已。
- 因為這不是一個關係模型,所以實現某些關於基數的約束更難建模,更不用說強制執行了。
這導致我們:
ID 本身不是鍵
每個人都喜歡在表格上添加自動遞增的整數並將它們稱為鍵。它們是行指針,僅此而已。密鑰保證數據的唯一性*,*並且
Ids
不是數據,它們是由系統生成的。例如,在您目前的數據模型中,可以將完全相同的資訊插入
Product
表中,直到我用完整數。沒有鑰匙。ID 可以是鍵,但只能作為另一個鍵的補充
您範例中的主鍵
Product
很可能類似於(ProductCategory, ProductName, Color)
. 這相當寬(以字節為單位),因此將該鍵降級為備用鍵並使ProductId
1成為表的主鍵是合理的。在這種情況下,我們說它
ProductId
是原始主鍵的代理項。將客戶限制為每個產品 1 條評論
在您的問題的上下文中,主鍵
Review
是(ProductId, CustomerId)
. 如果我們嘗試插入由相同Product
作者撰寫的相同評論的兩條評論Customer
,這將違反主鍵並且插入將失敗。作為一個好處,我們可以放棄無用的
Id
列,這意味著我們不需要額外的索引來訪問Review
給定的Product
2其他注意事項
ProductCategory
應該是它自己的表,並且Product
應該對該表具有外鍵約束以強制一致性。- 現在 an
Order
只能完成一個Product
. 通常這是在(primary key )Order
之後實現的,這將允許 a以不同的價格出售(對銷售/折扣有用)。OrderLine``(OrderId, LineNbr)``Product
- 我知道這只是一個例子,但是為了所有神聖的事物的愛,不要將信用卡資訊儲存在
Customer
表中。ACustomer
可以有多種付款方式,無論如何,將數據加密並放在訪問權限非常有限的表中會更安全。1更好的密鑰應該是
ProductCd
反映製造商零件程式碼、條碼或某些內部指示符(業務內部,而不是數據庫)的密鑰。2您仍然需要一個索引
CustomerId
,以便更快地訪問特定的評論Customer
。