假设有一家银行、一家大型商店等,希望正确地为内部帐户和跟踪客户帐户进行会计处理。而不是实现满足当前简单而狭隘的要求,这将是“家酿”:结果证明这些只是当前简单要求的临时拐杖,并且在出现新要求时很难或不可能扩展。
据我了解,复式记账法是一种行之有效的方法,可满足所有会计和审计要求,包括目前未考虑的要求。如果实施,它将:
我研究了另一个问题的答案:简单银行账户的衍生账户余额与存储账户余额?,它为内部帐户提供了很好的信息。需要一个数据模型,以便理解实体;他们的互动;他们的关系,@PerformanceDBA 已经给出了这一点。该模型取自该答案:

虽然这对于简单的内部账户来说是令人满意的,但我需要看到一个提供完整复式记账方法的数据模型。
需要添加的文章是Journal; 内部 vs 外部Transactions;等等..
理想情况下,我想看看这些双条目行在数据库方面的样子,整个过程在 SQL 中的样子,在每种情况下哪些实体受到影响等等。案例如下:
让我们称之为System而不是Bank,Bank可能太复杂而无法建模,让问题是关于使用帐户和资产操作的假想系统。客户与系统(存款、取款、后期费用、批量费用)以及彼此之间(转账)执行一组操作。
假设有一个复式记账系统:
我更喜欢后一种具有归一化的模型Transaction。
有许多状态长期运行的复杂操作。一笔大交易会影响许多分机。帐户(甚至许多分类帐),您可以反转(发布相反的Transactions),添加新交易(又名费用,罚款)或从所有涉及的分机重新分配资金。状态改变时的账户/账本交易。必须保留对这些特定于流程的表的引用Transactions,并且不要在其中重复Amount。

更多示例:
一个简单的例子ApplicationTransaction是Bet由几个 s 组成的,Pledge当您从每个参与者那里获取一些抵押品时。每个参与者甚至拥有不同的资产,并且House可以使用其中的许多资产来满足某些要求。我正在考虑ApplicationTransaction带有鉴别器的通用表D和许多特定的表。
以及带有引用其执行的许多复式记账事务的列的ApplicationTransaction表。State在其生命周期内,ApplicationTransaction它可以发布(make Transactions)其状态更改,但并非总是如此。例如,Bet获取抵押品并在时间到了时释放它Bet,在某些情况下,它会重新分配该操作持有的初始金额,但其某些状态不会发布。
A Lottery(这是这里最常见的用例)可能是ApplicationTransaction影响许多账户的一个例子,它以大量的“空投”奖金开始和结束。每个实例都有自己的属性值,属性是静态的。
另一个用例是Trade两个分机之间。House 可以作为中间人的帐户,必须从双方获取资产,将其转移到特殊的LedgerAccount|XYZ|AL|Escrow|,每个ApplicationTransaction.Type,而不是每个实例。保留与特定实例相关的传输记录Trade,可能会持续一段时间,有多种状态、属性、不同的结果。账户持有人可能会受到一侧的处罚并另一侧得到偿还。没有订单簿或撮合引擎。这种交换过程有几个状态,如果发生这种转变,另一个交易对手可能会参与争议解决State。Trade两个参与者都必须用类似的内容标记 a Payment Received(假设付款是在系统外部完成的)。这就是状态转换。系统可以向每个参与者收取费用。
这不是一个单一的Transaction条目。他们一群。例如,如果我需要将一些金额存入托管,我可以放入 X * 祖母绿和 X * 钻石来与公主约会。因此,它不仅发布了许多(AssetType, Amount, AccountNo)(N * 资产 …
srv := &http.Server{
Addr: "127.0.0.1:8080",
Handler: r,
MaxHeaderBytes: 1,
}
srv.ListenAndServe()
Run Code Online (Sandbox Code Playgroud)
我通过 curl 使用自定义标头和应用程序提供了几个请求,没有任何错误。我做错了什么?
从 go vet 那里得到这个:
context.WithTimeout 返回的取消函数应该被调用,而不是被丢弃,以避免上下文泄漏
代码如下:
func foo(ctx context.Context) {
for ... some loop {
c, _ := context.WithTimeout(ctx, time.Second)
err = enc.RequestWithContext(c, "some", someRequest, &response)
if err != nil {
continue
}
if response.Code == -1 {
break
}
}
}
Run Code Online (Sandbox Code Playgroud)
那么在请求后取消它有什么意义呢?只是为了vet开心?无论如何,该上下文已经完成或超时。
func foo(ctx context.Context) {
for ... some loop {
c, cancel := context.WithTimeout(ctx, time.Second)
err = enc.RequestWithContext(c, "some", someRequest, &response)
cancel()
if err != nil {
continue
}
if response.Code == -1 {
break …Run Code Online (Sandbox Code Playgroud)