mcpField
M
mysql-design

mysql-design

github.com/youlaitechデータ・データベース62102 回インストール4 日前に更新
リポジトリ

mysql-design について

mysql-designは、MySQLのデータベース構造を設計するための規約スキルです。テーブル、フィールド、インデックスを定義する開発者向けに、命名、型、共通フィールド、SQL作成、性能設計をチェックリストとともにまとめています。

主な機能

  1. 01データベース・テーブル・フィールド・インデックスの命名規則
  2. 02用途に応じたフィールド型とデフォルト値の選定
  3. 03共通フィールド・主キー・インデックスの設計
  4. 04安全で一貫したSQLの作成
  5. 05文字セット・エンジン・性能設計の確認

活用シーン

  1. 01新しいテーブルのフィールドと型の計画
  2. 02クエリに応じたインデックス設計
  3. 03SQLとデータベース構造のレビュー

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/youlaitech/youlai-skills --skill mysql-design

インストール後、Claude Code で/mysql-designを入力して読み込まれたか確認します。

詳細

MySQL データベース設計規約

適用条件

  • データベースのテーブル構造を設計する
  • フィールドの型と長さを定義する
  • インデックスを作成する
  • テーブル名とフィールド名を付ける

Part 1: 命名規約

データベース名
規則説明
小文字youlai_admin
アンダースコアで区切るキャメルケースは使用しない
業務プレフィックスyoulai_
テーブル名
種類プレフィックス例
システムテーブルsys_sys_user, sys_role
業務テーブルbiz_biz_order, biz_product
関連テーブルrel_ またはメインテーブルのプレフィックスsys_user_role, rel_user_dept
設定テーブルcfg_cfg_dict, cfg_config
ログテーブルlog_log_login, log_operation
フィールド名
種類規則例
主キーidid
外部キーテーブル名 + _iduser_id, dept_id
名前xxx_nameuser_name, dept_name
状態statusstatus
種類xxx_typemenu_type, log_type
時刻xxx_timecreate_time, login_time
ブール値is_xxxis_deleted, is_enabled
件数xxx_countlogin_count, view_count
並び順sort または order_numsort
インデックス名
種類プレフィックス例
主キーpk_pk_user
ユニークインデックスuk_uk_username
通常のインデックスidx_idx_dept_id
複合インデックスidx_idx_dept_status
全文インデックスft_ft_content

Part 2: フィールド型の規約

主キー
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键'
文字列型
用途型長さ
ユーザー名VARCHAR50
ニックネームVARCHAR50
パスワード(暗号化後)VARCHAR100
電話番号VARCHAR20
メールアドレスVARCHAR100
URLVARCHAR500
タイトルVARCHAR200
概要VARCHAR500
詳細な説明TEXT-
JSON データJSON-
数値型
用途型説明
主キー/IDBIGINT20 桁
外部キーBIGINT関連する主キーと同じ型
数量/件数INT-
金額(最小通貨単位)BIGINT浮動小数点の精度問題を回避
並び順番号INT-
状態TINYINT0/1/2
種類TINYINT列挙値
パーセンテージDECIMAL(5,2)0.00-100.00
時刻型
用途型説明
作成時刻DATETIMEcreate_time
更新時刻DATETIMEupdate_time
日付DATEbirth_date
タイムスタンプBIGINTミリ秒単位
ブール型
`is_deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否删除(0否 1是)'
`is_enabled` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否启用(0否 1是)'

Part 3: 共通フィールド

すべてのテーブルに必須のフィールド
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`create_by` BIGINT UNSIGNED DEFAULT NULL COMMENT '创建人',
`update_by` BIGINT UNSIGNED DEFAULT NULL COMMENT '更新人',
`deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0未删除 1已删除)',
PRIMARY KEY (`id`)
任意のフィールド
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`version` INT NOT NULL DEFAULT 0 COMMENT '乐观锁版本号',
`tenant_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '租户ID',

Part 4: インデックスの規約

インデックスの原則
原則説明
最左プレフィックス複合インデックスはクエリの順序に合わせて作成する
高い選択性区別度の高い列を選択する
数を制限する1 テーブルあたりのインデックスは 5 個以下にする
複合を優先する複合インデックスは複数の単一列インデックスより優先する
必須のインデックス
-- 主键索引
PRIMARY KEY (`id`)

-- 外键索引
INDEX `idx_dept_id` (`dept_id`)

-- 状态索引(常用于筛选)
INDEX `idx_status` (`status`)

-- 创建时间索引(常用于排序)
INDEX `idx_create_time` (`create_time`)

-- 唯一索引(业务唯一字段)
UNIQUE INDEX `uk_username` (`username`)
複合インデックス
-- 组合索引:部门 + 状态
INDEX `idx_dept_status` (`dept_id`, `status`)

-- 组合索引:用户 + 创建时间
INDEX `idx_user_time` (`user_id`, `create_time`)
インデックスで避けること
避けること理由
LIKE '%xxx%'前方一致ではない曖昧検索はインデックスを使用しない
OR 条件インデックスを使用しない場合があるため、UNION に変更する
関数の適用WHERE YEAR(create_time) = 2024 はインデックスを使用しない
型変換文字列と数値の比較では暗黙的な型変換が行われる
NOT INNOT EXISTS または LEFT JOIN ... IS NULL に変更する

Part 5: テーブル設計規約

ユーザーテーブルの例
CREATE TABLE `sys_user` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `username` VARCHAR(50) NOT NULL COMMENT '用户名',
  `password` VARCHAR(100) NOT NULL COMMENT '密码',
  `nickname` VARCHAR(50) NOT NULL COMMENT '昵称',
  `mobile` VARCHAR(20) DEFAULT NULL COMMENT '手机号',
  `email` VARCHAR(100) DEFAULT NULL COMMENT '邮箱',
  `gender` TINYINT NOT NULL DEFAULT 0 COMMENT '性别(0未知 1男 2女)',
  `avatar` VARCHAR(500) DEFAULT NULL COMMENT '头像URL',
  `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1正常 0禁用)',
  `dept_id` BIGINT UNSIGNED DEFAULT NULL COMMENT '部门ID',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  `create_by` BIGINT UNSIGNED DEFAULT NULL COMMENT '创建人',
  `update_by` BIGINT UNSIGNED DEFAULT NULL COMMENT '更新人',
  `deleted` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '删除标志(0未删除 1已删除)',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_username` (`username`),
  INDEX `idx_dept_id` (`dept_id`),
  INDEX `idx_status` (`status`),
  INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';
関連テーブルの例
CREATE TABLE `sys_user_role` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键',
  `user_id` BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
  `role_id` BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE INDEX `uk_user_role` (`user_id`, `role_id`),
  INDEX `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户角色关联表';

