1. 特点:
可直接使用,无需注册账号
无状态的纯前端工具,数据会存放在浏览器中。设计完成后可将数据保存到本地
2. 使用场景:
描述E-R图,对数据库表关系进行直观分析
3. 效果:
4. 测试数据
用来测试的建表sql:
- users - 用户表:存储用户信息。
- product_categories - 商品分类表:存储商品的分类信息。
- products - 商品表:存储商品详细信息,并关联到商品分类。
- orders - 订单表:记录用户的订单摘要信息。
- order_items - 订单项目表:一个“连接表”,用于实现订单和商品之间的多对多关系。
- product_reviews - 商品评论表:用户可以对购买过的商品进行评论。
-- 设置默认的存储引擎为 InnoDB,并使用 utf8mb4 字符集以支持各种字符,包括 Emoji
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- 1. 用户表 (users)
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '用户ID',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`email` VARCHAR(100) NOT NULL COMMENT '电子邮箱',`password_hash` VARCHAR(255) NOT NULL COMMENT '哈希后的密码',`full_name` VARCHAR(100) NULL COMMENT '用户全名',`registration_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '注册时间',`last_login` DATETIME NULL COMMENT '最后登录时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_username` (`username`),UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';-- ----------------------------
-- 2. 商品分类表 (product_categories)
-- ----------------------------
DROP TABLE IF EXISTS `product_categories`;
CREATE TABLE `product_categories` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '分类ID',`name` VARCHAR(100) NOT NULL COMMENT '分类名称',`parent_id` INT UNSIGNED NULL COMMENT '父分类ID,用于实现多级分类',`description` TEXT NULL COMMENT '分类描述',PRIMARY KEY (`id`),UNIQUE KEY `uk_name` (`name`),KEY `idx_parent_id` (`parent_id`),CONSTRAINT `fk_parent_category` FOREIGN KEY (`parent_id`) REFERENCES `product_categories` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品分类表';-- ----------------------------
-- 3. 商品表 (products)
-- ----------------------------
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '商品ID',`category_id` INT UNSIGNED NOT NULL COMMENT '所属分类ID',`sku` VARCHAR(100) NOT NULL COMMENT '商品SKU (Stock Keeping Unit)',`name` VARCHAR(255) NOT NULL COMMENT '商品名称',`description` TEXT NULL COMMENT '商品详细描述',`price` DECIMAL(10, 2) NOT NULL COMMENT '商品单价',`stock_quantity` INT NOT NULL DEFAULT 0 COMMENT '库存数量',`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_sku` (`sku`),KEY `idx_name` (`name`),CONSTRAINT `fk_product_category` FOREIGN KEY (`category_id`) REFERENCES `product_categories` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品表';-- ----------------------------
-- 4. 订单表 (orders)
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单ID',`user_id` INT UNSIGNED NOT NULL COMMENT '用户ID',`order_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '下单时间',`status` ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled') NOT NULL DEFAULT 'pending' COMMENT '订单状态',`total_amount` DECIMAL(12, 2) NOT NULL COMMENT '订单总金额',`shipping_address` TEXT NOT NULL COMMENT '收货地址',`notes` VARCHAR(500) NULL COMMENT '订单备注',PRIMARY KEY (`id`),KEY `idx_user_id` (`user_id`),KEY `idx_status` (`status`),CONSTRAINT `fk_order_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';-- ----------------------------
-- 5. 订单项目表 (order_items) - 连接表
-- ----------------------------
DROP TABLE IF EXISTS `order_items`;
CREATE TABLE `order_items` (`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '订单项目ID',`order_id` BIGINT UNSIGNED NOT NULL COMMENT '所属订单ID',`product_id` INT UNSIGNED NOT NULL COMMENT '商品ID',`quantity` INT UNSIGNED NOT NULL COMMENT '购买数量',`price_per_unit` DECIMAL(10, 2) NOT NULL COMMENT '购买时的单价 (快照)',PRIMARY KEY (`id`),UNIQUE KEY `uk_order_product` (`order_id`, `product_id`), -- 一个订单中一个商品只能有一条记录CONSTRAINT `fk_item_order` FOREIGN KEY (`order_id`) REFERENCES `orders` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `fk_item_product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单项目表 (多对多连接)';-- ----------------------------
-- 6. 商品评论表 (product_reviews)
-- ----------------------------
DROP TABLE IF EXISTS `product_reviews`;
CREATE TABLE `product_reviews` (`id` INT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '评论ID',`product_id` INT UNSIGNED NOT NULL COMMENT '商品ID',`user_id` INT UNSIGNED NOT NULL COMMENT '用户ID',`rating` TINYINT UNSIGNED NOT NULL COMMENT '评分 (1-5)',`comment` TEXT NULL COMMENT '评论内容',`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '评论时间',PRIMARY KEY (`id`),UNIQUE KEY `uk_user_product_review` (`user_id`, `product_id`), -- 每个用户对一个商品只能评论一次CONSTRAINT `fk_review_product` FOREIGN KEY (`product_id`) REFERENCES `products` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `fk_review_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `chk_rating` CHECK ((`rating` >= 1 and `rating` <= 5)) -- 检查约束,确保评分在1-5之间
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品评论表';SET FOREIGN_KEY_CHECKS = 1;
示例数据sql:
-- 开始插入数据,暂时禁用外键检查,方便按任意顺序插入,最后再开启
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- 1. `users` 表的示例数据
-- ----------------------------
INSERT INTO `users` (`id`, `username`, `email`, `password_hash`, `full_name`, `registration_date`, `last_login`) VALUES
(1, 'alice', 'alice@example.com', 'sha256_hash_value_placeholder_1', 'Alice Smith', '2024-01-15 10:30:00', '2025-07-20 09:15:00'),
(2, 'bob', 'bob@example.com', 'sha256_hash_value_placeholder_2', 'Bob Johnson', '2024-02-20 11:00:00', '2025-07-21 18:30:00'),
(3, 'charlie', 'charlie@example.com', 'sha256_hash_value_placeholder_3', 'Charlie Brown', '2024-03-10 16:45:00', '2025-07-22 14:00:00'),
(4, 'diana', 'diana@example.com', 'sha256_hash_value_placeholder_4', 'Diana Prince', '2024-04-05 20:00:00', '2025-07-19 11:45:00'),
(5, 'ethan', 'ethan@example.com', 'sha256_hash_value_placeholder_5', 'Ethan Hunt', '2024-05-01 12:00:00', NULL);-- ----------------------------
-- 2. `product_categories` 表的示例数据 (包含层级关系)
-- ----------------------------
INSERT INTO `product_categories` (`id`, `name`, `parent_id`, `description`) VALUES
(1, '电子产品', NULL, '所有消费类电子产品'),
(2, '图书音像', NULL, '书籍、音乐和电影'),
(3, '家居生活', NULL, '提升生活品质的家居用品'),
(4, '电脑及配件', 1, '笔记本、台式机以及相关配件'),
(5, '手机通讯', 1, '智能手机和相关配件'),
(6, '科幻小说', 2, '探索未来与宇宙的文学作品');-- ----------------------------
-- 3. `products` 表的示例数据
-- ----------------------------
INSERT INTO `products` (`id`, `category_id`, `sku`, `name`, `description`, `price`, `stock_quantity`, `created_at`, `updated_at`) VALUES
(1, 4, 'COM-LP-MBP16', '16英寸 MacBook Pro', '强大的M4 Pro芯片,适用于专业人士。', 18999.00, 50, '2024-08-01 10:00:00', '2024-08-01 10:00:00'),
(2, 4, 'COM-LP-TPX1', 'ThinkPad X1 Carbon', '超轻薄商务笔记本,性能卓越。', 12500.00, 80, '2024-08-02 11:00:00', '2024-08-02 11:00:00'),
(3, 5, 'CEL-PH-IP16', 'iPhone 16 Pro', '全新的设计,更强的摄像头系统。', 9999.00, 120, '2024-09-15 09:00:00', '2024-09-15 09:00:00'),
(4, 5, 'CEL-PH-PIX9', 'Google Pixel 9', '纯净安卓体验,AI摄影大师。', 6999.00, 150, '2024-10-01 14:00:00', '2024-10-01 14:00:00'),
(5, 6, 'BOK-SF-3BODY', '《三体》全集', '刘慈欣著,中国科幻的里程碑之作。', 98.00, 500, '2024-01-10 16:00:00', '2024-01-10 16:00:00'),
(6, 6, 'BOK-SF-DUNE', '《沙丘》', '弗兰克·赫伯特著,科幻史诗巨著。', 128.00, 300, '2024-02-15 17:00:00', '2024-02-15 17:00:00'),
(7, 3, 'HOM-LT-SMLMP', '智能护眼台灯', '可调节色温和亮度,支持App控制。', 299.00, 200, '2024-06-20 18:00:00', '2024-06-20 18:00:00'),
(8, 3, 'HOM-AP-CFMKR', '全自动咖啡机', '一键制作拿铁、卡布奇诺。', 1599.00, 60, '2024-07-01 11:30:00', '2024-07-01 11:30:00');-- ----------------------------
-- 4. `orders` 表的示例数据 (total_amount 初始为 0, 稍后更新)
-- ----------------------------
INSERT INTO `orders` (`id`, `user_id`, `order_date`, `status`, `total_amount`, `shipping_address`, `notes`) VALUES
(1001, 1, '2025-06-10 14:25:10', 'delivered', 0.00, '上海市浦东新区世纪大道1号', '请尽快发货'),
(1002, 2, '2025-07-15 09:30:05', 'shipped', 0.00, '北京市海淀区中关村南大街1号', '工作日派送'),
(1003, 1, '2025-07-18 20:10:00', 'paid', 0.00, '上海市浦东新区世纪大道1号', NULL),
(1004, 3, '2025-07-20 11:45:30', 'delivered', 0.00, '广东省深圳市南山区科技园路1号', '包裹请放快递柜'),
(1005, 4, '2025-07-24 18:00:00', 'pending', 0.00, '浙江省杭州市余杭区文一西路969号', '需要礼品包装');-- ----------------------------
-- 5. `order_items` 表的示例数据 (连接订单和商品)
-- ----------------------------
INSERT INTO `order_items` (`id`, `order_id`, `product_id`, `quantity`, `price_per_unit`) VALUES
-- 订单 1001 (Alice)
(1, 1001, 1, 1, 18999.00), -- 1x MacBook Pro
(2, 1001, 5, 1, 98.00), -- 1x 《三体》
-- 订单 1002 (Bob)
(3, 1002, 4, 2, 6999.00), -- 2x Pixel 9
(4, 1002, 8, 1, 1599.00), -- 1x 咖啡机
-- 订单 1003 (Alice)
(5, 1003, 7, 1, 299.00), -- 1x 智能台灯
-- 订单 1004 (Charlie)
(6, 1004, 2, 1, 12500.00), -- 1x ThinkPad X1
(7, 1004, 6, 1, 128.00), -- 1x 《沙丘》
-- 订单 1005 (Diana)
(8, 1005, 3, 1, 9999.00); -- 1x iPhone 16 Pro-- ----------------------------
-- 6. `product_reviews` 表的示例数据
-- ----------------------------
INSERT INTO `product_reviews` (`id`, `product_id`, `user_id`, `rating`, `comment`, `created_at`) VALUES
(1, 1, 1, 5, '性能非常强大,屏幕效果惊艳,物超所值!', '2025-06-20 10:00:00'),
(2, 2, 3, 4, '键盘手感一流,非常适合长时间打字。电池续航希望能再好一点。', '2025-07-23 15:00:00'),
(3, 5, 1, 5, '读完之后非常震撼,不愧是神作!', '2025-06-25 19:30:00'),
(4, 8, 2, 3, '咖啡味道还不错,但机器噪音有点大。', '2025-07-22 08:00:00');-- ----------------------------
-- 7. 更新 `orders` 表的 `total_amount`
-- 这是一个非常真实的操作:订单总价由其所有项目的总和决定
-- ----------------------------
UPDATE `orders` o
SET o.total_amount = (SELECT SUM(oi.quantity * oi.price_per_unit)FROM `order_items` oiWHERE oi.order_id = o.id
)
WHERE o.id IN (1001, 1002, 1003, 1004, 1005);-- 重新开启外键检查,确保数据完整性
SET FOREIGN_KEY_CHECKS = 1;
该项目支持在线编辑、修改和导入导出...博主浅浅试了下,感觉功能相当强大,给作者狠狠点赞了👍
大家感兴趣可以去看看,下面是项目地址:
5. 项目地址:
官网地址:https://www.drawdb.app/
Github地址:https://github.com/drawdb-io/drawdb