2012-10-14 21 views
1

我使用PHP和mySQL工作。實體屬性值模型 - 性能替代?

我有一個頁表和一個元表。它看起來有點像這樣。

頁表

page_id | headline | content 
-------------------------- 
1  | My headline | My content 
2  | Another one | Another text 

元表

id | page_id | meta_key | meta_value 
------------------------------------ 
1 | 2  | seo_title | Hello world 
2 | 2  | price  | 299 

我讀過,這種類型的模型被稱爲EAV。我還讀到它是bad for performance

我的元表是爲連接到頁面的任何類型的值創建的。這次我無法創建帶有「靜態」列的表格。

問題

  • 如何不好這是300頁每一頁上的30元價值?在元表中的行是9000 。
  • 有沒有更好的「動態」數據模型?

回答

2

第一個,有時這個模型使查詢數據更容易。我在幾天前問了一個問題here,一些用戶提出了爲什麼我沒有將我的模型更改爲1NF格式以便更輕鬆地查詢數據。只有當他們意識到我被這個設計所困住時,他們才提供了一些問題的答案。關鍵是我很幸運,只有12列可以總結,否則,如果我的表格包含300列,也許沒有用戶打擾他們自己寫這個問題的查詢。 :-)

第二個,由於數據庫自然施加的一些限制,有時這種設計的實現更容易。如果您的meta_key值包含一些長度超過30個字符的值,則必須縮短值並在某處執行映射,否則這可能是您可能擁有的唯一選項。

最後,表現很重要;確實如此。但另一方面,您可以應用某些技巧來提高績效;例如通過創建適當的索引,分區表等。

在這種情況下,表格尺寸非常小。因此,除非您的查詢非常複雜,比如計算繁瑣,連接和聚合複雜,並且如果應用程序對小時間分數不敏感,那麼我認爲如果採用此模型,您將不會遇到性能問題。

最後如果您仍然太在意性能,我會建議創建兩個模型,用一些隨機或真實數據填充它們,並分析計劃成本以查看哪種模型更適合您的需求。

1

規範化數據庫模式基本上針對一般情況進行了優化。相比之下,高度非規範化的模式對性能不利。

但是,這實際上意味着取決於你的使用情況。你正在運行什麼查詢?所以我建議如下:

  • 確保你有完整的持久層乾淨地與其他東西分開。

  • 確保它是覆蓋着自動化的測試,包括性能測試。

  • 實現您當前的解決方案,首先將創建最複雜的性能至關重要的查詢部分。在這一步中不要過多投資。也許你的項目預算低於5%。

  • 檢查性能是否足夠。

  • 如果校驗失敗,你有以下幾種選擇:

    1. 附加物化視圖

    2. 使用其他系統更適合這份工作。一個關鍵的價值商店可能是你正在尋找的。

    3. 或者,也許你需要一種混合的方法:EAV爲應用程序的一部分+使用其他一些方法更適合用於查詢數據的重複。

相關問題