我和2个朋友正在启动一个项目,简单的社交网络应用程序。问题是,这让我感到困扰的是,我们有一个表Wallet
,它将存储两个用户之间所有交易值的总和。
TABLE WALLET:
ID,
UserID,
FriendID,
TotalDebtAmount
根据以前版本的经验,我们决定复制钱包条目,所以如果User1
总共欠User2
200美元,Wallet
将有2个条目:
ID : UserID : FriendID : TotalDebtAmount
1 User1 User2 -200
2 User2 USer1 200
这将有助于创建所有用户债务和信用的列表,因为我们可以选择所有条目,WHERE UserID=user
。如果金额是正的,我们的朋友欠我们的,如果是负的,我们欠我们的朋友。
之前的概念是这样的:
TABLE WALLET:
ID,
CreditorUserID,
DebtorUserID,
TotalDebtAmount
和User1
欠User2
200$将生成一个条目:
ID : CreditorUserID : DebtorUserID : TotalDebtAmount
1 User1 User2 -200
但是选择所有的信用和债务都需要WHERE CreditorUserId=user OR DebtorUserID=user
,当显示它时,我们必须检查当前用户列出的列并相应地修改金额(正数意味着DebtorUser
欠CreditorUser
,负数-相反,所以当在网站上显示User2
的债务/信用时,我们需要将-200$更改为200$,因为User2
在DebtorUserID
列)。
我们发现复制数据的解决方案更容易,但是这个项目主要是为了教育目的,所以我们的首要任务是使用良好的编程实践,有些人说复制数据不是其中之一。你觉得呢?
您复制了数据,这是不必要的。您也可以使用第一种表格布局类型执行查询。当然,查询会稍微复杂一点,但在我看来,复制数据是不值得的。
你们为一笔交易写两笔记录,一笔贷一笔借的方法很好。这构成了复式记账法的基础,复式记账法已经在会计中使用了数百年。正如您在问题中所指出的,这将使许多操作和查询更容易处理。
对于一个完整的工作示例,请参阅这篇文章