混用范式化和反范式化
范式化和反范式化的schema 各有優劣怎麼選擇最佳的設計?
事實是完全的范式化和完全的反范式化schema 都是實驗室裡才有的東西在真實世界中很少會這麼極端地使用在實際應用中經常需要混用可能使用部分范式化的schema緩存表以及其他技巧
最常見的反范式化數據的方法是復制或者緩存在不同的表中存儲相同的特定列在MySQL 和更新版本中可以使用觸發器更新緩存值這使得實現這樣的方案變得更簡單
在我們的網站實例中可以在user 表和message 表中都存儲 account_type 字段而不用完全的反范式化這避免了完全反范式化的插入和刪除問題因為即使沒有消息的時候也絕不會丟失用戶的信息這樣也不會把 user_message 表搞得太大有利於高效地獲取數據
但是現在更新用戶的賬戶類型的操作代價就高了因為需要同時更新兩張表至於這會不會是一個問題需要考慮更新的頻率以及更新的時長並和執行SELECT 查詢的頻率進行比較
另一個從父表冗余一些數據到子表的理由是排序的需要例如在范式化的schema 裡通過作者的名字對消息做排序的代價將會非常高但是如果在 message 表中緩存author_name 字段並且建好索引則可以非常高效地完成排序
緩存衍生值也是有用的如果需要顯示每個用戶發了多少消息(像很多論壇做的)可以每次執行一個昂貴的子查詢來計算並顯示它也可以在 user 表中建一個 num_messages列每當用戶發新消息時更新這個值
返回目錄高性能MySQL
編輯推薦
ASPNET MVC 框架揭秘
Oracle索引技術
ASP NET開發培訓視頻教程
數據倉庫與數據挖掘培訓視頻教程
From:http://tw.wingwit.com/Article/program/MySQL/201311/29676.html