簡體   English   中英

應該對order_products表進行非規范化嗎?

[英]Should order_products table be denormalized?

order_products表包含具有產品名稱和價格的產品數據。 它具有記錄列表,說明客戶購買了什么。

還有兩個字段product_namepriceproducts表中的重復數據。

規范化order_products表並為產品名稱和價格創建歷史記錄(審核)表是否值得? 然后,我不再需要order_products表中的product_nameprice嗎?

我假設您需要在訂購時存儲product nameprice 兩者都將隨着時間而改變。 如果出現這種情況有很多 ,你目前的做法可能不夠好。

我會考慮一種規范化的方法,尤其是在order_products per (product name, price)有很多行的order_products 有一個附加表,用於在產品每次更改時存儲其揮發性狀態。 就像您已經暗示的那樣,可以稱為product_history 只需保存每個新狀態的日期(或時間戳記)即可。 具有到表product鍵鏈接,以保持參照完整性。 像這樣:

create table product_history
(product_id    integer  -- or timestamp
,valid_from    date
,product_name  varchar
,price         decimal
,PRIMARY KEY (product_id, valid_from)
,FOREIGN KEY (product_id) REFERENCES product(product_id)
               ON DELETE CASCADE
               ON UPDATE CASCADE)

快速查詢以查找適用的易失性屬性:

SELECT *
FROM   product_history
WHERE  product_id = $my_product_id
AND    valid_from <= $my_date
ORDER  BY valid_from DESC
LIMIT  1;

您肯定需要在(product_id,valid_from)上建立索引以加快此查詢的速度。 在我的示例中,主鍵可能會起作用。

那要看。 該表的目的是什么?

像這樣的一般表可用於市場趨勢的統計分析,因此具有product_nameprice至關重要,因為今天的產品價格可能與一個月前不同,但是您可能想知道產品的價格最多買的。

但是,如果該表中價格的存在是由於價格可能是products主鍵的一部分,則這是一種不好的做法,應降低該鍵。

僅了解數據庫結構是不可能做出此判斷的。 這取決於您如何使用數據庫(即,插入,選擇,更新和刪除...以及頻率如何?)。

一方面,如果您的解決方案是基於只讀數據庫的報告解決方案,則應保留這些重復項! 但是,如果在另一方面,您的解決方案是僅記錄信息卻從不檢索的日志記錄解決方案,那么我將使用您建議的非規范化模型。

完全規范化的數據庫未針對性能進行優化。 您通常必須取消規范化數據庫設計。

通常,具有一定程度的冗余數據的模型是最快的模型。 當進行非規范化時,您只需密切注意更快的查詢和較慢的插入/更新之間的平衡!

檢查這些答案,也許您會找到進一步的幫助來做出決定! 何時對數據庫設計進行非規范化

是的,這是一個好主意,但是更好的主意是在order_products表中創建一個字段,並在序列化它們之后將所有訂單信息轉儲到那里。 使用這種方法,您不必創建2個新表(如果要對禮品券信息,運輸信息等進行相同的操作,則可以更多)

該方法的基本原理是將order_products置於訂單中,這意味着它們是“已發布的記錄”。 已發布的記錄更改不多,因此不應修改。 這些記錄應保留以備將來審核。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM