D8 - 深入設計個人財務管理系統的資料庫結構

閱讀時間約 18 分鐘

哈囉,各位!我們已經搭建好了開發環境,也處理好了版本控制。現在,是時候來設計我們的資料庫了。這一步可不能馬虎,因為資料庫就像是系統的心臟,設計得好,才能讓整個系統順暢運作。


一、需求分析

在開始之前,讓我們重新整理一下我們的系統需求:

  1. 使用者管理:使用者可以註冊、登入,並管理自己的帳戶。
  2. 銀行帳戶管理:使用者可以新增、編輯、刪除銀行帳戶。
  3. 財務紀錄管理:記錄每個銀行帳戶的收入與支出。
  4. 分類管理:對財務紀錄進行分類,如「飲食」、「交通」、「薪資」等。
  5. 報表功能:生成收支報表,讓使用者了解自己的財務狀況。

二、資料庫設計概述

根據需求,我們需要設計以下資料表:

  1. users:使用者表
  2. bank_accounts:銀行帳戶表
  3. categories:分類表
  4. transactions:財務紀錄表
    接下來,我們將逐一詳細介紹每個資料表的設計,並提供實際的 MySQL 建表語法。

三、資料表詳細設計

1. users 表—使用者資訊管理

用途:儲存使用者的基本資訊,處理登入、註冊和驗證。

欄位設計:

  • id (INT UNSIGNED AUTO_INCREMENT PRIMARY KEY):使用者唯一識別碼。
  • username (VARCHAR(50) NOT NULL UNIQUE):使用者名稱。
  • email (VARCHAR(100) NOT NULL UNIQUE):電子郵件。
  • password (VARCHAR(255) NOT NULL):加密後的密碼。
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP):帳號建立時間。
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP):帳號最後更新時間。

建表語法:

CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

設計原因:

  • 安全性:密碼必須經過加密後儲存,不能以明文形式保存。
  • 唯一性:username 和 email 設為唯一,防止重複註冊。
  • 時間戳記:方便追蹤使用者的註冊和更新時間。


2. bank_accounts 表—銀行帳戶管理

用途:管理使用者的銀行帳戶。

欄位設計:

  • id (INT UNSIGNED AUTO_INCREMENT PRIMARY KEY):帳戶唯一識別碼。
  • user_id (INT UNSIGNED NOT NULL):關聯到 users 表的使用者 ID。
  • account_name (VARCHAR(100) NOT NULL):帳戶名稱,例如「薪資帳戶」。
  • account_number (VARCHAR(50)):銀行帳號(可選)。
  • bank_name (VARCHAR(100)):銀行名稱(可選)。
  • balance (DECIMAL(15,2) NOT NULL DEFAULT 0.00):帳戶餘額。
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP):帳戶建立時間。
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP):帳戶最後更新時間。

建表語法:

CREATE TABLE bank_accounts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
account_name VARCHAR(100) NOT NULL,
account_number VARCHAR(50),
bank_name VARCHAR(100),
balance DECIMAL(15,2) NOT NULL DEFAULT 0.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

設計原因:

  • 多帳戶支持:一個使用者可能有多個銀行帳戶,需要進行區分。
  • 關聯性:透過 user_id 與 users 表關聯,確保帳戶屬於正確的使用者。
  • 資料完整性:ON DELETE CASCADE 確保當使用者被刪除時,相關的銀行帳戶也會被刪除。

3. categories 表—分類管理

用途:管理財務紀錄的分類。

欄位設計:

  • id (INT UNSIGNED AUTO_INCREMENT PRIMARY KEY):分類唯一識別碼。
  • user_id (INT UNSIGNED NOT NULL):關聯到 users 表的使用者 ID。
  • category_name (VARCHAR(100) NOT NULL):分類名稱。
  • type (ENUM('income', 'expense') NOT NULL):類型,收入或支出。
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP):分類建立時間。
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP):分類最後更新時間。

建表語法:

CREATE TABLE categories (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
category_name VARCHAR(100) NOT NULL,
type ENUM('income', 'expense') NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);

設計原因:

  • 個人化分類:每個使用者可以有自己的分類。
  • 類型區分:type 欄位區分收入和支出,方便在查詢時進行過濾。
  • 資料完整性:確保分類與使用者正確關聯。

4. transactions 表—財務紀錄管理

用途:記錄每一筆財務交易。

