表结构设计
- 商品表:
- 垂直拆分:将商品的基本信息(如商品ID、名称、描述、价格等经常查询的字段)放在一个主表中。对于不常用的详细描述、商品图片路径等大字段,可以拆分到单独的扩展表中,通过商品ID关联。这样可以减少主表的冗余,提高查询性能,特别是在数据量增大时。例如:
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
short_description TEXT
);
CREATE TABLE product_extensions (
product_id INT,
detailed_description TEXT,
image_path VARCHAR(255),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
- 水平拆分:当商品种类过多时,可以按照商品类别进行水平分区。比如按照电子产品、服装、食品等类别分别创建表,每个表的结构类似,但数据根据类别隔离。例如:
CREATE TABLE electronics_products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
short_description TEXT
);
CREATE TABLE clothing_products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
short_description TEXT
);
- 订单表:
- 订单主从结构:订单主表记录订单的关键信息,如订单ID、用户ID、下单时间、订单状态等。订单详情表记录订单中具体商品的信息,包括商品ID、数量、单价等,通过订单ID关联。这样可以避免订单主表数据冗余,并且在查询订单总体信息时效率更高。例如:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
order_status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
);
CREATE TABLE order_items (
order_item_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
- 按时间分区:随着订单数量的不断增加,按时间(如按月、按季度)对订单表进行分区。这样可以方便对历史订单进行归档和清理,同时查询近期订单时可以快速定位数据,提高查询性能。例如,按月份分区:
CREATE TABLE orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
order_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
order_status ENUM('pending', 'paid', 'shipped', 'completed', 'cancelled') NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(user_id)
) PARTITION BY RANGE (YEAR(order_time) * 100 + MONTH(order_time)) (
PARTITION p0 VALUES LESS THAN (202301),
PARTITION p1 VALUES LESS THAN (202302),
PARTITION p2 VALUES LESS THAN (202303),
-- 依此类推
);
字段类型选择
- 数字类型:
- 商品价格:使用
DECIMAL
类型,如DECIMAL(10, 2)
。DECIMAL
类型可以精确表示小数,适合货币计算,避免浮点数在计算时可能出现的精度问题。
- 商品数量、订单数量等:使用
INT
类型。如果预计数量不会太大,INT
类型足以满足需求,并且占用空间较小,查询效率高。如果预计数量非常大,可以考虑使用BIGINT
类型。
- 字符串类型:
- 商品名称:使用
VARCHAR
类型,根据实际需求设置合适的长度,如VARCHAR(255)
。VARCHAR
类型长度可变,能有效节省空间,适合存储长度不固定的字符串。
- 商品描述:对于较短的描述可以使用
TEXT
类型,如果描述非常长,可使用LONGTEXT
类型。但要注意,大文本类型可能会影响查询性能,尽量避免在经常查询的字段中使用大文本类型。
- 日期和时间类型:
- 订单时间、商品上架时间等:使用
TIMESTAMP
类型,TIMESTAMP
类型占用空间小,并且能自动记录当前时间,方便记录数据的时间戳。如果需要记录历史时间且涉及跨时区问题,可以考虑使用DATETIME
类型,DATETIME
类型能表示更大范围的时间且与时区无关。
其他策略
- 索引设计:
- 在商品表的常用查询字段(如商品ID、商品名称等)上创建索引。例如,在商品名称上创建普通索引:
CREATE INDEX idx_product_name ON products(product_name);
- 在订单表的查询频繁字段(如订单ID、用户ID、订单状态等)上创建索引。特别是在多表关联查询时,索引能显著提高查询效率。例如,在订单表的用户ID字段上创建索引:
CREATE INDEX idx_user_id ON orders(user_id);
- 预留字段:在表设计时,可以预留一些字段,如
extra_info
,数据类型可以是JSON
。这样在未来业务需求变化时,可以灵活地存储一些额外信息,而不需要频繁修改表结构。例如:
CREATE TABLE products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(255) NOT NULL,
price DECIMAL(10, 2) NOT NULL,
short_description TEXT,
extra_info JSON
);