我真的很想理解NOSQL方法,但是某些方面使我感到困惑。而且最容易杰出的文档似乎并没有解决这些问题(到目前为止,我发现的(。
例如,我正在查看couchdb网站...
独立数据
一张发票包含有关卖方,买方,日期以及出售商品或服务列表的所有相关信息。[...]独立文档,这张纸上没有抽象的引用,它指向其他带有卖方名称和地址的纸。会计师会喜欢将所有东西都放在一边的简单性地方。并有了选择,程序员也很感激。
"一个抽象参考"我认为他们的意思是FK,对吗?在类似的SQL dB中,"其他一些纸"将是sellers
表中的一行?
好吧,但是当事实证明某人搞砸了,卖方的地址实际上在枫树大道上,而不是枫木车道,您有96,487张发票,例如枫树巷。
正统的NOSQL处理这种必然性是什么?
您是否扫描您的480万发票"文档"对于带有"车道"的96k
等等,在此描述的基于CouchDB的应用程序中,谁加入了?因为,在这里猜测,但我想您的前端可能没有卖方表格的视图。因为您的卖家都嵌入在发票中,对吗?因此,在NOSQL中,这种数据校正进行了&维护成为DBA的工作?
(另外,您实际上是否在涉及该卖方的每张发票上重复所有卖方的信息?这不昂贵吗?(
在一个巨大而繁忙的系统中,您如何确保所有重复的卖方数据都是正确且一致的?
我正在考虑要寻找一系列即将到来的项目的存储技术。NOSQL显然非常受欢迎,并且被广泛采用。在某些域中,这是"黄金路径"/默认选择。如果我想将postgresql与node.js一起使用,我将不得不索要有关较不受欢迎的库和支持的信息。
因此,对MongoDB,CouchDB等有很大的现实压力
然而,在我正在设计的系统中,我上面提到的问题真的很重要。是否有一种经过验证,建立和实用的方法来解决这些问题?
正统的NOSQL处理这种必然性是什么?
两种可能的方法:
-
本质上与pre-sql(即纸情况柜(相同:
- 更新客户的主文件。
- 使用所有新发票上的新地址。
历史发票将继续拥有错误的数据。但这没关系,甚至比RDBMS的方式更好,因为它准确地反映了历史。
-
转到更新所有受影响文档的额外工作。有了正确构建的索引或视图,这并不难(您不必扫描所有480万发票 - 您的视图将引导您到实际受到更改影响的18个发票(
我想您的前端可能没有卖方表格的视图。
为什么不呢?如果您进行基于卖方的查询,我当然希望您有一个基于卖方的视图(或几种(。
因为您的卖家都嵌入了发票中,对吧?
这是无关紧要的。视图可以索引数据的任何部分。
您实际上是否重复了卖方涉及该卖方的每张发票的所有信息?
当然。每次在纸上打印发票时,您都会重复它,对吗?您的数据库文档是"文档",与打印发票相同。
那不是很昂贵吗?
,如果您将整个数据库存储在手机上,也许。否则,硬盘驱动器如今便宜。
然而,在我正在设计的系统中,我上面提到的问题真的很重要。
nosql不适合每项工作。如果交易完整性很重要(并且可能是像您似乎正在讨论的财务应用程序一样(,那么它可能不是正确的工具。
将couchdb视为与数据库的同步协议。
如果您的核心功能是同步的能力,则CouchDB可能很合适。如果这不是您应用程序的功能核心,那么它可能是工作的错误工具。