[英]Got orders and order_products tables.Should total price of order be stored in the orders table, or calculated based on the products quantity and price
[英]Should order_products table be denormalized?
order_products
表包含具有產品名稱和價格的產品數據。 它具有記錄列表,說明客戶購買了什么。
還有兩個字段product_name
和price
是products
表中的重復數據。
規范化order_products
表並為產品名稱和價格創建歷史記錄(審核)表是否值得? 然后,我不再需要order_products
表中的product_name
和price
嗎?
我假設您需要在訂購時存儲product name
和price
。 兩者都將隨着時間而改變。 如果出現這種情況有很多 ,你目前的做法可能不夠好。
我會考慮一種規范化的方法,尤其是在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_name
和price
至關重要,因為今天的產品價格可能與一個月前不同,但是您可能想知道產品的價格最多買的。
但是,如果該表中價格的存在是由於價格可能是products
主鍵的一部分,則這是一種不好的做法,應降低該鍵。
僅了解數據庫結構是不可能做出此判斷的。 這取決於您如何使用數據庫(即,插入,選擇,更新和刪除...以及頻率如何?)。
一方面,如果您的解決方案是基於只讀數據庫的報告解決方案,則應保留這些重復項! 但是,如果在另一方面,您的解決方案是僅記錄信息卻從不檢索的日志記錄解決方案,那么我將使用您建議的非規范化模型。
完全規范化的數據庫未針對性能進行優化。 您通常必須取消規范化數據庫設計。
通常,具有一定程度的冗余數據的模型是最快的模型。 當進行非規范化時,您只需密切注意更快的查詢和較慢的插入/更新之間的平衡!
檢查這些答案,也許您會找到進一步的幫助來做出決定! 何時對數據庫設計進行非規范化
是的,這是一個好主意,但是更好的主意是在order_products表中創建一個字段,並在序列化它們之后將所有訂單信息轉儲到那里。 使用這種方法,您不必創建2個新表(如果要對禮品券信息,運輸信息等進行相同的操作,則可以更多)
該方法的基本原理是將order_products置於訂單中,這意味着它們是“已發布的記錄”。 已發布的記錄更改不多,因此不應修改。 這些記錄應保留以備將來審核。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.