2011-06-21 60 views
1

的交易是這樣的:替代索引一個MySQL視圖

我有一個是建在這樣一個MySQL數據庫: 有三個表,一個「對象」:

ID | Type  | Name  | Description 
-------------------------------------------- 
1 | Restaurant | Joe's Grill | A Great Place 

和比設計成類似於關於每個「對象」的元數據的表:

Object ID | Name ID | Description ID 
----------------------------------- 
1   | 2  | 4 

和另一表中的元數據的字符串:

ID | String 
--------------- 
1 | Hello 
2 | City 
3 | London 
4 | Paris 

所以在這種情況下,喬的燒烤餐廳(ID:1)具有連接到它 元數據(可以看到,由元數據表的對象ID列) 和Name ID和說明ID列對應到元數據字符串表的字符串。

的問題是,SELECT查詢將需要多個每次連接, 所以我想創建一個視圖,將自動執行此操作, 事情是我也想索引這個觀點,因爲該視圖將 也變得非常大。

的問題是:

  1. 我知道這是不可能創建一個視圖索引?有沒有其他辦法呢?

  2. 如果不是,下一個最佳選擇是什麼?也許有另一種方式,除了查看 來創建一個查詢表外? 可能會設置一個腳本來做到這一點?

  3. 如果這兩者都不可能,還有什麼我可以做的嗎?

謝謝大家提前,我真的被破解我的頭在這個 相當長的一段時間。

+0

視圖基本上只是一個存儲的查詢。涉及視圖的任何查詢都會涉及基礎表上的索引。除非視圖包含派生字段(例如「從...中選擇concat(a,b)」),否則索引視圖的字段不會有任何意義。 –

回答

0

聽起來像你想要的物化視圖。

  1. 你可以更新觸發器
  2. MV中,你可以在批量
  3. 更新視圖有一個叫flexviews
  4. 工具,或者您也可以更新您的代碼中的物化視圖。

另一種方法是隻生成大而優化的查詢。這可能是好的,這取決於你的要求...

+0

非常感謝,所有的選項都值得考慮:),只有選項2聽起來不像它會幫助我,因爲它仍然創建一個視圖,我不能索引視圖。 – fiftyeight

+0

我只是想在一個批次中創建物化視圖。只需擦拭一遍,每隔一段時間重新創建一次。您可以使用rename table命令以原子方式執行它。 –

2

該模型是一個實體屬性值模型或EAV。它允許一個無模式的模式。因此,很難看到視圖或表可以如何跟蹤它,因爲新屬性需要新列,數據模式的相對靜態性意味着需要重新創建視圖或表。

當某人拿一個新的名稱/值的對象1時,您必須添加一列到視圖或表中。

這種打破了EAV模型的動態性質。

我想你應該問自己,爲什麼要把這些元數據項放到EAV中,如果你希望它們更像傳統屬性(這是你使用視圖的方法所暗示的)。至於索引,如果你使你的ID主鍵和索引他們,你可能會很好。在SQL Server中,我可能會讓它們成爲PK和集羣。可能甚至沒有任何非聚集索引 - 取決於查詢。如果你是從右到左,即將所有標記爲城市的東西都作爲巴黎尋找,我可能會稍微區分一些索引,包括文本列上的非聚集索引和實體中的外鍵(雙向索引) 。這一切都取決於我將看到的使用模式。

+0

+1,因爲它比我寫作的答案要好得多:)。如果您不知道您可能附加到記錄的額外數據,那麼EAV非常棒。但是如果你知道這些專欄將會是什麼,那是毫無意義的。 – Cfreak

+0

@Cfreak對此有一些肯定有用的觀點,但通常不會有幫助。另一方面,我已經制作了相當強大的表值函數,這些函數在SQL Server中使用花哨的技巧做動態樞軸,但通常這些技術最好留給特殊用例的提示 - 我總是努力按照增加的順序使用數據庫功能複雜。 –

+0

嗨,首先很高興知道這個數據結構的名稱:)。無論如何,至於爲什麼我使用EAV的問題,答案是我正在創建的視圖僅僅是數據庫的一部分,還有很多其他部分依賴於此數據結構並且與其配合使用。我的主要目標是使用元數據字符串表的值(例如獲取所有位於巴黎的餐廳),現在引擎是MyISAM,如果我在元數據字符串表的字符串列上創建索引,它的工作原理是否相同好像在視圖的「城市」欄中有一個索引? – fiftyeight

0

我會質疑你的數據庫設計在這裏,有3個表的查詢不是那麼複雜或昂貴的運行。向我們展示您的查詢的一個示例,聽起來好像您正在嘗試做一些更好的設計可以滿足的要求