如果我正在管理一个有费用的俱乐部(例如咖啡,建筑维修,电力,蛋糕等)。每次俱乐部承担费用,然后将记录添加到“所有实际费用”中。表:
______________________ _______________________
|All Possible Expenses | |All Actual Expenses |
----------------------- -----------------------
| ID | | ID |
| Name of expense | | AllPossibleExpensesID |
----------------------- | Date Occured |
| Price |
-------------------------
费用可以安排到资金中(例如' 2017年的费用','食品费用''为讨论场所而举行的商务会议的费用等等)。
所以资金表是:
___________ _________________________________________
| Funds | | Funds LINK AllActualExpenses |
------------| |-----------------------------------------|
| Id | | FundID |
| Fund Name | | AllActualExpensesID that's in this fund |
------------ -----------------------------------------
正如您所看到的,资金可以重叠,因此费用可以是少数基金的一部分。
当钱付给俱乐部的金库时,这笔钱只能分配给某些基金,如下:
_________________ _____________________________________
|Payments | | Payments LINK Funds |
-----------------| |------------------------------------|
| ID | | PaymentID |
| Date | | A FundID that this is allocated to |
| Amount Paid In | -------------------------------------
| Member ID |
-----------------|
这看起来不错,但是我不能解决我的生活中的问题:
我如何显示每个基金中有多少钱?请记住,一些资金可能会分配给第一和第二基金,而其他资金可能会分配给基金第二和第三......所以实际上,是否有一个很好的方式来显示基金ONE中有多少钱,多少钱是在基金二,基金三是多少钱?
问题是,如果该计划只是显示每个基金有多少钱,那么用户似乎认为该俱乐部的钱远远超过它实际拥有的金额!
通过扩展,还会出现以下问题:
我不知道,也许我忽略了一个明显的解决方案。这个模型之前是否曾被解决过?提前感谢任何想法。
答案 0 :(得分:0)
在“付款链接费用”中,您需要包含分配列。然后,您的查询如下:
Select flae.fundID, sum(ae.Price * flae.allocation) as price
from fundsLinkActualExpenses as flae join
ActualExpenses as ae
on flae.ExpensesID = flae.ExpensesID
group by flae.fundID;
您需要设置触发器,以确保在添加新费用和资金及链接时,分配总计达到100%。
答案 1 :(得分:0)
如果您有收入和支出,我认为您应该将其分成部分金额。
earning(id, amount)
primary key: id
spending(id,amount)
primary key: id
partial(earning_id,spending_id,amount)
primary key: earning_id,spending_id
foreign key: earning_id references earning(id)
foreign key: spending_id references spending(id)
constraints:
(sum(spending.amount) where spending.id=ARBITRARY_ID)
<= spending.amount where spending.id=ARBITRARY_ID
where ARBITRARY_ID is a valid id from spending
(sum(earning.amount) where earning.id=ARBITRARY_ID)
<= earning.amount where earning.id=ARBITRARY_ID
where ARBITRARY_ID is a valid id from earning
所以假设
spendings
id amount
1 50
2 100
3 150
4 30
earnings
id amount
1 100
2 100
3 120
parts
earning_id spending_id amount
1 1 50
1 2 50
2 2 50
2 3 50
3 3 100
3 4 20
所以我们有
payed by
spending earning remaining
1 1 0
2 1,2 0
3 2,3 0
4 3 10
used for
earning spending remaining
1 1,2 0
2 2,3 0
3 3,4 0
所以我们确切地知道如何使用这笔钱。
可以手动分割成零件数量,但当然最好使用子程序。 子程序可以由触发器执行(这可能很复杂),也可以定期执行。
在您的设计中,收入将是您的付款,花费将是您的费用。拆分金额的子程序必须考虑付款的资金。
如果资金和单笔费用都有,那么两者都应该有一个共同的超类。让我们称之为目标(毫无疑问会有更好的名字)。
所以我们有
target(id)
primary key(id)
expenses(id
primary key(id)
foreign key(id) references target(id)
funds(id)
primary key(id)
foreign key(id) references target(id)
money is not given to funds or expenses but to targets.