标签: document-database

使用git repository作为数据库后端

我正在做一个处理结构化文档数据库的项目.我有一个类别树(约1000个类别,每个级别最多约50个类别),每个类别包含数千个(最多,比方说,~10000)结构化文档.每个文档都是几千字节的数据,采用某种结构化形式(我更喜欢YAML,但它也可能是JSON或XML).

该系统的用户可以进行多种操作:

  • 通过ID检索这些文档
  • 通过其中的一些结构化属性搜索文档
  • 编辑文件(即添加/删除/重命名/合并); 每个编辑操作都应记录为具有一些注释的事务
  • 查看特定文档的记录更改历史记录(包括查看更改文档的人员,时间和原因,获取早期版本 - 如果需要,可能还原为此版本)

当然,传统的解决方案是使用某种文档数据库(例如CouchDB或Mongo)来解决这个问题 - 然而,这个版本控制(历史)的东西诱惑我一个疯狂的想法 - 为什么我不应该使用git存储库作为一个这个应用程序的数据库后端?

乍一看,它可以像这样解决:

  • category = directory,document = file
  • 通过ID获取文档=>更改目录+读取工作副本中的文件
  • 使用编辑注释编辑文档=>通过各种用户进行提交+存储提交消息
  • history =>正常的git日志和旧事务的检索
  • search =>这是一个稍微棘手的部分,我想这需要定期将一个类别导出到关系数据库中,并对我们允许搜索的列进行索引

这个解决方案还有其他常见的陷阱吗?有没有人试图实现这样的后端(即任何流行的框架 - RoR,node.js,Django,CakePHP)?这个解决方案是否会对性能或可靠性产生任何影响 - 即它是否证明git比传统数据库解决方案慢得多,或者存在任何可扩展性/可靠性缺陷?我认为推送/拉取彼此存储库的这类服务器集群应该相当强大和可靠.

基本上,告诉我,如果这个解决方案将工作和为什么它会或不会做?

database git database-replication database-performance document-database

112
推荐指数
4
解决办法
2万
查看次数

使用Mongoose从MongoDB文档中删除密钥

我正在使用Mongoose Library通过node.js访问MongoDB

有没有办法从文档中删除密钥?即不只是将值设置为null,但删除它?

User.findOne({}, function(err, user){
  //correctly sets the key to null... but it's still present in the document
  user.key_to_delete = null;

  // doesn't seem to have any effect
  delete user.key_to_delete;

  user.save();
});
Run Code Online (Sandbox Code Playgroud)

mongoose mongodb node.js document-database

83
推荐指数
4
解决办法
7万
查看次数

基于文档的数据库与关系数据库的优缺点

我一直试图看看我是否可以用基于文档的数据库来完成一些要求,在本例中是CouchDB.两个通用要求:

  • 具有一些具有唯一索引的字段的实体的CRUD
  • 像eBay这样的电子商务网络应用程序(这里有更好的描述).

我开始认为基于文档的数据库不是满足这些要求的最佳选择.此外,我无法想象使用基于文档的数据库(也许我的想象力太有限).

当我尝试使用面向文档的数据库来满足这些要求时,你能解释一下我是否向榆树询问梨子吗?

database couchdb relational-database nosql document-database

69
推荐指数
5
解决办法
4万
查看次数

如何在MongoDB中组织多对多的关系

我有两张桌子/收藏品; 用户和组.用户可以是任意数量的组的成员,用户也可以是任意数量的组的所有者.在关系数据库中,我可能有第三个名为UserGroups的表,其中包含UserID列,GroupID列和IsOwner列.

我正在使用MongoDB,我确信在文档数据库中存在这种关系的不同方法.我应该将Users表中的groups和groups-as-owner列表作为两个ObjectID数组嵌入吗?我是否还应该将Groups表中的成员和所有者列表存储为两个数组,从而有效地镜像导致重复关系信息的关系?

或者,桥接UserGroups表是文档数据库中用于多对多关系的合法概念?

谢谢

many-to-many relational-database mongodb document-database

58
推荐指数
2
解决办法
2万
查看次数

选择MongoDb/CouchDb/RavenDb - 性能和可扩展性建议

对于某些读/写密集型应用程序,我们正在研究具有故障转移群集的文档数据库存储解决方案.

我们将每秒平均写入40K并发写入数据库(峰值可能达到70,000) - 并且可能有大约几乎相同数量的读取发生.

我们还需要一种机制让db通知新写入的记录(db级别的某种触发器).

在正确选择文档数据库和相关容量规划方面,什么是一个好的选择?

更新

关于期望的更多细节.

  • 平均而言,我们期望在3-4个数据库/文档集合中每秒插入40,000(40K)个插入数(新文档).
  • 峰值可能高达120,000(120K)插入
  • 插件应该可以立即读取 - 几乎是实时的
  • 除此之外,我们预计每秒大约有5000次更新或删除
  • 除此之外,我们还期望500-600个并发查询访问数据.这些查询和执行计划在某种程度上是已知的,尽管这可能需要更新,例如,在一周左右的时间内更新一次.
  • 系统应支持存储端的故障转移群集

couchdb mongodb nosql document-database ravendb

44
推荐指数
2
解决办法
2万
查看次数

在MongoDB中存储null与不存储密钥

在我看来,当你创建一个Mongo文档并且有一个{key, value}有时没有值的字段时,你有两个选择:

  1. {key, null}即在字段中写入空值
  2. 根本不要将密钥存储在该文档中

这两个选项都很容易查询,您可以在其中查询,{key : null}另一个查询{key : {$exists : false}}.

我真的不能想到在应用程序场景中会产生任何影响的两个选项之间的任何差异(除了选项2的存储略少).

