背景
我已经建立了一个电子商务应用程序,连接到Authorize.net的支付网关。管理员可以通过以下方式处理信用卡:
这个问题涉及如何将这些类型的事务存储在数据库中。我的“支付”表中有以下模式:

当进行新的支付时,我将有关支付方法的信息存储在PaymentAmount字段中(例如信用卡、支票、现金)。
如果PaymentType是“信用卡”,我存储TransactionType (例如,捕获,只在八月,之前-8月-捕获“)。
PaymentAmount列保存支付金额(如果TransactionType是“捕获”或“优先捕获”)。如果TrandactionType是“只在八月”,我会将金额存储在AuthorizedAmount列中,并跟踪在AuthExpDate中使用的auth金额适合的日期。
与Authorize.net的事务/引用数据相关的字段存储在ApprovalCode和TransactionID列中。
回到问题上
现在您有了一些背景知识,让我们深入了解我的问题的细节:每个事务应该在这个表中获得它自己的记录吗?或者,当我从这些交易中获取资金时,是否应该更新现有的“仅限于八月”的交易?
示例:
从逻辑上讲,我可以看到这两种情况的论据。一方面,如果我为每个事务创建一个新的行,我可以看到每个“仅限”事务的每一个命中事件的良好历史。缺点是在这样的情况下,您对单个“仅限”事务进行多个“先捕获”事务,因为要计算出还剩下多少,您必须编写一个稍微复杂一些的查询(将表加入到自己并由TransactionID分组以得到PaymentAmount之和)。
如果我为每个TransactionID创建一个行,那么我可以很容易地更新PaymentAmount并使用简单的计算(AuthorizedAmount - PaymentAmount = AuthorizedBalance)来计算auth中剩余的数量。这种方法还使事情变得更简洁,因为TransactionID、ApprovalCode、Payment和几乎所有其他东西都将保持不变,因此表中的冗余数据更少。此外,从报告的角度来看,为了简单起见,大多数用户只是希望看到每个事务的一行。
我很想听听你对解决这个问题的正确方法的想法。
发布于 2016-09-15 10:14:39
为了简单起见,我将避免失去数据/灵活性的诱惑;如果您更新原始行,如何独立地确定auth /捕获的日期/时间?拍了多少次?每个网关API返回的单独的auth代码和其他新值是什么?
如果有很多重复的字段,在不同的事务类型之间共享相同的值,那么通过将它们移动到一个新表并存储一个ID值来实现正常化。
发布于 2016-09-15 14:12:21
我不认为这里有任何正确或错误的答案(因此问题应该以意见为基础结束)。不过,我建议第三条路.
使用您的“更新行”模型,但随后添加一个新表,用于存储与Authorize.net的低级别通信。新表将捕获付款id、日期/时间、auth类型、auth值等。
这样,您就有了可以调试的东西,以及每张卡的日期/时间/值的历史记录,以及它们创建和充电的时间。
https://stackoverflow.com/questions/39499340
复制相似问题