2012-06-13 101 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