2012-06-13 141 views
1

我必須選擇一個實現共享系統的數據庫。與用戶共享文檔

我的系統將有用戶和文檔。我必須與少數用戶共享文檔。


示例: 有2個用戶,並且有一個文檔。

所以,如果我不得不同時與用戶共享一個文件,我可以做這些可能的解決方案:

我使用的電流的方法是使用MySQL(我不想用這個):

Relational Databases (MySQL) 
    Users Table = user1, user2 
    Docs Table = doc1 
    Docs-User Relation Table = doc1, user1 
           doc1, user2 

而且我想用這樣的:

NoSQL Document Stores (MongoDB) 
    Users Documents: 
     { 
      _id: user1, 
      docs_i_have_access_to: {doc1} 
     } 
     { 
      _id: user2, 
      docs_i_have_access_to: {doc1} 
     } 
    Document's Document: 
     { 
      _id: doc1 
      members_of_this_doc: {user1, user2} 
     } 

我還不知道如何在像Redis這樣的鍵值存儲中實現。

所以我只是想知道,上面給出的MongoDB方式,最好的解決方案? 有沒有其他的方法可以實現呢?也許用另一個數據庫解決方案 我應該試着用Redis來實現它嗎?

我應該選擇哪種數據庫和哪種方法,並且最好共享數據,爲什麼?

注意:我想要一些高度可擴展且持久的東西。 :D

謝謝。 :D

回答

1

實際上,您需要表示一個多對多的關係。一個用戶可以有幾個文件。一個文檔可以在多個用戶之間共享。

見我以前回答這個問題:how to have relations many to many in redis

隨着Redis的,表示與一組數據類型關係是一個很常見的模式。對於這種數據模型,您可以期望獲得比使用MongoDB更好的性能。作爲獎勵,您可以輕鬆而高效地找到哪些用戶具有共同的文檔列表,或哪些文檔是由給定用戶共享的。

+0

我讀了你的答案。 :D ...但是不存在錯誤的機會,在類別集合中放置了某些東西,並且在用戶設置中失敗了?因爲它們是兩種不同的操作。我知道這對於MongoDB也是如此,但是不存在可行的解決方案嗎? –

+0

使用Redis,您可以使用MULTI/EXEC原子塊對集合操作進行分組,以便獲得全有或全無語義。請參閱http://redis.io/topics/transactions –

1

考慮到只有這個簡單的例子(你只需要保持誰擁有什麼)SQL似乎是最合適的,因爲它會提供額外的免費選項,例如報告誰擁有多少文檔,最受歡迎文件,最活躍的用戶等幾乎零成本+數據將更加一致(沒有重複,可能是外鍵)。除非你有幾百萬份文件,否則這是有效的。

如果我選擇了面向文檔的關係數據庫,我會主要根據文檔本身的結構作出決定。無論它們是統一的還是不同的字段都可以有不同的類型,您是否嵌套了子文檔或數組,以便能夠根據其內容進行搜索。

+0

我肯定會在不同的文檔裏面有數百萬的文檔和不同的數據。所以我認爲SQL會變得緩慢,而且難以擴展。如果我想使用NoSQL,我該怎麼辦? 感謝您的回答。 :D –

+0

我有一些MongoDB和大量數據的經驗。你的選秀似乎沒有問題。只有一條評論...有兩個方向的鏈接並不是必要的。您可以在members_of_this_doc上創建索引,並且您將能夠查詢搜索所有文檔,該文檔在該數組中具有特定用戶。但是,如果基於Document._id鍵進行分片,那麼這將是有意義的 - 那麼用戶中的鏈接將通過僅擊中相關的分片節省時間。 – disjunction