我一直在尝试查看是否可以使用基于文档的数据库(在本例中为CouchDB)满足某些要求。两个通用要求:
- 具有某些具有唯一索引的字段的实体的CRUD
- 像eBay这样的电子商务网络应用(此处有更好的说明)。
而且我开始认为基于文档的数据库并不是满足这些要求的最佳选择。此外,我无法想象基于文档的数据库的用途(也许我的想象力太有限了)。
当我尝试使用面向文档的数据库来满足这些要求时,是否可以向我解释我是否要求榆树梨?
Answers:
您需要考虑如何以面向文档的方式处理应用程序。如果仅尝试复制在RDBMS中建模问题的方式,那么您将失败。您可能还需要权衡取舍。([[编辑:不确定如何将其与参数联系起来,但是:]:请记住,CouchDB的设计假设您将拥有一个活跃的群集,其中包含许多随时可能发生故障的节点。您的应用程序将如何处理一个数据库节点从在它下面?)
考虑的一种方法是想象您没有任何计算机,只有纸质文档。您将如何使用随身携带的纸屑来创建高效的业务流程?如何避免瓶颈?如果出现问题怎么办?
您应该考虑的另一个角度是最终的一致性,最终您将进入一致状态,但是一段时间内可能会不一致。这是RDBMS领域的一种厌恶,但在现实世界中极为普遍。规范的交易示例是从银行帐户转移资金。在现实世界中,这是如何实际发生的-通过一次原子交易或通过不同的银行相互发行贷方通知书?写支票会怎样?
因此,让我们看一下您的示例:
如果我用CouchDB术语正确理解了这一点,那么您想要一个文档集合,其中某些命名值在所有这些文档中都保证是唯一的吗?这种情况通常不被支持,因为文档可能创建在不同的副本上。
因此,我们需要研究现实世界中的问题,看看是否可以对此建模。您真的需要它们独特吗?您的应用程序可以处理具有相同值的多个文档吗?您需要分配一个唯一的标识符吗?您可以确定地执行此操作吗?需要此操作的常见方案是需要唯一的顺序标识符。这在复制环境中很难解决。事实上,如果唯一ID是需要时间创造了它不可能是关于严格顺序的,如果你需要的ID,立竿见影。您需要至少放松这些约束之一。
我不确定要在此处添加什么,因为您对此帖子的最后评论是说“非常有用!谢谢”。此处概述的方法中是否仍然缺少某些仍导致您遇到问题的方法?我以为MrKurt的回答很完整,我添加了一些增强功能以减少争用。
是否需要规范化数据?
我在同一条船上,此刻我爱着沙发床,我认为整个功能风格很棒。但是,确切的说我们什么时候才开始在应用程序中使用它们。我的意思是,是的,我们所有人都可以非常迅速地开始开发应用程序,而不会因将标准格式遗留在路边而不使用模式而烦恼不已。但是,要表达一个短语“我们站在巨人的肩膀上”。有充分的理由使用RDBMS进行规范化和使用模式。我的老甲骨文负责人正在思考无格式的数据。
我对ouchdb的主要惊奇因素是复制工作和版本控制系统协同工作。
上个月,我一直在绞尽脑汁,试图弄清beddb的存储机制,显然它使用B树,但不存储基于常规格式的数据。这是否意味着它真的很聪明,并且意识到可以复制数据位,所以只需要为该B树条目创建一个指针?
到目前为止,我正在考虑将XML文档,配置文件,资源文件流式传输到base64字符串。
但是,我是否可以将ouchdb用于结构数据。我不知道,对此有什么帮助。
在存储RDF数据甚至自由格式文本时可能很有用。
一种可能是拥有一个主要的关系数据库,用于存储可以通过其ID检索的项目定义,以及一个用于描述这些项目的描述和/或规格的文档数据库。例如,您可能有一个带有Products表的关系数据库,其中Products表具有以下字段:
并且“规格”字段实际上将包含对具有产品技术规格的文档的引用。这样,您可以两全其美。
基于文档的数据库最适合存储文档。Lotus Notes是一个常见的实现,Notes电子邮件是一个示例。对于您正在描述的内容,例如电子商务,CRUD等,实际数据库是为存储和检索被索引的数据项/元素(而不是文档)而设计的。
关于CRUD:整个REST范例直接映射到CRUD(反之亦然)。因此,如果您知道可以使用资源(可通过URI识别)和一组基本操作(即CRUD)来对需求进行建模,那么您可能已经非常接近基于REST的系统,该系统有很多面向文档的系统可以提供的盒子。