文档/ NoSQL数据库是否适合存储资产负债表?

Nei*_*ell 10 nosql cqrs ravendb event-sourcing

如果我要创建一个基本的个人会计系统(因为我就是这样 - 这是一个关于我熟悉的领域的业余爱好项目,以避免陷入需求的困境),像RavenDB这样的NoSQL /文档数据库是存储帐户的一个很好的候选人,更重要的是,针对这些帐户的交易?如何选择哪个实体是"文档"?

我怀疑这是其中一个案例实际上是一个SQL数据库合适的并试图去NoSQL是错误的,但是当我想到我对CQRS和事件采购知之甚少时,我想知道实体/文件是否是实际上是帐户,并且事务是针对它存储的事件,并且当这些"事件"发生时,我的应用程序也可能写出一个易于查询的读取存储,如SQL数据库.

提前谢谢了.

Aye*_*ien 5

你当然可以创建这样一个系统.在这种情况下,您拥有帐户聚合,并且您还拥有TimePeriod Aggregate.时间段通常是月,季度或年.在每个TimePeriod中,您有该期间的交易.这意味着加载当前状态的速度非常快,并且您可以使用完整的日志来进行后退.TimePeriod的原因在于,这通常是您实际考虑此类事物的边界.


Bre*_*red 5

我个人认为这是个好主意,但我有些偏颇,因为我的全职工作是建立一个基于CQRS,事件来源和文档数据库的会计系统。

原因如下:

事件源和计费基于相同的原理。您不删除任何内容,仅进行修改。如果添加的交易错误,则不要删除它。您创建一个抵消交易。与事件相同,您不会删除它们,而只是创建一个取消第一个事件的事件。这意味着您要发布很多TransactionAddedEvent。

接下来,如果您要进行两次输入会计处理,则记录交易与在屏幕上(尤其是在资产负债表中)查看交易的方式不同。因此,我再次喜欢cqrs。我们可以使用正确的会计原则存储数据,但是可以优化我们的读取模型以按照您希望的方式显示数据。

在资产负债表中,您要查看给定帐户的所有条目。您不希望看到交易,因为交易有两个方面。您只想查看影响该帐户的条目。

因此,在您的文档数据库中,您将具有一个entrys集合。

这使得查询非常容易。如果要查看某个帐户的所有条目,只需说SELECT * FROM Entries WHERE AccountId =1。我知道这是SQL,但每个人都知道此查询的简单性。就像在文档数据库中一样容易。另外,它会快如闪电。

然后,您可以创建一个带有按科目编号分组的查询的资产负债表,并设置日期限制。请注意,根本不需要连接,这使文档数据库成为一个不错的选择。


ste*_*egt 5

理论与架构

如果您深入研究会计理论和历史,您会发现“文档”应该是源文档——采购订单、发票、支票等。会计记录是那些通常人类可读的源文档的标准化摘要。会计交易是指两个或多个记录在两个或多个帐户中,绑定在一起,借方和贷方平衡。账户余额、资产负债表或损益表等报告只是这些交易的摘要。

把它想象成一个分层的架构——底层,基础,是源文件。如果来源是电子的,那么它会进入会计系统的文档存储层——这就是 nosql db 可能有用的地方。如果来源是一张纸,则对其进行成像和/或将其与索引号一起归档,然后将其存储在会计系统的文档层中。下一层是总结这些文件的数字记录;每份文件都由一个或多个不平衡的交易分支汇总。下一层是平衡交易;每笔交易都由两条或更多条不平衡的边组成。顶层是汇总这些平衡交易的财务报表。

源文件和外部应用程序

源文件是“唯一的真实来源”——而不是描述它们的记录。您应该始终能够从源文档重建整个数据库。在某种程度上,数据库首先只是源文档的索引。太多人忘记了这一点,并编写会计软件,其中交易本身被认为是事实的来源。这导致需要一个完整的“另一种存储和工作流系统来存储源文档本身,并且您最终会遇到典型的现代公司混乱”。

这一切都意味着写入会计系统的任何应用程序都应该只创建源文档,并将它们添加到底层。但在实践中,这一直被绕过,应用程序直接创建事务。这意味着源文档现在不在会计系统中,而是在创建交易的应用程序中;那是脆弱的。

事件、工作流和数字化

如果您正在使用某种事件模型,那么使用事件的正确位置是将源文档附加到它。然后该事件触发该文档被解析为正确的会计记录。如果源文档已经是数字的,那么可以通过编程方式进行解析,如果源是一张纸或未格式化的消息,则可以手动进行解析——这听起来像是工作流系统的开端,对吧?不过,您仍然希望将原始源文档保留在某处。文档 db 看起来确实是一个好主意,特别是如果它支持一种模式,您可以将源文档与其解析和平衡的结果记录联系起来,反之亦然。


cde*_*zaq 4

在这种情况下,关系数据库是最合适的,因为您有关系数据(例如行和列)

由于这只是一个个人系统,因此您不太可能出现任何规模或性能问题。

话虽如此,对于个人成长和学习使用像 RavenDB 这样的基于文档的数据库来说,这将是一次有趣的练习。传统上,金融一直是一件非常正式的事情,关系数据库通常被认为比文档数据库更加正式和严格。但是,正如您所说,该应用程序的域在您的控制之下,并且相当简单,因此复杂性和要求不会妨碍系统的设计。

如果这是我自己的个人宠物项目,并且我想了解更多有关新技术的信息,看看它是否适用于特定领域,我会选择我发现有趣的任何东西,如果它效果不佳,那么我学到了一些东西。但是,您的里程可能会有所不同。:)