Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 你会使用哪个数据库?MongoDB/Neo4j/SQL。。。都是吗?_Mysql_Scala_Mongodb_Neo4j - Fatal编程技术网

Mysql 你会使用哪个数据库?MongoDB/Neo4j/SQL。。。都是吗?

Mysql 你会使用哪个数据库?MongoDB/Neo4j/SQL。。。都是吗?,mysql,scala,mongodb,neo4j,Mysql,Scala,Mongodb,Neo4j,我想知道你会为我的用例做哪些选择。 它是关于构建一个社交网络应用程序,其中每个用户都有自己的个人文件系统 规范 用户都有自己的文件系统 元数据文件看起来像非结构化文档 文件内容被发送到AmazonS3 用户可以在此文件系统中创建目录和文件 用户可以与其他用户(如unix)共享一个目录 某些目录可以设置为公共(与所有用户共享) 用户可以搜索内容(他们自己的内容、公共内容和共享内容) 用户可以为目录或文件添加书签 性能和可伸缩性应该可以 目前,我们选择MongoDB是出于某些原因 文件的非

我想知道你会为我的用例做哪些选择。 它是关于构建一个社交网络应用程序,其中每个用户都有自己的个人文件系统


规范

  • 用户都有自己的文件系统
  • 元数据文件看起来像非结构化文档
  • 文件内容被发送到AmazonS3
  • 用户可以在此文件系统中创建目录和文件
  • 用户可以与其他用户(如unix)共享一个目录
  • 某些目录可以设置为公共(与所有用户共享)
  • 用户可以搜索内容(他们自己的内容、公共内容和共享内容)
  • 用户可以为目录或文件添加书签
  • 性能和可伸缩性应该可以

目前,我们选择MongoDB是出于某些原因

  • 文件的非结构化特性
  • 已经使用过它的人的建议
  • 我同意为这个项目贡献力量,以发现具有真实用例的新技术
  • 在ElasticSearch中索引JSON文档的能力,用于可伸缩文本搜索

MongoDB需要非规范化(也需要弹性搜索)

痛苦直接来自目录之间的关系部分:每个目录都使用parentId属性引用其父目录。这意味着当一个目录被书签和访问时,面包屑应该是可用的。没有面包屑的非规范化,这将导致昂贵的递归

当对内容进行搜索查询时,情况是一样的:我希望目录的面包屑直接在文档中可用(实际上,我使用相同的解析器从ElasticSearch和MongoDB获取我的对象,因为两者都使用JSON/BSON)

因此,在用户移动其中一个根目录之前,非规范化工作正常,根目录下有数千个子目录:子目录breadcrumbs应该更新->MongoDB在这里对一致性没有帮助,而且很难将非规范化的breadcrumb保持最新


图形数据库似乎适合构建文件系统结构,但可伸缩性呢?

我对Neo4J或Titan等图形数据库了解不多。。。但它是否有助于构建文件系统结构?据我所知,图形不适合分发,而将用户的目录分发似乎不适合面包屑计算

但是用户有自己的文件系统,这是一个单一/孤立的图。这意味着,也许我可以为每个用户创建一个图形数据库,并对其进行切分?但是共享目录的权限呢?我应该把它们存放在哪里

无论如何,在我的搜索引擎中,我仍然需要一个非规范化的文件元数据面包屑(至少如果我继续使用ElasticSearch的话)。 而且很难对所有共享目录权限进行非规范化,以便用户可以搜索另一用户内容的子集。 无论如何,似乎很难为图形编制索引以进行搜索:


MongoDB可能不是像用户一样存储结构化和近乎静态内容的好选择

另一件重要的事情是一致性。创建新用户时,我需要创建8个根目录。这些根目录不是用户文档的子文档。那么,我应该如何在用户创建期间创建这些目录呢?MongoDB没有事务,因此我如何确保9个插入是以原子方式完成的(用户+8个目录)。如果有一个用户创建了它一半的目录,这对我们来说是不好的。如果在用户文档上有一个异步作业和一个标志来检查目录是否已创建,那就不太好了

因此,一个传统的SQL数据库(免费)对于一致性来说似乎很好,可以存储与用户相关的数据。可伸缩性可以在应用程序级别使用分区来实现,就像Facebook或Tumblr一样。与用户相关的数据可以与同一个实例共定位,以便能够执行一些连接:例如,在用户的文件系统上。。。我知道SQL和多租户策略


所以最后,我完全迷失在这个NoSQL/SQL世界中。我只是想知道你是否能帮我选择这个用例

我不是想过度优化,只是想看看我们将来可能需要做些什么

有人知道有哪家公司在做类似的事情吗

我考虑的是使用混合解决方案,例如,我们将结构化数据存储在MySQL/PosgreSQL中,将文件元数据存储在MongoDB中,将目录存储在(?不知道),当用户连接时,我们可以使用嵌入式Neo4J数据库缓存其整个文件系统图(假设图的大小很大但可以接受)
这似乎是一个好主意吗?

Neo4j似乎非常适合您的用例-它支持ACID事务和批插入,并且您可以查询任何给定id的对象的路径,其开销比在RDB中少得多,而且无需规范化。您还可以通过查看用户节点和文件节点之间是否存在路径(通过组节点和目录节点)来执行分层访问控制。另外,没有完美的方法可以分割共享目录,但是无论使用什么数据库,都会遇到这种情况。AFAIK Dropbox使用一台(巨大的)数据库机器,即使他们看到大量用户,也不确定他们是否仍然使用。关键是在DB中只存储元数据,并将S2中的二进制块放置在S3中。查看Riak也可以很好地允许每个文件使用不同的内容类型和元数据等等。