欄位設計:

  • id (INT UNSIGNED AUTO_INCREMENT PRIMARY KEY):交易唯一識別碼。
  • user_id (INT UNSIGNED NOT NULL):關聯到 users 表的使用者 ID。
  • bank_account_id (INT UNSIGNED NOT NULL):關聯到 bank_accounts 表的帳戶 ID。
  • category_id (INT UNSIGNED NOT NULL):關聯到 categories 表的分類 ID。
  • type (ENUM('income', 'expense') NOT NULL):交易類型。
  • amount (DECIMAL(15,2) NOT NULL):交易金額。
  • transaction_date (DATE NOT NULL):交易日期。
  • description (VARCHAR(255)):備註(可選)。
  • created_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP):交易建立時間。
  • updated_at (TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP):交易最後更新時間。

建表語法:

CREATE TABLE transactions (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
bank_account_id INT UNSIGNED NOT NULL,
category_id INT UNSIGNED NOT NULL,
type ENUM('income', 'expense') NOT NULL,
amount DECIMAL(15,2) NOT NULL,
transaction_date DATE NOT NULL,
description VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (bank_account_id) REFERENCES bank_accounts(id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES categories(id) ON DELETE CASCADE
);

設計原因:

  • 資料完整性:確保每筆交易都與正確的使用者、帳戶、分類關聯。
  • 類型冗餘:即使分類的類型被修改,交易的類型仍然保持不變。
  • 金額精確度:使用 DECIMAL 型別,確保金額計算的精確性。
  • 時間戳記:transaction_date 用於記錄實際交易發生的日期,而不是資料建立的時間。

四、資料表關聯關係

E-R 圖文字描述

以下是根據你提供的文字描述生成的完整 E-R 圖。這張 E-R 圖展示了 users、bank_accounts、categories 和 transactions 之間的關聯,並且清晰表示了每個實體之間的多對一或一對多的關係。

  • users:
    • 一對多關聯至 bank_accounts。
    • 一對多關聯至 categories。
    • 一對多關聯至 transactions。
  • bank_accounts:
    • 多對一關聯至 users。
    • 一對多關聯至 transactions。
  • categories:
    • 多對一關聯至 users。
    • 一對多關聯至 transactions。
  • transactions:
    • 多對一關聯至 users。
    • 多對一關聯至 bank_accounts。
    • 多對一關聯至 categories。

E-R 圖的 Mermaid 代碼

erDiagram
users {
string user_id PK
string name
string email
string password
}

bank_accounts {
string account_id PK
string user_id FK
string account_name
string account_number
float balance
}

categories {
string category_id PK
string user_id FK
string category_name
}

transactions {
string transaction_id PK
string user_id FK
string account_id FK
string category_id FK
float amount
string date
string description
}

users ||--o{ bank_accounts : owns
users ||--o{ categories : defines
users ||--o{ transactions : makes

bank_accounts ||--o{ transactions : records

categories ||--o{ transactions : categorizes

owns:表示一個使用者擁有多個銀行帳戶。

defines:表示一個使用者定義多個分類。makes:表示一個使用者創建多筆交易。records:表示銀行帳戶記錄交易。categorizes:表示分類標記交易。

說明

  • users:
    • 和 bank_accounts、categories、transactions 有一對多的關聯,表示一個使用者可以擁有多個銀行帳戶、分類及交易紀錄。
  • bank_accounts:
    • 多對一關聯到 users,表示一個銀行帳戶只屬於一個使用者。
    • 和 transactions 有一對多關聯,表示一個帳戶可以有多筆交易。
  • categories:
    • 多對一關聯到 users,表示每個分類屬於一個使用者。
    • 和 transactions 有一對多關聯,表示一個分類可以對應到多筆交易。
  • transactions:
    • 多對一關聯到 users、bank_accounts 和 categories,表示每筆交易都與一個使用者、一個銀行帳戶及一個分類相關聯。



五、實際應用場景舉例

假設一個使用者張三,使用我們的系統進行以下操作:

  1. 註冊帳號:在 users 表中新增一筆資料。
  2. 新增銀行帳戶:在 bank_accounts 表中新增「薪資帳戶」。
  3. 新增分類:在 categories 表中新增「薪資」分類,類型為收入。
  4. 記錄收入:在 transactions 表中新增一筆交易,金額為 50000,分類為「薪資」,關聯到「薪資帳戶」。
  5. 查看報表:系統根據 transactions 表中的資料,生成當月的收入報表。

六、未來可能的擴充功能

  • 多幣別支持:在相關表格中新增 currency 欄位,處理不同貨幣的交易。
  • 共享帳戶:允許多個使用者共享同一個銀行帳戶,需要調整 bank_accounts 表的設計。
  • 提醒功能:設定定期交易或預算提醒,可能需要新增 schedules 或 alerts 表。

我們詳細設計了個人財務管理系統的資料庫結構,涵蓋了使用者管理、銀行帳戶管理、財務紀錄管理和分類管理等核心功能。


良好的資料庫設計是系統開發的基石,它直接影響到系統的性能、擴充性和維護成本。透過清晰的關聯關係和資料完整性約束,我們能確保資料的一致性和可靠性,為後續的應用開發奠定了堅實的基礎。接下來,我們將在 Laravel 中實現這些資料表,並開發相應的後端 API,讓我們的系統從設計走向實際應用。這將使我們能夠更好地服務使用者,提供可靠的個人財務管理工具。


下一篇,我們將在 Laravel 中進行相關的實作!


這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,作者都用幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
留言0
查看全部
發表第一個留言支持創作者!
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
好了,到了這個階段,我們終於要進入 Docker 的世界了!前幾篇文章我們討論了系統規劃與需求,現在來到實作的部分,要為整個開發環境打好基礎。這篇文章將帶你一步步打造出一個基於 Docker 的開發環境,裡面包含了 Laravel(後端)、Nuxt(前端)、Nginx(伺服器),以及 MariaDB
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
獨自開發並不等於掌握所有技術,而是具備解決問題和完成專案的能力。透過選擇實用且具挑戰性的專題,如個人財務管理系統,開發者可以快速實現最小可行性產品(MVP)。本文將探討如何從前端或後端開始,搭建核心功能並優化系統,以提升用戶體驗,並持續學習和成長。
好了,經過前幾篇的努力,我們的開發環境已經搭建完成,並進行了初步的測試。一切看起來都很順利,但在正式進入開發之前,我們還有一件重要的事情要做:加入版本控制。 你可能會想:「現在還早吧?我一個人開發,有必要嗎?」但相信我,版本控制就像是遊戲中的存檔點,或者電影裡的多重宇宙時間線,在你需要的時候,
本文指導如何驗收基於 Docker 的開發環境,檢查 Laravel 後端、Nuxt 前端、Nginx 反向代理和 MariaDB 資料庫是否正常運行。透過啟動容器、修改 hosts 檔案、測試各服務的運作,確保整個開發環境穩定。並且提供了常見問題的解決方案,幫助開發者順利驗收環境。
本文詳細介紹了如何使用 Docker 環境構建 Laravel 後端和 Nuxt 前端,並通過 Nginx 進行反向代理來協調它們的互動。從 docker-compose.yml 配置到各個服務的設定,讓開發環境穩定運行,並提供了常用的 Docker 指令以便於操作。
好了,到了這個階段,我們終於要進入 Docker 的世界了!前幾篇文章我們討論了系統規劃與需求,現在來到實作的部分,要為整個開發環境打好基礎。這篇文章將帶你一步步打造出一個基於 Docker 的開發環境,裡面包含了 Laravel(後端)、Nuxt(前端)、Nginx(伺服器),以及 MariaDB
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
獨自開發並不等於掌握所有技術,而是具備解決問題和完成專案的能力。透過選擇實用且具挑戰性的專題,如個人財務管理系統,開發者可以快速實現最小可行性產品(MVP)。本文將探討如何從前端或後端開始,搭建核心功能並優化系統,以提升用戶體驗,並持續學習和成長。
你可能也想看
Google News 追蹤
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
財務的自律 對多數人來說會帶來安全感與幸福感 以前太無聊有整理做過簡報 轉成文字檔步驟如下: (內有財務管理相關理論作支撐) (以個人來說3萬是一個月的預備金) 1.緊急預備金6個月(沒什麼好說)預防主業失業 2.彈性預備金1個月(提高積極性)確保生活彈性 (損失填補原則)減少小型
Thumbnail
這篇文章是《用生活常識就能看懂財務報表》的書摘,講解了財務報表中的損益表、資產負債表和現金流量表的基本結構和分析觀念,以及如何透過會計師查核意見和報告類型來理解公司的財務狀況。另外也提供了對於損益表和資產負債表中各個科目的解說和分析觀念,以及相關財報分析的指引。
Thumbnail
瞭解何謂健全的財務,包括建立真正的財務系統,十大步驟打造健全的財務系統。
與客戶接觸流程 依潛在客戶蒐集名單 信件或電話介紹推銷自己 取得同意需求面談 (1)引導認知理財規劃重要性 (2)客戶想要的服務與能提供的服務 (3)需求分析TOPS:T(Trust)、O(Oppotunity)、P(Pain,減輕痛苦)、S(Solutin) 蒐集資訊、目標與期望 蒐集客
Thumbnail
這篇文章闡述了財務管理流程的重要性,以及涵蓋財務管理流程的主要步驟,包括總帳會計管理、收入紀錄、支出管理、應收帳款管理、應付帳款管理、預算與資金預估管理、固定資產管理、現金管理、稅務管理、財務分析與報告,內部審計與合規管理以及法律合規與憑證管理等。
Thumbnail
資產配置第一步:每月資產盤點 + 每月收支紀錄(記帳) 資產配置第二步:做好風險管理 所謂的風險管理,就是當發生意外的時候,可以有備援金可作使用。不論是用在自己身上,或是用在家人身上,都是很大的幫助。
Thumbnail
個人財務管理App(PFM)已成為許多人管理日常財務的重要工具。這些App通過提供實時的資料追蹤、預算設置和財務規劃功能,幫助用戶有效管理其財務狀況。本文將分析個人財務管理App的市場需求、介紹其核心功能,並根據用戶反饋評估應用的實際效用和改進方向。
Thumbnail
開始理財,就像是整理書櫃或整理衣櫃一樣,要把所有物品都盤點清楚後才能開始好好整理。本文介紹了盤點資產、紀錄每月收支、簡單的記帳方法、大筆費用分攤至其他月份、資產盤點與收支記帳之目的不同等精明理財的小技巧。不僅可以幫你有效管理個人財務,也幫你節省記帳的時間。
Thumbnail
對於許多企業而言,試算表是日常業務和決策過程中不可或缺的工具。它們被用於各種目的,從財務預算和盈虧分析到庫存管理和客戶數據記錄。然而,隨著業務的發展和數據量的增加,許多人會發現自己面臨著試算表管理和維護的挑戰,這些挑戰可能妨礙效率、準確性和生產力。 1. 數據管理的繁瑣性 試算表中數據的輸入
Thumbnail
記帳是為了認識自己,了解過去與邁向未來。
Thumbnail
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
財務的自律 對多數人來說會帶來安全感與幸福感 以前太無聊有整理做過簡報 轉成文字檔步驟如下: (內有財務管理相關理論作支撐) (以個人來說3萬是一個月的預備金) 1.緊急預備金6個月(沒什麼好說)預防主業失業 2.彈性預備金1個月(提高積極性)確保生活彈性 (損失填補原則)減少小型
Thumbnail
這篇文章是《用生活常識就能看懂財務報表》的書摘,講解了財務報表中的損益表、資產負債表和現金流量表的基本結構和分析觀念,以及如何透過會計師查核意見和報告類型來理解公司的財務狀況。另外也提供了對於損益表和資產負債表中各個科目的解說和分析觀念,以及相關財報分析的指引。
Thumbnail
瞭解何謂健全的財務,包括建立真正的財務系統,十大步驟打造健全的財務系統。
與客戶接觸流程 依潛在客戶蒐集名單 信件或電話介紹推銷自己 取得同意需求面談 (1)引導認知理財規劃重要性 (2)客戶想要的服務與能提供的服務 (3)需求分析TOPS:T(Trust)、O(Oppotunity)、P(Pain,減輕痛苦)、S(Solutin) 蒐集資訊、目標與期望 蒐集客
Thumbnail
這篇文章闡述了財務管理流程的重要性,以及涵蓋財務管理流程的主要步驟,包括總帳會計管理、收入紀錄、支出管理、應收帳款管理、應付帳款管理、預算與資金預估管理、固定資產管理、現金管理、稅務管理、財務分析與報告,內部審計與合規管理以及法律合規與憑證管理等。
Thumbnail
資產配置第一步:每月資產盤點 + 每月收支紀錄(記帳) 資產配置第二步:做好風險管理 所謂的風險管理,就是當發生意外的時候,可以有備援金可作使用。不論是用在自己身上,或是用在家人身上,都是很大的幫助。
Thumbnail
個人財務管理App(PFM)已成為許多人管理日常財務的重要工具。這些App通過提供實時的資料追蹤、預算設置和財務規劃功能,幫助用戶有效管理其財務狀況。本文將分析個人財務管理App的市場需求、介紹其核心功能,並根據用戶反饋評估應用的實際效用和改進方向。
Thumbnail
開始理財,就像是整理書櫃或整理衣櫃一樣,要把所有物品都盤點清楚後才能開始好好整理。本文介紹了盤點資產、紀錄每月收支、簡單的記帳方法、大筆費用分攤至其他月份、資產盤點與收支記帳之目的不同等精明理財的小技巧。不僅可以幫你有效管理個人財務,也幫你節省記帳的時間。
Thumbnail
對於許多企業而言,試算表是日常業務和決策過程中不可或缺的工具。它們被用於各種目的,從財務預算和盈虧分析到庫存管理和客戶數據記錄。然而,隨著業務的發展和數據量的增加,許多人會發現自己面臨著試算表管理和維護的挑戰,這些挑戰可能妨礙效率、準確性和生產力。 1. 數據管理的繁瑣性 試算表中數據的輸入
Thumbnail
記帳是為了認識自己,了解過去與邁向未來。