追踪个人日常开支的数据库设计

MLZ*_*MLZ 5 database-design

我目前在 Excel 中跟踪日常开支有以下内容: 这里

我想将以下 excel 表转换为规范化数据库。我还想捕获每笔费用的描述(如果有的话)。我有两种方法:

1)创建日期表,为每个费用类别分别创建一个表(以及每个表单独对应的费用描述表):

**Date:** 
id | date       | 
-----------------
1  | 2014-12-01 | 
2  | 2014-12-02 | 
3  | 2014-12-03 | 
4  | 2014-12-04 | 

**Rent:**
id |date_fk | amount | 
----------------------
1  | 1      | 1000   | 

**Restaurant:**
id |date_fk | amount | 
----------------------
1  | 2      | 12     | 

**Restaurant_desc:**
id | restaurant_fk | description        |
------------------------------------------
1  | 1             | Dinner at Arby's|
Run Code Online (Sandbox Code Playgroud)

2)创建一个日期表和一个一般费用表和一个费用描述表:

**Date:** 
id | date       | 
-----------------
1  | 2014-12-01 | 
2  | 2014-12-02 | 
3  | 2014-12-03 | 
4  | 2014-12-04 |

**Expense:**
id | date_fk | amount | category     |
--------------------------------------
1  | 1       |  1000  | rent         | 
2  | 1       |  120   | parking      |
3  | 2       |  12    | restaurant   |
4  | 2       |  10    | entertainment| 

**Expense_description:**
id | expense_fk | description       |
-------------------------------------
1  | 3          | Dinner at Arby's  |
Run Code Online (Sandbox Code Playgroud)

哪种方法更好?我认为第二种方法更好,因为它更灵活,如果将来有其他类别,您将不必添加更多表来容纳它。或者有更好的模式吗?请让我知道。
谢谢!

SQB*_*SQB 4

我会使用第二种方法的变体:

**Expense:**
id | date       | amount | category_fk  | description      |
------------------------------------------------------------
1  | 2014-12-01 |  1000  | 1            |                  |
2  | 2014-12-01 |  120   | 2            |                  |
3  | 2014-12-02 |  12    | 3            | Dinner at Arby's |
4  | 2014-12-02 |  10    | 4            |                  |

**Category:**
id | category_name |
--------------------
1  | rent          |
2  | parking       |
3  | restaurant    |
4  | entertainment | 
Run Code Online (Sandbox Code Playgroud)

我认为您不需要单独的日期表。这样做你不会获得任何好处,除非你想存储该日期的额外信息,即使这样,日期本身也将是一个自然的键。

特定费用的描述与该费用具有 1:1 关系,因此不需要自己的表,除非您想重复使用描述(此时您不再具有 1:1 关系)。

该类别需要一个单独的表,因为它不会有 1:1 关系,而是 1:n 关系(单个类别将用于多个费用)。


如果您想建模 an:n 关系,其中费用也可以属于多个类别,您将需要一个像这样的交叉引用表(从费用表中删除category_fk列):

**Expense_Categories:**
expense_fk | category_fk |
--------------------------
1          | 1           |
2          | 2           |
3          | 3           |
3          | 4           |
4          | 4           | 
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,Arby's 的晚餐既被视为“餐厅”又被视为“娱乐”。