本文作為「桌面中心」系列首篇,記錄MySQL數據庫建表腳本,創建5張結構相同的表(jpg至jpg4)分別存儲5類桌面壁紙數據,每表包含13字段存放4組圖片URL、縮圖、說明及主鍵ID。
-- 登入MySQL後執行:
CREATE TABLE jpg (
id INT(8) NOT NULL AUTO_INCREMENT,
url CHAR(255) NOT NULL,
mess CHAR(100) NOT NULL,
fromx CHAR(50) NOT NULL,
url1 CHAR(255) NOT NULL,
mess1 CHAR(100) NOT NULL,
fromx1 CHAR(50) NOT NULL,
url2 CHAR(255) NOT NULL,
mess2 CHAR(100) NOT NULL,
fromx2 CHAR(50) NOT NULL,
url3 CHAR(255) NOT NULL,
mess3 CHAR(100) NOT NULL,
fromx3 CHAR(50) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE jpg1 ( ... 結構同jpg ... );
CREATE TABLE jpg2 ( ... 結構同jpg ... );
CREATE TABLE jpg3 ( ... 結構同jpg ... );
CREATE TABLE jpg4 ( ... 結構同jpg ... );
CHAR定長存儲,早期MyISAM引擎下查詢較快,但浪費空間| 缺陷 | 影響 | 重構方案 |
|---|---|---|
| 重複表結構 | DDL維護噩夢,修改結構需執行5次 | 單表wallpapers+category_id外鍵 |
| 橫向冗餘字段 | 第5組圖片需ALTER TABLE,第N組同理 | 一圖一行:image_url, thumb_url, description |
| CHAR定長浪費 | 存儲空間膨脹,CHAR(255)實佔255字節 | VARCHAR(255)或TEXT按實際長度存儲 |
| 無外鍵約束 | 類別完整性無保障 | 建立categories表,外鍵關聯 |
| 無時間戳 | 無法排序/審計/清理舊數據 | 添加created_at、updated_at |
| 無索引優化 | 按類別/時間查詢全表掃描 | 組合索引(category_id, created_at) |
CREATE TABLE categories (
id TINYINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL UNIQUE,
slug VARCHAR(20) NOT NULL UNIQUE, -- url友好標識
sort_order TINYINT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT INTO categories (name, slug) VALUES
('水彩畫', 'watercolor'),
('明星寫真', 'celebrity'),
('動漫桌布', 'anime'),
('廣告創意', 'advertising'),
('其他', 'others');
CREATE TABLE wallpapers (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
category_id TINYINT UNSIGNED NOT NULL,
image_url VARCHAR(500) NOT NULL,
thumb_url VARCHAR(500) NOT NULL,
description VARCHAR(500),
width SMALLINT UNSIGNED,
height SMALLINT UNSIGNED,
file_size INT UNSIGNED,
mime_type VARCHAR(50),
status TINYINT DEFAULT 1, -- 1正常 0隱藏
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES categories(id),
INDEX idx_cat_time (category_id, created_at),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
UNION ALL導入新表(轉換category_id)WHERE category_id = ?)此初始設計雖滿足當時「快速上線」需求,但違反範式、擴展性極差。現代系統設計應優先考慮數據模型的正規化、可擴展性與維護性,避免「為了省幾個JOIN而犧牲架構靈活性」。