任何人都可以告诉我,如果有任何理由,人们会更喜欢这两种方法中的任何一种,为什么呢?

编辑

在提出问题之后,我也发现在这两种情况下索引可能表现不同,即可以为选项2创建稀疏索引,但我仍然试图比较并理解两种方法中完整索引的考虑因素.

mongodb nosql document-database mongodb-query

43
推荐指数
3
解决办法
3万
查看次数

我错过了一些关于文档数据库的内容吗?

我一直在关注NoSql运动的兴起以及随之而来的mongodb,ravendb等文档数据库的普及.虽然我喜欢这些有很多相关的东西,但我觉得我并不理解一些重要的东西.

假设您正在实现商店应用程序,并且您希望存储在数据库产品中,所有这些产品都有一个唯一的类别.在关系数据库中,这可以通过具有两个表,产品和类别表来完成,并且产品表将具有一个字段(可能称为"category_id"),该字段将引用具有正确类别条目的类别表中的行.这有几个好处,包括不重复数据.

这也意味着,如果拼错了类别名称,例如,您可以更新类别表,然后将其修复,因为这是唯一存在值的地方.

但是,在文档数据库中,这不是它的工作原理.你完全非规范化,意味着在"产品"文档中,你实际上会有一个保存实际类别字符串的值,导致大量重复数据,并且错误更难以纠正.更多地考虑这个问题,是否也意味着运行诸如"给我这个类别的所有产品"之类的查询可能导致没有完整性的结果.

当然,解决这个问题的方法是在文档数据库中重新实现整个"category_id"事物,但是当我想到这一点时,我意识到我应该继续使用关系数据库而不是重新实现它们.

这让我相信我错过了关于文档数据库的一些关键点,这些关键点导致我走上了这条不正确的道路.所以我想把它放到堆栈溢出,我错过了什么?

nosql document-database

29
推荐指数
2
解决办法
2493
查看次数

文档数据库:冗余数据,引用等(MongoDB专门)

似乎我遇到了许多情况,其中构建我的数据的适当方法是将其拆分为两个文档.让我们说这是一个连锁商店,你节省了每个客户访问过的商店.商店和客户需要是独立的数据,因为它们与许多其他东西相互作用,但我们需要将它们联系起来.

因此,简单的答案是将用户的Id存储在商店文档中,或将商店的Id存储在用户的文档中.但很多时候,您希望访问1-2个其他数据用于显示目的,因为Id无用.可能是客户名称或商店名称.

  1. 您通常存储整个文档的副本吗?或者只是存储您需要的数据?可能取决于文档的大小与您需要的大小.
  2. 你如何处理你有重复数据的事实?当数据发生变化时,你会去搜索数据吗?加载后的某个时间间隔更新数据?只有在您能负担得起陈旧数据时才重复?

非常感谢您的意见和/或任何类型的"最佳实践"或至少有充分理由讨论这些主题的链接.

mongodb document-database

27
推荐指数
2
解决办法
5731
查看次数

将存储库模式与文档数据库一起使用是否有意义?

我目前正在试验MongoDB.我正在从NHibernate/SQL思维模式转向,所以最初我实现了一个用于数据访问的存储库模式.

在我开始使用嵌套文档之前,这一切都很好看.现在看起来似乎有点不匹配.但是,我对存储库感到满意,并且喜欢它们提供的抽象,关注点分离和可测试性.

人们是否成功使用存储库模式和文档数据库?如果没有,您使用什么数据访问方法?那么抽象/ SoC呢?

design-patterns data-access-layer nosql document-database

24
推荐指数
1
解决办法
4977
查看次数

嵌入式RavenDB"无法找到事务存储类型"错误

我能够根据以下代码成功运行RavenDB的简单测试:http://ravendb.net/tutorials/hello-world

接下来我尝试以嵌入式方式运行它,但我继续收到以下错误:

Message: Could not find transactional storage type: Raven.Storage.Esent.TransactionalStorage, Raven.Storage.Esent  
StackTrace:    at Raven.Database.Config.InMemoryRavenConfiguration.CreateTransactionalStorage(Action notifyAboutWork) in c:\Builds\raven\Raven.Database\Config\InMemoryRavenConfiguration.cs:line 272
   at Raven.Database.DocumentDatabase..ctor(InMemoryRavenConfiguration configuration) in c:\Builds\raven\Raven.Database\DocumentDatabase.cs:line 109
   at Raven.Client.Client.EmbeddableDocumentStore.InitializeInternal() in c:\Builds\raven\Raven.Client.Embedded\EmbeddableDocumentStore.cs:line 130
   at Raven.Client.Document.DocumentStore.Initialize() in c:\Builds\raven\Raven.Client.Lightweight\Document\DocumentStore.cs:line 388
   at Tests.RavenEmbedded.RavenDB..ctor() in C:\Users\Pranav\Documents\Projects\Repositories-Clone\Common-clone\Tests\RavenDB.cs:line 114
   at Tests.TestRavenDB.Basics() in C:\Users\Pranav\Documents\Projects\Repositories-Clone\Common-clone\Tests\RavenDB.cs:line 170 
Run Code Online (Sandbox Code Playgroud)

建立:

目标框架是.NET Framework 4

我在项目中添加了以下引用:

  1. \ RavenDB - 建造 - 309\EmbeddedClient\Raven.Client.Embedded.dll
  2. \ RavenDB - 建造 - 309 \客户端\ Raven.Client.Lightweight.dll
  3. \ RavenDB - 建造 - 309\EmbeddedClient\Raven.Storage.Esent.dll
  4. \ RavenDB - 建造 - 309\EmbeddedClient\Raven.Storage.Managed.dll

代码是:

namespace …

c# embedding nosql document-database ravendb

17
推荐指数
2
解决办法
3021
查看次数