银行交易表 - 这可以做得更好吗?

时间:2012-02-28 19:45:27

标签: sql-server database database-design

我想知道制作银行交易表的最佳方法是什么。

我知道用户可以拥有多个帐户,因此我添加AccountID而不是UserID,但如何命名另一个外国帐户。我怎么知道它是传入还是传出的事务。我在这里有一个例子,但我认为可以做得更好,所以我会征求你的意见。

在我的示例中,我将所有事务存储在一个表中并添加bool isOutgoing。因此,如果设置为true,我知道如果用户ForeignAccount已向false汇款,那么我知道ForeignAccount已向用户汇款。

我的例子

enter image description here

请注意,这不适用于真正的银行。我只是在努力解决最佳实践问题。

4 个答案:

答案 0 :(得分:1)

通常,我认为,您会看到一列反映帐户的DEBIT或CREDIT,而不是传出。

可能有几个表格如下:

ACCOUNT
-------
account_id
account_no
account_type

OWNER
-------
owner_id
name
other_info

ACCOUNT_OWNER
--------------
account_id
owner_id

TRANSACTION
------------
transaction_id
account_id
transaction_type
amount
transaction_date
在这里,您将获得2条交易记录 - 一条显示借记,一条显示信用 如果你真的想要,你可以在另一个表中链接这两个交易

TRANSACTION_LINK
----------------
transaction_id1
transaction_id2

答案 1 :(得分:1)

我的意见:

  • 使ID不为空,Identity(1,1)和主键
  • UserAccountID很好。别忘了在Accounts表中创建FK;
  • 如果每笔交易都在两个帐户之间且两个帐户都在组织内部,那么您可以将foreignAccount设为整数
  • 除非必要,否则不要创建Nvarchar字段(占用两倍的空间)并且不要创建1024.如果需要超过900个字符,请使用varchar(max),因为如果列小于900,则可以仍在其上创建索引
  • 将datetime列创建为默认的getdate(),除非您可以在与实际日期不同的日期创建交易;
  • 金额应为数字,而不是整数

答案 2 :(得分:1)

我同意关于isOutgoing标志的评论 - 插入/更新很容易错误地设置它(虽然列的名称很清楚,作为列可能会被忽略,因此设置为默认值)。

交易表的另一种方法可以是:

  TransactionID (unique key)   
  OwnerID   
  FromAccount  
  ToAccount  
  TransactionDate  
  Amount  

或者,您可以拥有“LocalAccount”和“ForeignAccount”,金额字段的符号代表方向。

如果您正在进行涉及多种货币的交易,则需要/考虑以下列

  Currency  
  AmountInBaseCcy  
  FxRate  

如果涉及多种货币,那么您要么希望每个ccy组合的fx汇率/日期的共同ccy或每次交易存储它 - 这取决于它的计算方式

答案 3 :(得分:0)

我认为您正在寻找的是如何处理多方关系(帐户可以有多个所有者,所有者可以拥有多个帐户)

您可以通过连接表执行此操作。因此,您拥有帐户所需的所有详细信息帐户,您拥有用户所需的所有详细信息,然后您拥有帐户USer,其中只包含其他两个表中的ID。