001*_*001 64 database sql-server database-design sql-server-2008
如何设计数据库以计算帐户余额?
1)目前我从交易表中计算账户余额在我的交易表中我有"描述"和"金额"等.
然后我会将所有"金额"值相加,这将计算出用户的帐户余额.
我向我的朋友展示了这个,他说这不是一个好的解决方案,当我的数据库增长它会减慢???? 他说我应该创建单独的表来存储计算的帐户余额.如果这样做,我将不得不维护两个表,而且风险很大,帐户余额表可能会不同步.
有什么建议吗?
编辑:选项2:我应该在我的交易表"余额"中添加一个额外的列.现在我不需要经过多行数据来执行我的计算.
示例约翰购买100美元信贷,他债务60美元,然后他增加200美元信贷.
金额$ 100,余额$ 100.
金额 - 60美元,余额40美元.
金额$ 200,余额$ 240.
smi*_*man 60
一个从未得到优雅解决的古老问题.
我使用的所有银行业务包都存储了账户实体的余额.从运动历史中动态计算它是不可想象的.
正确的方法是:
有些系统将所有运动存储为正数,并通过反转from/to字段或带有标志来表示信用/借记.就个人而言,我更喜欢信用额度,借方字段和签名金额,这使得逆转更容易遵循.
请注意,这些方法适用于现金和证券.
证券交易可能要复杂得多,特别是对于公司行为,您需要提供一笔交易,以更新一个或多个买方和卖方的现金余额,其安全头寸余额以及可能的经纪人/存款.
这是我得到的数据库设计,只有一个表用于存储操作/事务的历史记录。目前正在许多小型项目中发挥魅力。
这不会取代特定的设计。这是一个通用的解决方案,可以适合大多数应用程序。
id :int 标准行 ID
operation_type:int 操作类型。支付、收取、利息等
source_type :int 操作从哪里进行。目标表或类别:用户、银行、提供商等
source_id : 数据库中源的int id
target_type:int 表示应用的操作。目标表或类别:用户、银行、提供商等
target_id:数据库中目标的int id
amount :decimal(19,2signed) 价格值正数或负数求和
account_balance:十进制(19,2 签名)结果余额
extra_value_a :decimal(19,2signed) [这是不使用字符串存储的最通用的选项] 您可以存储额外的数字:利息百分比、折扣、减少等。
创建时间:时间戳
对于 source_type 和 target_type ,最好使用枚举或表设备。
如果你想要一个特定的余额,你可以只查询按created_at降序限制到1排序的最后一个操作。你可以按源、目标、操作类型等查询。
为了获得更好的性能,建议将当前余额存储在所需的目标对象中。