我正在做一个处理结构化文档数据库的项目.我有一个类别树(约1000个类别,每个级别最多约50个类别),每个类别包含数千个(最多,比方说,~10000)结构化文档.每个文档都是几千字节的数据,采用某种结构化形式(我更喜欢YAML,但它也可能是JSON或XML).
该系统的用户可以进行多种操作:
当然,传统的解决方案是使用某种文档数据库(例如CouchDB或Mongo)来解决这个问题 - 然而,这个版本控制(历史)的东西诱惑我一个疯狂的想法 - 为什么我不应该使用git
存储库作为一个这个应用程序的数据库后端?
乍一看,它可以像这样解决:
这个解决方案还有其他常见的陷阱吗?有没有人试图实现这样的后端(即任何流行的框架 - RoR,node.js,Django,CakePHP)?这个解决方案是否会对性能或可靠性产生任何影响 - 即它是否证明git比传统数据库解决方案慢得多,或者存在任何可扩展性/可靠性缺陷?我认为推送/拉取彼此存储库的这类服务器集群应该相当强大和可靠.
基本上,告诉我,如果这个解决方案将工作和为什么它会或不会做?
database git database-replication database-performance document-database
我正在使用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) 我一直试图看看我是否可以用基于文档的数据库来完成一些要求,在本例中是CouchDB.两个通用要求:
我开始认为基于文档的数据库不是满足这些要求的最佳选择.此外,我无法想象使用基于文档的数据库(也许我的想象力太有限).
当我尝试使用面向文档的数据库来满足这些要求时,你能解释一下我是否向榆树询问梨子吗?
database couchdb relational-database nosql document-database
我有两张桌子/收藏品; 用户和组.用户可以是任意数量的组的成员,用户也可以是任意数量的组的所有者.在关系数据库中,我可能有第三个名为UserGroups的表,其中包含UserID列,GroupID列和IsOwner列.
我正在使用MongoDB,我确信在文档数据库中存在这种关系的不同方法.我应该将Users表中的groups和groups-as-owner列表作为两个ObjectID数组嵌入吗?我是否还应该将Groups表中的成员和所有者列表存储为两个数组,从而有效地镜像导致重复关系信息的关系?
或者,桥接UserGroups表是文档数据库中用于多对多关系的合法概念?
谢谢
对于某些读/写密集型应用程序,我们正在研究具有故障转移群集的文档数据库存储解决方案.
我们将每秒平均写入40K并发写入数据库(峰值可能达到70,000) - 并且可能有大约几乎相同数量的读取发生.
我们还需要一种机制让db通知新写入的记录(db级别的某种触发器).
在正确选择文档数据库和相关容量规划方面,什么是一个好的选择?
更新
关于期望的更多细节.
在我看来,当你创建一个Mongo文档并且有一个{key, value}
有时没有值的字段时,你有两个选择:
{key, null}
即在字段中写入空值这两个选项都很容易查询,您可以在其中查询,{key : null}
另一个查询{key : {$exists : false}}
.
我真的不能想到在应用程序场景中会产生任何影响的两个选项之间的任何差异(除了选项2的存储略少).
任何人都可以告诉我,如果有任何理由,人们会更喜欢这两种方法中的任何一种,为什么呢?
编辑
在提出问题之后,我也发现在这两种情况下索引可能表现不同,即可以为选项2创建稀疏索引,但我仍然试图比较并理解两种方法中完整索引的考虑因素.
我一直在关注NoSql运动的兴起以及随之而来的mongodb,ravendb等文档数据库的普及.虽然我喜欢这些有很多相关的东西,但我觉得我并不理解一些重要的东西.
假设您正在实现商店应用程序,并且您希望存储在数据库产品中,所有这些产品都有一个唯一的类别.在关系数据库中,这可以通过具有两个表,产品和类别表来完成,并且产品表将具有一个字段(可能称为"category_id"),该字段将引用具有正确类别条目的类别表中的行.这有几个好处,包括不重复数据.
这也意味着,如果拼错了类别名称,例如,您可以更新类别表,然后将其修复,因为这是唯一存在值的地方.
但是,在文档数据库中,这不是它的工作原理.你完全非规范化,意味着在"产品"文档中,你实际上会有一个保存实际类别字符串的值,导致大量重复数据,并且错误更难以纠正.更多地考虑这个问题,是否也意味着运行诸如"给我这个类别的所有产品"之类的查询可能导致没有完整性的结果.
当然,解决这个问题的方法是在文档数据库中重新实现整个"category_id"事物,但是当我想到这一点时,我意识到我应该继续使用关系数据库而不是重新实现它们.
这让我相信我错过了关于文档数据库的一些关键点,这些关键点导致我走上了这条不正确的道路.所以我想把它放到堆栈溢出,我错过了什么?
似乎我遇到了许多情况,其中构建我的数据的适当方法是将其拆分为两个文档.让我们说这是一个连锁商店,你节省了每个客户访问过的商店.商店和客户需要是独立的数据,因为它们与许多其他东西相互作用,但我们需要将它们联系起来.
因此,简单的答案是将用户的Id存储在商店文档中,或将商店的Id存储在用户的文档中.但很多时候,您希望访问1-2个其他数据用于显示目的,因为Id无用.可能是客户名称或商店名称.
非常感谢您的意见和/或任何类型的"最佳实践"或至少有充分理由讨论这些主题的链接.
我目前正在试验MongoDB.我正在从NHibernate/SQL思维模式转向,所以最初我实现了一个用于数据访问的存储库模式.
在我开始使用嵌套文档之前,这一切都很好看.现在看起来似乎有点不匹配.但是,我对存储库感到满意,并且喜欢它们提供的抽象,关注点分离和可测试性.
人们是否成功使用存储库模式和文档数据库?如果没有,您使用什么数据访问方法?那么抽象/ SoC呢?
我能够根据以下代码成功运行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
我在项目中添加了以下引用:
代码是:
namespace …