Part 6: フィールドのデフォルト値

フィールド型デフォルト値説明
文字列NULL または ''任意項目には NULL を使用する
数値0-
ブール値0 または 1業務に応じて設定する
時刻CURRENT_TIMESTAMP-
外部キーNULL任意の関連項目
NULL と NOT NULL
用途選択
必須フィールドNOT NULL
任意フィールドNULL
外部キー(任意)NULL
状態フィールドNOT NULL DEFAULT 1

Part 7: 文字セットとエンジン

文字セット
DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
設定説明
utf8mb44 バイト文字(絵文字)をサポートする
utf8mb4_unicode_ci大文字と小文字を区別せずにソートする
ストレージエンジン
ENGINE=InnoDB
エンジン適用場面
InnoDBトランザクション、外部キー、行ロック
MyISAM読み取り専用、全文インデックス(旧バージョン)
Memory一時テーブル、キャッシュ

Part 8: SQL の記述規約

SELECT
-- ✅ 指定字段
SELECT id, username, nickname FROM sys_user WHERE status = 1;

-- ❌ 避免 SELECT *
SELECT * FROM sys_user;

-- ✅ 分页查询
SELECT id, username FROM sys_user WHERE status = 1 LIMIT 0, 20;

-- ✅ 批量插入
INSERT INTO sys_user (username, nickname) VALUES ('user1', '用户1'), ('user2', '用户2');
UPDATE
-- ✅ 带 WHERE 条件
UPDATE sys_user SET nickname = '新昵称' WHERE id = 1;

-- ✅ 乐观锁
UPDATE sys_user SET nickname = '新昵称', version = version + 1 WHERE id = 1 AND version = 1;

-- ❌ 避免全表更新
UPDATE sys_user SET status = 0;
DELETE
-- ✅ 逻辑删除
UPDATE sys_user SET deleted = 1 WHERE id = 1;

-- ✅ 物理删除(慎用)
DELETE FROM sys_user_role WHERE user_id = 1;

Part 9: パフォーマンス最適化

クエリの最適化
最適化項目説明
SELECT * を避ける必要なフィールドのみを検索する
LIKE '%xxx%' を避けるLIKE 'xxx%' または全文インデックスを使用する
大きな OFFSET を避けるLIMIT 10000, 20 はカーソルページネーションに変更する
COUNT(*) を避ける大規模テーブルではキャッシュまたは推定値を使用する
バッチ処理1 件ずつのループ処理の代わりに一括挿入/更新を行う
テーブル設計の最適化
最適化項目説明
垂直分割大きなフィールドを拡張テーブルに分割する
水平分割大規模テーブルをルールに基づいて分割する
適度な冗長化関連クエリを減らす
履歴データのアーカイブアクセス頻度の低いデータを移行する

Part 10: 設計チェックリスト

  • テーブル名に小文字とアンダースコアを使用する
  • フィールド名に小文字とアンダースコアを使用する
  • 主キーに BIGINT AUTO_INCREMENT を使用する
  • 共通フィールド(create_time, update_time, deleted)を含める
  • 外部キーフィールドにインデックスを追加する
  • 一意な業務フィールドにユニークインデックスを追加する
  • 状態フィールドにインデックスを追加する
  • utf8mb4 文字セットを使用する
  • InnoDB エンジンを使用する
  • 各フィールドに COMMENT を追加する
  • テーブルに COMMENT を追加する
  • インデックスの数を 5 個以下にする

コメント