2012-01-25 13 views
1

當您需要關於構面結果的附加數據時,什麼會被認爲是最佳實踐。Solr/rdbms,存儲附加數據的位置

即。我需要一個友好名稱/圖像/元關鍵字/描述/和更多..爲產品類別。 (當在類別面上)

  • 將它包含在文檔中? (可導致重複的looots)
  • 介紹類別作爲solr的新索引(在solr的或假的通過文檔類型=類別字段)
  • 使用RDBMS使用SELECT查找附加數據,其中(..category面結果IDS ..)

感謝,

REMCO適合您的數據

+0

請量化「大量信息」。你處理了多少個實體?你的數據模型有多複雜? – aitchnyu

+0

這不是很複雜。這只是更多的數據,然後我想索引索引。即:我有一個產品目錄索引(具有多值category_id字段,但類別是系統中的第一類實體),所以我需要類別名稱/ URL /圖像/元數據等 –

回答

0

我想約2的替代品:

1)強烈的信息對每個文檔,而無需建立索引(以保證指數越小越好)。重點是,我不會存儲圖像洞察Lucene/Solr - 只有一個文件指針。如您所寫,

2.)將附加數據存儲在rdbms或nosql(linke mongoDB)上進行查找。

我的最愛是第二。其一,因爲數據庫是存儲數據的傳統和最優化的方式。 但最後它取決於您的系統,因爲您應該記住,您需要時間來連接數據庫,搜索數據並將附加信息發送迴應用程序。 因此,將所有內容存儲在lucene上可能會更快。

可能是一個小的性能測試是有用的。

+0

在類別頁面I我目前正在這樣做: 查詢當前類別及其使用SQL的孩子。 通過category_id查詢解決方案產品索引。 相交使用唯一的ID來構建一個視圖模型,包含類別和計數從facet。 –

+0

另一種選擇是將類別實體存儲在索引中。併發出2個solr查詢: - 一個從category索引中獲取category/subcateries。 - 用於從產品索引中獲取類別構面。 - 相交於唯一的ID。 –

+0

兩個(相交)的問題是您無法再計算分頁。 即。對於產品列表,我查詢solr的產品。然後與數據庫相交以查看是否有可用庫存。 在這種情況下你將如何處理分頁(因爲我不想一次從服務器獲取太多) –

2
  • 使用快速的NoSQL數據庫

順便說一句,Solr的基礎層Lucene實際上也是NoSQL類型的存儲設施。

如果我是你,我會使用MongoDB。這是第一個想到的數據庫,因爲你需要二進制數據,他們實際上發明了BSON,現在普遍意味着以類似JSON的方式傳輸二進制數據。

如果您的數據結構更像圖形(如社交網絡),請檢查Neo4j,它具有盲目快速的圖遍歷算法。

1

關係數據庫可以可靠地執行「類別是第一類實體」的東西。您需要參照完整性:產品可能不屬於不存在的類別。一個被刪除的類別不能有它的孩子分類。規範化的RDB可以通過模式強制實施參照完整性。 NoSQL數據庫必須與客戶端代碼一起工作(您必須編寫)以強制引用完整性。


讓我們看看如何「產品的類別必須存在」和「子類別父母必須存在」完成:

RDB:指派類別產品表(一個M:N的關係)必須通過ON DELETE CASCADE鍵入產品和類別。如果一個類別被刪除,那麼一個產品根本不可能有這樣的類別。作爲兒童鏈接到另一個類別的類別:relavent字段有ON DELETE CASCADE。這意味着如果父母被刪除,那麼孩子不能存在。這整個方法是聲明性的(「它是這樣聲明的」),所有複雜性都存在於數據中,我們不需要沒有臭味的代碼就可以做到這一點。您可以建模DB ,就像您瞭解其真實世界的含義一樣。

文檔存儲類型NoSQL:您需要編寫代碼來完成所有工作。 「類別被刪除」是使用案例,您需要查找具有該類別的產品並更新每個類別。你必須爲每個用例編寫代碼。管理子類別也一樣。數據模型可能非常愚蠢,但是他們的真實世界影響必須在代碼中建模爲。它的更難於在代碼和控制流程中推理,而不是在數據結構中。

真的有需要NoSQL數據庫的性能需求嗎?

因此,使用RDBMS來管理您的數據。然後使用直接導入處理程序或客戶端代碼來插入/更新非規範化實體以進行搜索。如果您的網站的大多數請求都可以在Solr查詢中表達,那麼太棒了!


至於在Solr中表達層次分面,參見'Ways to do hierarchial faceting in Solr?'。

0

也許我錯了,但是如果你在Solr主幹上,你可以從Solr join suport中受益,這將允許你在它們之間執行條件時爲它們之間的關係編制幾個實體。

+0

我見過這個。也期待它。但現在我們必須堅持穩定版本。 –