我和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
1}}和否定 - 相反,所以当在User2
的网站上显示债务/信用时,我们需要将-200 $更改为200 $,因为User2
列在DebtorUserID
列中。
我们发现重复数据解决方案更容易,但这个项目主要用于教育目的,所以我们的首要任务是使用良好的编程实践,有些人说重复数据不是一个。你觉得怎么样?
答案 0 :(得分:0)
您复制数据,这是不必要的。您也可以使用第一种类型的表格布局进行查询。当然,查询会有点复杂,但在我看来,不值得复制数据。
答案 1 :(得分:0)
您为交易编写两个记录(信用卡和借记卡)的方法很好。这构成了double entry bookkeeping的基础,已在会计中使用了数百年。正如您在问题中所提到的,这将使许多操作和查询更容易处理。
有关它的完整工作示例,请参阅此post