2016-08-15 25 views
1

我目前在數據建模上苦苦掙扎。某些表格中有超過100萬條記錄,需要相當長的時間才能通過GROUP BYCOUNT查詢輸出。所以我轉移到Couchbase,因爲它支持查看和索引,我發現查詢數據更快。在關係數據建模和文檔數據建模之間掙扎

MySQL中有一個很大的優勢,我發現它非常有用。比如我在用戶表中有一個用戶和一些與這個用戶相關的文章,也有一些來自許多其他用戶的與本文相關的喜歡和評論。我通常做一個JOIN,所以輸出會給我帶有用戶名和個人資料圖片的文章。輸出還附有其他用戶的詳細信息,包括喜歡和評論。因此,如果用戶上傳新的個人資料圖片或更改了他的電子郵件地址,我只需要更新users表中的列。

在Couchbase中,我試圖創建文檔,因爲我將數據存儲在MySQL中,因此文章文檔的作者爲user_id,評論文檔有commenter_idarticle_id。現在我發現在啓用了限制和排序的情況下將它們加入視圖或索引非常困難。所以我複製了用戶的profile_imgfirst_namelast_name到所有相關文件。所以,當我加載文章文檔具有以下結構:

{ "article_id": 1234, "text": "A good article", "author_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg", "likes": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "profile_img": "1789ab00ef.jpg" } ] "comments": [ { "user_id": 1, "first_name": "John", "last_name": "Smith", "text": "This is my article", "profile_img": "0bf34ee0a.jpg" }, { "user_id": 2, "first_name": "Paul", "last_name": "Einstein", "text": "i like it", "profile_img": "1789ab00ef.jpg" } ] }

這無疑救了我的查詢時間。 (否則,我必須先查詢文章,從文章和喜歡和評論中提取用戶ID,並根據用戶ID查詢用戶附加用戶詳細信息到文章以及喜歡和評論)。但是這給我帶來了另一個問題,如果用戶更新他的個人資料圖片,我必須抓取所有文章才能找到他的user_id並更新profile_img字段。

任何人都有我應該走哪條路線的線索?

+0

我不明白這裏複雜的只是存儲的用戶ID,關鍵詞,全文檢索或'solr'整合。我看不到一個數百萬行的mysql解決方案是如何對索引進行調整並不是一個尖銳的快速解決方案。特別是如果你避免blob – Drew

+1

你不能只是採取SQL建模,並將其轉換爲任何NoSQL /文檔數據庫解決方案。 一個嚴肅的解決方案應該涉及到對數據的重新思考。 這主要是因爲這些平臺傾向於解決不同的問題。 –

回答

1

閱讀this blog post並看看這是否回答你的一些問題,如果不是讓我們繼續談。

對於上面的對象模型,將喜歡和評論嵌入到用戶文檔中從長遠來看可能是一個壞主意。雖然是的,但您可以使用sub-doc API讀取/寫入JSON的一部分,您通過複製等方式在後端付費,但隨着時間的推移,它還會涉及到文檔大小。更可能的是,將每個用戶的喜好和評論放入他們自己的文檔中會更好。即使那樣,你也不得不滿足活躍用戶文檔的增長情況。

另一件事。評論和喜歡應該與正在評論的內容或用戶評論和喜好相關嗎?可能值得每個評論都在自己的對象中使用標準化的關鍵模式來標識它,然後讓另一個對象是所有那些對該原始想法進行評論的對象ID的數組。同樣的喜歡。你做什麼取決於你將如何訪問數據,特別是你的應用程序的性能和擴展需求。我的意思是一個模式設計決定,你爲一個系統每秒只能執行500次操作的系統設計決定可能與每秒執行200,000次操作的系統設計決定非常不同。訪問NoSQL數據庫中的數據與RDBMS相比的主要區別在於,使用NoSQL對數據進行模型化非常容易,因爲您的應用程序和用戶將如何使用這些數據,而在RDBMS中,您必須多次對什麼是數據進行建模最適合數據庫引擎以及它如何存儲和使用數據。

另外,請閱讀this postthis one。請記住,高寫入率的後一篇文章是在Couchbase的N1QL之前編寫的,但它應該給你一些想法,無論如何。