开发者社区 问答 正文

个人理财数据库设计

我正在尝试为我的个人财务跟踪应用程序创建数据库。但是,我在设计阶段遇到了一些问题。

这是我的原始设计,仅由两个表组成,并且交易和类别之间存在一对多关系

transactions
-------------
   id          INT     PRIMARY KEY
   userId      NVARCHAR(MAX) 
   title       NVARCHAR(MAX)
   amount      DECIMAL(18,2)
   date        DATETIME(7)
   categoryId  INT     FOREIGN KEY


categories
------------
   id           INT PRIMARY KEY
   Title        NVARCHAR(MAX)
   Type         NVARCHAR(MAX)

我遇到麻烦的地方是我希望能够将每个类别的每月计划支出金额相加,所以我不想直接将计划值添加至表格中,因为我希望类别可以跨月使用。

我还将介绍一个月初余额的值。

所以我在想我可以做这样的事情

budgets
------------
   id           INT PRIMARY KEY
   userId       NVARCHAR(MAX)
   monthStart   DATETIME
   startBalance DECIMAL(18,2)

budget_categories
------------
   categoryid     INT FOREIGN KEY
   budgetId       INT FOREIGN KEY
   planned        DECIMAL(18,2)
还是更好的方法是这样的?

budgets
------------
   id           INT PRIMARY KEY
   userId       NVARCHAR(MAX)
   monthStart   DATETIME
   startBalance DECIMAL(18,2)

planned_categories
------------
   categoryid     INT FOREIGN KEY
   monthStart     DATETIME
   planned        DECIMAL(18,2)

然后,如果我要搜索当前月份的类别计划,则不必先获取预算

我只是很困惑。

展开
收起
心有灵_夕 2019-12-22 13:52:16 744 分享 版权
阿里云 AI 助理回答

你的问题涉及到数据库设计的优化,特别是如何高效地存储和查询财务预算数据。两种设计方案各有优缺点,让我们来分析一下:

方案一

budgetsbudget_categories

  • 优点:

    • 明确地将预算信息(包括月初余额)与特定用户和月份关联起来。
    • 通过 budget_categories 表,可以清晰地看到每个类别在特定预算下的计划支出,便于管理和更新特定月份的计划值。
  • 缺点:

    • 查询当前月份的类别计划需要先找到对应的 budgetId,然后再到 budget_categories 中查找,涉及联表查询。

方案二

budgetsplanned_categories

  • 优点:

    • 简化了查询当前月份类别计划的过程,因为直接在 planned_categories 表中包含了 monthStart,可以直接根据用户ID、月份和类别获取计划支出,无需先查询预算表。
    • 更灵活地处理跨月的计划变更,因为计划是按月和类别直接记录的。
  • 缺点:

    • 类别计划与预算表(包含月初余额等信息)解耦,可能导致数据完整性维护上稍显复杂,比如调整预算时需确保不影响已有的计划数据。

建议

考虑到你希望简化查询过程并能方便地管理跨月的计划支出,同时保持数据的一致性和可维护性,我倾向于推荐采用方案二。这种设计允许你更直接地操作和查询每个月各类别的计划支出,而不需要额外的联表操作。此外,它也提供了更好的扩展性,如果未来需要添加更多与计划相关的属性或逻辑,可以在 planned_categories 表中直接进行,不会影响到基础的预算信息。

不过,请注意,实际选择应基于你的具体需求和应用的长远规划。如果预算信息(如月初余额)与计划支出紧密相关,频繁一起被查询或修改,可能需要考虑在应用层面上增加逻辑来保证数据操作的一致性。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址: