一、通用操作規範
- 主鍵預設:無特殊說明時,第一欄 `id` 為 `BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT`。
- 數值無符號:無特殊說明時,所有數值型欄位加 `UNSIGNED`。
- 排序預設降序:排序欄位 `order_id` 程式端預設 `DESC`。
- 拒絕 NULL:所有欄位 `NOT NULL` 並給預設值(數值 0、字串 ''、時間 `CURRENT_TIMESTAMP`、布林 0)。
- 布林欄位預設 0:`is_xxx`、`has_xxx`、`deleted` 等 `TINYINT(1) NOT NULL DEFAULT 0`。
- 數字欄位預設 0:`count`、`price`、`status` 等 `NOT NULL DEFAULT 0`。
- VARCHAR 長度驗證:應用層必須攔截超長輸入,避免資料庫報錯。
- 欄位註釋:建表時將中文名、業務含義寫入 `COMMENT`(PK/自增除外)。
- 引擎統一 InnoDB:無特殊說明一律 `ENGINE=InnoDB`。
二、表命名慣例
| 規則 | 說明 | 正例 | 反例 |
| 前綴 | 專案名縮寫小寫,如 `mall_` `cms_` | `mall_user` | `User` `t_user` |
| 單詞分隔 | 下劃線 `_` | `order_item` | `orderItem` `orderitem` |
| 單數形式 | 表名用單數,表達實體集合 | `category` `article` | `categories` `articles` |
| 業務語義 | 見名知意,避免縮寫 | `goods_gallery` `site_config` | `gg` `sc` `t1` |
常用核心表名對照表
user -- 用戶
category -- 分類
goods -- 商品/產品(通用名)
goods_gallery -- 商品相冊
goods_cate -- 商品分類關聯(分類縮寫 cate)
attr -- 屬性/規格
article -- 文章/新聞/幫助中心
cart -- 購物車
feedback -- 用戶反饋
order -- 訂單
site_nav -- 站點導航(頁頭/頁尾)
site_config -- 系統配置
admin -- 後台用戶(RBAC)
role -- 角色(RBAC)
access -- 權限/操作節點(RBAC)
role_admin -- 用戶-角色關聯(RBAC)
access_role -- 角色-權限關聯(RBAC)
三、欄位命名慣例
| 欄位模式 | 語義 | 型別建議 | 範例 |
| `{table}_id` | 外鍵關聯主表主鍵 | `BIGINT UNSIGNED` | `user_id` `goods_id` |
| `cid` | 層級編碼(主分類 11,子分類 1101) | `VARCHAR(10)` | 支持無限級分類查詢 |
| `add_time` | 建立/上架時間 | `DATETIME` / `TIMESTAMP` | |
| `last_time` | 最後操作時間(登入/修改) | `DATETIME` | |
| `expire_time` | 過期/失效時間 | `DATETIME` | |
| `name` | 實體名稱(商品/商家/用戶) | `VARCHAR(50~100)` | 區別於 `title` |
| `title` | 文章標題、職稱等 | `VARCHAR(100~200)` | |
| `price` | 價格(分為單位,避免浮點) | `INT UNSIGNED` | 9999 = 99.99 元 |
| `thumb` | 列表縮略圖 URL | `VARCHAR(255)` | 統一命名,禁 `img_url` `thumb_url` |
| `image_src` | 相冊大圖 URL | `VARCHAR(255)` | |
| `head_thumb` | 用戶頭像 | `VARCHAR(255)` | 雖長但語義明確 |
| `image_alt` | 圖片 alt 屬性 | `VARCHAR(100)` | |
| `desc` | 簡介/描述(短文本) | `VARCHAR(500)` | 禁 `txt` `content` 混用 |
| `details` | 詳情/正文(長文本) | `TEXT` / `LONGTEXT` | |
| `order_id` | 排序權重 | `INT UNSIGNED` | 越大越靠前 |
| `telephone` | 座機號碼 | `VARCHAR(20)` | |
| `mobile` | 手機號碼 | `VARCHAR(20)` | |
| `phone` | 不區分座機/手機時 | `VARCHAR(20)` | |
| `address` | 詳細地址 | `VARCHAR(255)` | 組合場景用 `addr` 縮寫 |
| `zipcode` | 郵政編碼 | `CHAR(6)` | |
| `region` | 大區域(市級) | `VARCHAR(50)` | 杭州市、溫州市 |
| `area` | 小區域(區/縣級) | `VARCHAR(50)` | 上城區、江干區 |
| `avg_cost` | 人均消費(分) | `INT UNSIGNED` | |
四、表結構設計範例:分類表
CREATE TABLE `category` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '流水號 PK',
`cid` VARCHAR(4) NOT NULL DEFAULT '' COMMENT '層級編碼:主分類11,子分類1101',
`name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '名稱,前端限制≤10字',
`pid` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '父分類ID,0為頂級',
`count` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '統計量:商品數/文章數',
`is_hot` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否熱門:首頁展示',
`is_index` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否首頁展示',
`order_id` INT(10) UNSIGNED NOT NULL DEFAULT 0 COMMENT '排序權重,越大越前',
PRIMARY KEY (`id`),
KEY `idx_pid` (`pid`),
KEY `idx_cid` (`cid`),
KEY `idx_hot_index` (`is_hot`, `is_index`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='分類表';
五、索引設計原則
- **主鍵必建**:單調遞增(自增/雪花 ID),避免 UUID 導致頁分裂。
- **外鍵欄位建索引**:`user_id`、`goods_id`、`pid` 等關聯查詢高頻欄位。
- **複合索引遵循最左前綴**:`WHERE a=1 AND b=2 ORDER BY c` → `INDEX(a,b,c)`。
- **區分度低欄位不建單列索引**:`sex`、`status`(0/1)、`is_deleted`,改用複合索引。
- **覆蓋索引優化**:`SELECT id, name FROM user WHERE status=1` → `INDEX(status, id, name)` 避免回表。
- **定期 `ANALYZE TABLE` 更新統計資訊**,防止優化器誤判。
六、避坑清單
- [ ] 禁用 `TEXT`/`BLOB` 做索引前綴(`INDEX desc(100)`),改用 `VARCHAR` 或全文索引。
- [ ] 禁用 `ENUM`/`SET`,擴充需 `ALTER TABLE` 鎖表,改用 `TINYINT` + 字典表。
- [ ] 禁用外鍵約束(應用層維護關聯),高併發下鎖衝突嚴重,改用軟刪除 `deleted=1`。
- [ ] 大表禁止 `COUNT(*)`,維護計數表或用 `EXPLAIN` 估算行數。
- [ ] 分表分庫鍵選擇:業務隔離度高、查詢可路由、避免跨分片事務。
總結
統一命名規範是團隊協作效率的基石。本文提供的「操作規範、表名/欄位慣例、設計範例、索引原則、避坑清單」可直接作為專案《資料庫設計規約》附件。落地關鍵在於:**Code Review 強制檢查、CI/CD 集成 `sqlfluff`/`pt-table-check` 靜態掃描、新人入職必讀考核**。