MySQL数据库表设计案例
需求分析
在设计MySQL数据库表时,首先需要进行详细的需求分析,以一个电子商务网站为例,其基本功能包括在线购物,涉及前台用户选购和后台管理操作,具体需求如下:
商品分类:支持多级分类。
商品信息:包含名称、价格、库存等。
用户信息:用户名、密码、地址、手机号等。
订单信息:订单编号、下单时间、支付时间、订单状态等。
评论信息:用户对商品的评论。
准备工作
1、创建数据库:在MySQL中创建一个名为shop
的数据库。
“`sql
CREATE DATABASE shop;
USE shop;
“`
2、数据表命名规范:为所有数据表加上前缀sh_
,例如商品表命名为sh_goods
。
3、安全性考虑:避免SQL注入,对用户输入进行转义或使用预处理语句。
表结构设计
1. 商品分类表(sh_goods_category)
字段名 | 类型 | 约束 | 说明 |
id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 分类ID |
parent_id | INT UNSIGNED | ON DELETE SET NULL | 上级分类ID |
name | VARCHAR(100) | NOT NULL | 分类名称 |
sort_order | INT | NOT NULL | 排序权重 |
is_display | TINYINT | NOT NULL DEFAULT 1 | 是否显示(0:不显示,1:显示) |
create_time | INT | NOT NULL | 创建时间戳 |
update_time | INT | NOT NULL | 更新时间戳 |
2. 商品表(sh_goods)
字段名 | 类型 | 约束 | 说明 |
id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 商品ID |
category_id | INT UNSIGNED | NOT NULL | 分类ID |
name | VARCHAR(100) | NOT NULL | 商品名称 |
price | DECIMAL(10,2) | NOT NULL | 价格 |
stock | INT | NOT NULL | 库存 |
description | TEXT | 商品描述 | |
create_time | INT | NOT NULL | 创建时间戳 |
update_time | INT | NOT NULL | 更新时间戳 |
3. 用户表(sh_user)
字段名 | 类型 | 约束 | 说明 |
id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 用户ID |
username | VARCHAR(50) | NOT NULL UNIQUE | 用户名 |
password | VARCHAR(255) | NOT NULL | 密码(通常存储哈希值) |
VARCHAR(100) | NOT NULL UNIQUE | 邮箱地址 | |
phone | VARCHAR(20) | 手机号码 | |
address | VARCHAR(255) | 地址 | |
create_time | INT | NOT NULL | 创建时间戳 |
update_time | INT | NOT NULL | 更新时间戳 |
4. 订单表(sh_order)
字段名 | 类型 | 约束 | 说明 |
id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 订单ID |
user_id | INT UNSIGNED | NOT NULL | 用户ID |
order_time | INT | NOT NULL | 下单时间戳 |
payment_time | INT | 支付时间戳 | |
total_amount | DECIMAL(10,2) | NOT NULL | 总金额 |
status | TINYINT | NOT NULL | 订单状态(0:未支付,1:已支付,2:已取消) |
create_time | INT | NOT NULL | 创建时间戳 |
update_time | INT | NOT NULL | 更新时间戳 |
5. 评论表(sh_comment)
字段名 | 类型 | 约束 | 说明 |
id | INT UNSIGNED | PRIMARY KEY AUTO_INCREMENT | 评论ID |
user_id | INT UNSIGNED | NOT NULL | 用户ID |
goods_id | INT UNSIGNED | NOT NULL | 商品ID |
content | TEXT | NOT NULL | 评论内容 |
rating | TINYINT | NOT NULL | 评分(15) |
create_time | INT | NOT NULL | 创建时间戳 |
update_time | INT | NOT NULL | 更新时间戳 |
外键关系
1、商品分类表与商品表:sh_goods.category_id
FOREIGN KEY (category_id
) REFERENCESsh_goods_category.id
。
2、用户表与订单表:sh_order.user_id
FOREIGN KEY (user_id
) REFERENCESsh_user.id
。
3、用户表与评论表:sh_comment.user_id
FOREIGN KEY (user_id
) REFERENCESsh_user.id
。
4、商品表与评论表:sh_comment.goods_id
FOREIGN KEY (goods_id
) REFERENCESsh_goods.id
。
常见问题解答
Q1: 为什么选择使用时间戳而不是DATETIME类型来存储时间?
A1: 应用程序习惯使用时间戳来保存时间,直接保存为INT类型会更加方便,并且节省存储空间,时间戳便于跨时区转换和统一处理。
Q2: 如何优化查询性能?
A2: 可以通过以下几种方式优化查询性能:
1、索引优化:为经常查询的字段添加索引。
2、分页查询:对于大量数据的分页查询,使用LIMIT和OFFSET。
3、缓存技术:利用Memcached或Redis缓存热点数据,减少数据库查询次数。
4、分区表:对于非常大的表,可以使用分区表提高查询效率。
5、**避免SELECT *】:只查询需要的字段,避免使用SELECT *。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1097672.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复