2014-04-01 62 views
5

我習慣於SQL和關係設計,所以我有點難倒我目前的項目。這是怎麼一回事呢:努力與nosql /解析數據模型設計

有東西叫做「泡沫」的操作基本相同,谷歌的圈子。它們是用戶定義的,可以將任何PFUser作爲「成員」使用。

然後有「職位」。每篇文章都有一個可見性設置,它是一組PFUsers(或氣泡)。

應用程序的工作原理是用戶使他/她的氣泡,然後可以瀏覽飼料/後氣泡。這個變得棘手的原因是這樣的:當應用程序啓動時,我想查詢特定用戶的帖子,我首先需要找到屬於他們的泡泡(很簡單),然後我需要讓這些泡泡中的用戶,那麼我需要查詢這些用戶的帖子,然後我需要確保我在這些帖子的可見性。我嘗試製作一個雲代碼函數,但由於異步調用混淆了for循環的索引,因此無法填充字典的帖子部分。

無論如何,我目前拉出我的頭髮試圖找出最好的NoSQL的方式做到這一點。任何幫助,解析器?

回答

9

那是一個很大的問題。我無法爲你創建一個模型,但我可以給你一些關於你如何思考的提示。

第一個,因爲您似乎已經發現,您需要停止思考關於此任務的關係設計術語。對於所有在SQL數據庫中受過教育的人(我們中的大多數人,仍然),這是一個漫長的過程。許多NoSQL方法在我們的關係思想中引起了不好的注意。

,你需要專注於數據提取。有了這個模型,你無疑在你的想法中形成了(甚至可能實現),快速提取所需數據所需的查詢變得非常複雜。而且,由於您的客戶可能大部分(僅限於?)移動設備,因此您需要將查詢次數和計算開銷降至最低。您需要設計可擴展性設計,如果您認爲您的應用可能會觸及圖表並變得非常流行(假設您沒有設計企業應用),那麼您需要設計可擴展性。不一定實施它完全如此,但至少設計它使您可以通過提高它建立在你最初的設計,而不是完全如果應用程序變得流行重建它(從而冒着總災難,如果你的努力是無法以跟上不斷增長的用戶羣)。

作爲一個典型的例子;如果您需要由用戶列表創建的帖子列表,則不要先獲取用戶,然後查詢這些用戶發佈的帖子。您準備好您的模式,以便將這個帖子列表(以及其他通常請求的結果列表)作爲您的模式的一部分準備好。這可能是一個表(解析類)的飼料。每個用戶有一條記錄,記錄包含預先準備好的數據源。每當我關注的用戶寫入新帖子時,都需要更新。所有其他用戶的記錄也會遵循帖子的作者!在那裏,我剛剛在你的關係心裏留下了一個不好的音符,對嗎? :-)

現在,爲了實現細節,我建議你看一看的NoSQL架構設計實例。我發現「Twissandra」(一個在Apache Cassandra中實現的Twitter克隆)是如何設計NoSQL的非常好的入門書。特別是因爲Twitter是一個我們可以輕易涉及的用例。儘管Parse是由MongoDB支持的,而不是Cassandra,但大部分原則可以繼承:http://www.rackspace.com/blog/cassandra-by-example/

另外,比較此演示文稿中的第6頁和第7頁,提供了一個很好的視覺,可以瞭解SQL和NoSQL之間這種模式設計的不同之處: https://speakerdeck.com/mongodb/mongodb-dc-2012-schema-design-by-example

我建議您在閱讀這些(也許是其他)文章後嘗試(重新)設計您的模式,然後在需要時詢問更多關於您的實施的具體問題。

+0

可以說我使用了bubbles類作爲「feed」並添加了一個指向Post對象的指針數組。隨着時間的推移會不會太臃腫?或者在nosql中可以接受嗎?那麼我應該代表Feed對象中的所有氣泡嗎? @Handsomeguy –

+0

那麼,「太臃腫」是相對的。但是,這當然取決於您的預期規模。如果您正在構建類似Twitter的規模,這種方法將不足。對於我給出的示例,不是每個用戶都有一個feed對象,您可以根據每個用戶每個月/每週/每天/每小時/每個用戶創建一個feed對象,具體取決於規模。因此,爲了顯示我的時間表,您可能必須獲取代表今天的1個Feed對象,並且當我滾動過去時,您需要爲昨天提取Feed對象等。建議一個解決方案。 – Moonwalkr

+0

好的。所以現在我有一個feed對象,它是我用戶類中的一個指針。然後,feed類有一個指向其中的氣泡的指針,每個氣泡都有一個帖子數組。這是錯誤的設計?我必須通過兩個級別獲取數據,這可能是錯誤的... @Handsomeguy –