2010-11-13 66 views
0

我正在使用Ruby on Rails,並且有一種情況是我想知道是否適合使用某種鍵值存儲而不是MySQL。我有用戶有has_many列表和每個列表has_many單詞。有些列表有數百個單詞,我希望用戶能夠複製列表。這是一個沉重的MySQL任務b/c它將一次創建這些數百個字對象。使用多個鍵值存儲

作爲一種替代方案,我正在考慮使用某種鍵值存儲,其中鍵只是單詞。單詞列表可以存儲在mysql的文本字段中。每個列表可能是一個新的鍵值db?似乎以這種方式複製鍵值db會更快,而不是必須通過數據庫。一般來說,這似乎也可能會更快。思考?

回答

1

使用關係數據庫來解決這個問題的一般方法是創建一個列表,一個單詞表和一個關聯這兩者的表單詞表。你是正確的,會有一些開銷,但不要高估它;由於表結構已定義,因此每條記錄的實際存儲開銷非常小,並且可以非常快地插入記錄。

如果您想要非常快的副本,您可以允許列表在寫入時複製。意味着單個列表可以由多個用戶引用,或者由同一個用戶多次引用。當用戶嘗試添加,刪除或更改條目時,您只能真正複製列表。當然,這是過早的優化,從簡單開始,只會增加像這樣的複雜情況,如果你發現它們是必要的。

您可以按照您的建議使用鍵值存儲。我會避免試圖在MySQL文本字段之上構建一個,因爲它有一個很好的理由,它會使按鍵搜索非常緩慢,因爲它需要字符串搜索。像CouchDB或東京內閣這樣的鍵值數據存儲可以很好地完成這項工作,但它很可能會佔用更多的空間(因爲每個記錄都必須定義自己的結構,並且每個單詞都必須在每個列表中單獨記錄)。性能的唯一維度我認爲會更好的是,如果您需要大規模的可擴展讀寫,但這隻與最大的系統有關。

我會天真地使用MySQL,只有在需要性能的情況下才能進行更改,並且可以證明此方法實際上會更快。

+0

非常感謝扎克。這是非常豐富的。我想知道,爲什麼最好使用列表單詞表?爲什麼不在每個單詞對象中放一個list_id,然後has_many:List中的單詞? – TenJack 2010-11-13 07:08:14

+0

第二個問題:我假設在字符串上使用正則表達式會比數據庫查詢更快。例如,我可以使用gsub通過用空字符串替換單詞來查找和刪除單詞。這不是一個有效的假設嗎? – TenJack 2010-11-13 07:10:14

+0

@TenJack - 對於你的第一個問題:我假設有一個單詞數量有限,就像在一個標籤系統中一樣。當然,由於一種語言中只有這麼多的單詞,單詞的數量是有限的。如果單詞數量少於列表條目和/或您對單詞進行索引或查詢感興趣,則使用列表單詞表。如果列表之間的通用詞很少,那麼多對一會很好。 – 2010-11-13 08:34:31