如何在资金分配费用时将资金安排到资金中

时间:2017-07-09 12:50:42

标签: sql database ms-access database-design rdbms

如果我正在管理一个有费用的俱乐部(例如咖啡,建筑维修,电力,蛋糕等)。每次俱乐部承担费用,然后将记录添加到“所有实际费用”中。表:

 ______________________      _______________________
|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中有多少钱,多少钱是在基金二,基金三是多少钱?

问题是,如果该计划只是显示每个基金有多少钱,那么用户似乎认为该俱乐部的钱远远超过它实际拥有的金额!

通过扩展,还会出现以下问题:

  • 如果某些资金没有给予任何资金怎么办?该计划将如何分配?该计划将如何显示这笔钱?
  • 如果有人想为某些不单独归入基金的费用提供资金,我是否应该创建一个定制基金'对他们?如果我把钱直接用于支出,我会违反数据库理论(我认为),因为有些钱将直接分配给费用,一些钱将分配给基金!

我不知道,也许我忽略了一个明显的解决方案。这个模型之前是否曾被解决过?提前感谢任何想法。

2 个答案:

答案 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.