哈囉,各位!我們已經搭建好了開發環境,也處理好了版本控制。現在,是時候來設計我們的資料庫了。這一步可不能馬虎,因為資料庫就像是系統的心臟,設計得好,才能讓整個系統順暢運作。
在開始之前,讓我們重新整理一下我們的系統需求:
根據需求,我們需要設計以下資料表:
用途:儲存使用者的基本資訊,處理登入、註冊和驗證。
欄位設計:
建表語法:
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
);
設計原因:
用途:管理使用者的銀行帳戶。
欄位設計:
建表語法:
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
);
設計原因:
用途:管理財務紀錄的分類。
欄位設計:
建表語法:
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
);
設計原因:
用途:記錄每一筆財務交易。
欄位設計:
建表語法:
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
);
設計原因:
以下是根據你提供的文字描述生成的完整 E-R 圖。這張 E-R 圖展示了 users、bank_accounts、categories 和 transactions 之間的關聯,並且清晰表示了每個實體之間的多對一或一對多的關係。
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:表示分類標記交易。
假設一個使用者張三,使用我們的系統進行以下操作:
我們詳細設計了個人財務管理系統的資料庫結構,涵蓋了使用者管理、銀行帳戶管理、財務紀錄管理和分類管理等核心功能。
良好的資料庫設計是系統開發的基石,它直接影響到系統的性能、擴充性和維護成本。透過清晰的關聯關係和資料完整性約束,我們能確保資料的一致性和可靠性,為後續的應用開發奠定了堅實的基礎。
接下來,我們將在 Laravel 中實現這些資料表,並開發相應的後端 API,讓我們的系統從設計走向實際應用。這將使我們能夠更好地服務使用者,提供可靠的個人財務管理工具。
下一篇,我們將在 Laravel 中進行相關的實作!