【问题标题】:How to arrange money into funds, when funds can share expenses当资金可以分担费用时,如何安排资金入基金
【发布时间】:2017-12-13 06:35:56
【问题描述】:

如果我管理的俱乐部有费用(例如咖啡、建筑维修、电费、蛋糕等)。每次俱乐部承担费用时,都会在“所有实际费用”表中添加一条记录:

 ______________________      _______________________
|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      |
-----------------|

这看起来不错,但有一个问题我一辈子都搞不定:

我如何显示每个基金的金额?请记住,有些钱可能分配给基金一和二,而另一些钱可能分配给基金二和三……所以在现实中,有没有一种好方法可以显示基金一中有多少钱,有多少钱基金二,基金三有多少钱?

问题是,如果程序只显示每个基金中有多少钱,用户会觉得俱乐部的钱远远多于实际拥有的钱!

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

  • 如果没有给任何基金一些钱怎么办...程序将如何分配它?该计划将如何显示这笔钱?
  • 如果有人想为某些不单独归入一个基金的费用捐款,我应该为他们创建一个“自定义基金”吗?如果我将钱直接用于支出,我将违反数据库理论(我认为),因为有些钱将直接分配给支出,有些钱将分配给基金!

我不知道,也许我忽略了一个明显的解决方案。这个模型以前处理过吗?提前感谢您的任何想法。

【问题讨论】:

  • 您的问题对我来说似乎太宽泛了。如果您只是向我们展示一些带有示例数据的表格,然后询问我们如何执行某种类型的查询,那会更有效。
  • 这就是你几天前问的问题,不是吗? stackoverflow.com/questions/44905841/…
  • @Tim,我不是来问我的问题的,我想知道如何设计模型,所以我特意把这个问题说得有点宽泛。

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


【解决方案1】:

在“付款相关费用”中,您需要包含一个分配列。然后,您的查询如下所示:

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%。

【讨论】:

  • 我没有“付款链接费用”表,正如我在问题中所写,我建立了数据库以将资金存入基金。除非您认为我应该制作“付款链接费用”表?但是我将如何赚钱(这对我来说非常重要)?另外,“flae”是什么意思(请原谅我的无知)?
【解决方案2】:

如果您有收入和支出,我认为您应该将它们分成部分金额。

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.        

【讨论】:

  • 这很好,但我想更进一步:不将收入分配给费用,只是将收入分配给资金,有没有一种好方法可以为程序进行良好的查询/设计以显示多少每只基金有可用资金吗?另外,我看不出“目标”的意义——我的意思是,每次用户只想支付费用时,他都可以将这些费用作为自定义基金!似乎更容易,不是吗?
猜你喜欢
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
相关资源
最近更新 更多