2010-05-12 126 views
2

我有一個Lexicon模型,我希望用戶能夠爲每個詞典創建動態特徵。動態搜索字段,最佳實踐?

而且我有一個複雜的搜索界面,讓用戶搜索每個單一特徵(包括動態特徵)都屬於Lexicon模型。

我本來可以使用序列化的文本字段來保存所有的動態信息,如果他們不是用於搜索。

如果我想讓用戶搜索所有字段,我創建了一個DynamicField模型來保存所有動態創建的特徵。

但假設我有1,000,000,000個詞典,並且如果爲每個詞典創建一個動態特徵,則這將導致在DynamicField模型中創建1,000,000,000行。

因此,SQL搜索功能會變得相當低效,而很多動態功能創建。

對這種情況有更好的解決方案嗎?

我應該採取哪種方式?

  1. 尋找一個更好的數據庫設計,動態字段

  2. 嘗試調整MySQL的(加緩存字段,添加索引...)與當前數據庫設計

+0

1.你的數據庫表(或Rails模型)現在看起來如何?也許代碼快照? 2.你想支持哪種查詢? (等於,在,不在,像,大於等) – 2010-05-12 09:11:56

+0

你可能想要的設計模式是:http://en.wikipedia.org/wiki/Entity-attribute-value_model – DJTripleThreat 2010-05-12 12:20:23

+0

普通的,類型我想實現的搜索類似於LIKE,不到,大於,大於,等於,不在 – boblu 2010-05-12 14:20:16

回答

2

另一個想法可能是使用MongoDBMongoMapperThinking SphinxSolr。這裏是關於如何使用Mongo的Railscast:http://railscasts.com/episodes/194-mongodb-and-mongomapper

+0

我現在在看mongodb。我會發布更新,如果我找到一個體面的解決方案。 感謝relpy – boblu 2010-05-12 14:20:52

+0

酷,我過去曾經使用過Solr,但是它很難安裝,尤其是在Linux機器上,所以我認爲MongoDB應該是非常友好的。 – DJTripleThreat 2010-05-12 20:33:09

1

我覺得最好的方法是使用名稱/值組合而不是動態字段。讓我解釋一下使用EAV design pattern

所以不是有這樣的事情:

Table: MedicalRecords 
<table> 
    <tr> 
    <th>Temperature in degrees Fahrenheit</th> 
    <th>Presence of Cough</th> 
    <th>Type of Cough</th> 
    <th>Heart Rate in beats per minute</th> 
    <th>Column X</th> 
    <th>Column X + 1</th> 
    <th>... Column N</th> 
    </tr> 
    <tr> 
    <td>102</td> 
    <td>True</td> 
    <td>With phlegm, yellowish, streaks of blood</td> 
    <td>98</td> 
    <td>????</td> 
    <td>????</td> 
    <td>????</td> 
    </tr> 
</table> 

你會設計你的表是這樣的:

Table: MedicalRecords 
<table> 
    <tr> 
    <th>Name</th> 
    <th>Value</th> 
    </tr> 
    <tr> 
    <td>Temperature in degrees Fahrenheit</td> 
    <td>102</td> 
    </tr> 
    <tr> 
    <td>Presence of Cough</td> 
    <td>True</td> 
    </tr> 
    <tr> 
    <td>Type of Cough</td> 
    <td>With phlegm, yellowish, streaks of blood</td> 
    </tr> 
    <tr> 
    <td>Heart Rate in beats per minute</td> 
    <td>98</td> 
    </tr> 
    <tr> 
    <td>Column X</td> 
    <td>????</td> 
    </tr> 
    <tr> 
    <td>Column X + 1</td> 
    <td>????</td> 
    </tr> 
    <tr> 
    <td>... Column N</td> 
    <td>????</td> 
    </tr> 
</table> 

(試圖讓表標籤的工作,但無法嘗試將我的代碼複製到html文件中以獲得創意。)

+0

謝謝您對EAV設計模式的解釋。 我剛剛讀了你給我關於這個主題的那個wiki頁,並且對它有一點點想法。 我想問的是如何在傳統數據庫(關係數據庫)中實現EAV設計模式? 或者我認爲mongodb本身已經在內部實現了EAV設計模式,我就在這裏嗎? – boblu 2010-05-13 02:35:58

+0

使用此示例作爲在關係數據庫中執行此操作的一種方式,但使用MongoDB將XML(動態數據定義的完美示例)發佈到MongoDB。如果MongoDB與Solr或Thinking Sphinx類似,您將能夠對其進行非常複雜的搜索。例如,如果您有產品數據庫,但產品具有不同的屬性(書籍有頁面,筆記本電腦有電池壽命等),則可以使用特殊的查詢語言返回所需的結果。這是軟管Solr的一個例子:http://lucene.apache.org/solr/tutorial.html – DJTripleThreat 2010-05-13 04:00:55