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 中進行相關的實作!


留言
avatar-img
留言分享你的想法!
avatar-img
詹姆士的軟體易開罐
27會員
88內容數
這是一系列以軟體開發為主題的輕鬆分享,內容涵蓋了技術選擇、開發經驗、實戰應用等多方面的議題。無論是如何在眾多框架中做出選擇,還是如何應對技術轉移的挑戰,這裡有幽默、有趣的對話風格,將複雜的技術問題轉化為易懂的故事。
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/22
這是我第一次參加 iThome 鐵人賽,原本並沒有打算參加,但在整理專案時,我忽然想把屬於自己的內容公開分享,而不僅僅藏在雲端裡。於是,我獨自規劃、撰寫並完成了一個完整的開發系列文章。在這段過程中,我體會到獨自開發的挑戰與成就,並希望能將這些經驗分享給每一位正在努力前行的你。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/15
這篇文章介紹建立分類列表頁面以及新增和編輯功能。文中詳細說明瞭頁面結構、資料取得、錯誤處理等重要步驟,並強調了共用元件和資料驗證的一致性。通過這次開發,讀者將獲得關於如何在Nuxt中操作動態路由的深入理解,同時提高使用者體驗。希望本篇能幫助讀者順利完成相關功能建置。
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
2024/12/14
哈囉,大家好!在前面的文章中,我們已經規劃了前端介面,並盤點了所需的頁面與功能。 現在,是時候開始動手實作了。今天,我們將專注於 銀行帳戶列表頁面(Bank Accounts)以及 新增/編輯銀行帳戶頁面(Add/Edit Bank Account)的開發。 透過這次的實作,我們將學習如何在 N
Thumbnail
看更多
你可能也想看
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
家中修繕或裝潢想要找各種小零件時,直接上網採買可以省去不少煩惱~看看Sylvia這回為了工地買了些什麼吧~
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
👜簡單生活,從整理包包開始!我的三款愛用包+隨身小物清單開箱,一起來看看我每天都帶些什麼吧🌿✨
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
如何打造屬於你的專屬理財系統 不少人都希望擁有健康的財務狀況,但理財不是單靠記帳或存錢就能完成的。真正高效的理財,需要一套專屬的系統來管理和優化你的財務。不論是月薪族、自由工作者,還是學生,只要掌握了這幾個步驟,都能打造屬於自己的理財系統,讓金錢為你服務! 1. 記帳:理財的起點 如果
Thumbnail
如何打造屬於你的專屬理財系統 不少人都希望擁有健康的財務狀況,但理財不是單靠記帳或存錢就能完成的。真正高效的理財,需要一套專屬的系統來管理和優化你的財務。不論是月薪族、自由工作者,還是學生,只要掌握了這幾個步驟,都能打造屬於自己的理財系統,讓金錢為你服務! 1. 記帳:理財的起點 如果
Thumbnail
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
Thumbnail
本文介紹了如何在 Laravel 中實作控制器,為個人財務管理系統建立完整的 CRUD API。我們實現了資料的建立、查詢、更新和刪除,並使用資料驗證提升應用安全性。未來將進行程式碼重構及 API 測試,持續優化應用程式。
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
這篇文章介紹了個人財務管理系統的資料庫設計,涵蓋使用者管理、銀行帳戶管理、財務紀錄和分類管理的核心功能。系統需求包括註冊登入、帳戶管理、財務記錄分類和報表生成。設計了四個資料表,並詳細說明其欄位設計和建表語法。透過清晰的表關聯,確保資料一致性和系統擴展性,為後續的 Laravel 開發打下基礎。
Thumbnail
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
Thumbnail
這篇文章深入探討了開發個人財務管理系統的規劃過程,包括需求確認、環境建置及技術選型等關鍵步驟。作者強調在開發前進行充分的規劃與設計是成功的基礎,並提供了具體的工具與技術選擇,如PHP、Laravel和Docker。通過清晰的步驟指引,文章幫助讀者掌握系統開發的核心要素,確保順利推進專案。
Thumbnail
本文介紹了理解和解讀報表的基礎、趨勢和行動建議三個步驟。透過這三步驟,可以更好地理解和利用數據,做出明智的決策,達到更高的財務管理效率和效果。
Thumbnail
本文介紹了理解和解讀報表的基礎、趨勢和行動建議三個步驟。透過這三步驟,可以更好地理解和利用數據,做出明智的決策,達到更高的財務管理效率和效果。
Thumbnail
總帳和分類帳是企業會計系統中不可或缺的兩個組成部分,它們之間存在著密切的聯繫,共同構成了企業的完整會計系統。本文深入解析了總帳和分類帳的功能、記錄方式、優勢以及它們之間的聯繫,有助於讀者更全面地瞭解這兩個重要會計概念。
Thumbnail
總帳和分類帳是企業會計系統中不可或缺的兩個組成部分,它們之間存在著密切的聯繫,共同構成了企業的完整會計系統。本文深入解析了總帳和分類帳的功能、記錄方式、優勢以及它們之間的聯繫,有助於讀者更全面地瞭解這兩個重要會計概念。
Thumbnail
每個人當熟悉某些工作內容後,通常會發展出一套更有效率的作法。在會計處理上,也是如此,其中工作底稿正是統整試算、調整與編表的完美工具。
Thumbnail
每個人當熟悉某些工作內容後,通常會發展出一套更有效率的作法。在會計處理上,也是如此,其中工作底稿正是統整試算、調整與編表的完美工具。
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
寫在前面:如果您是透過會計系統產生申報媒體檔案的,可以跳過這一篇,直接進行:A.7網路申報上傳 上一篇有提到,各類所得申報的最基本的資料內容,需要包含: 1.申報單位資料 2.單位內的所得人(公司付錢的對象)資料 3.給付的所得項目(EX:薪資)、金額 點選進入後,我們可以看到資料建置畫面;
Thumbnail
花點時間製作屬於自己的財務報表,絕對比使用記帳來的好。假如大家都能認同記帳的是有用的,可以提醒自己不要花過頭!那將自己記帳的程度提昇至製作個人財務報表,絕對是改善財務,邁向財務自由的第一步!
Thumbnail
花點時間製作屬於自己的財務報表,絕對比使用記帳來的好。假如大家都能認同記帳的是有用的,可以提醒自己不要花過頭!那將自己記帳的程度提昇至製作個人財務報表,絕對是改善財務,邁向財務自由的第一步!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News