我目前在 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)
哪种方法更好?我认为第二种方法更好,因为它更灵活,如果将来有其他类别,您将不必添加更多表来容纳它。或者有更好的模式吗?请让我知道。
谢谢!
我会使用第二种方法的变体:
**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 的晚餐既被视为“餐厅”又被视为“娱乐”。
| 归档时间: |
|
| 查看次数: |
9965 次 |
| 最近记录: |