feat(test/sql): 添加SQL测试相关文件,包括数据库设计、测试脚本和说明文档

添加多个SQL测试文件,包含复杂关联关系的数据库设计、测试脚本和详细说明文档。设计包含一对多、多对多关系,以及相似字段名、表名等迷惑项,用于测试大语言模型的SQL编写能力。包括企业微信用户表、电商系统表、高校教务系统表等不同场景的设计。
This commit is contained in:
dzq 2025-12-25 18:03:05 +08:00
parent 179277f637
commit 20b666e408
12 changed files with 1977 additions and 0 deletions

View File

@ -0,0 +1,3 @@
```
我需要测试大语言模型的写sql能力先帮我设计一个数据库和几张表表之间具有较为复杂的关联关系例如一对多、多对多等。再添加一些迷惑项例如相似的字段名、相似的表名、含义相近的字段等。
```

View File

@ -0,0 +1,225 @@
我来设计一个具有复杂关联关系和迷惑项的电商数据库模型:
## 数据库E-Commerce System
### 表设计(包含迷惑项)
#### 1. 用户相关表
```sql
-- 用户主表(与客户表名称相似,容易混淆)
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone_number VARCHAR(20),
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
status ENUM('active', 'inactive', 'suspended') DEFAULT 'active'
);
-- 客户信息表(与用户表相似,但有不同用途)
CREATE TABLE customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL, -- 外键但名称与users表主键不完全匹配
full_name VARCHAR(100),
birth_date DATE,
registration_date DATE,
customer_type ENUM('individual', 'business', 'vip') DEFAULT 'individual',
FOREIGN KEY (user_id) REFERENCES users(id) -- 故意写错应该是user_id REFERENCES users(user_id)
);
-- 用户地址表
CREATE TABLE user_addresses (
address_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
customer_id INT, -- 冗余字段,增加复杂度
address_line1 VARCHAR(200),
address_line2 VARCHAR(200),
city_id INT,
postal_code VARCHAR(20),
is_default BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
```
#### 2. 商品相关表
```sql
-- 商品表
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_code VARCHAR(50) UNIQUE NOT NULL, -- 与sku相似
product_name VARCHAR(200) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2), -- 与price相似
category_id INT,
supplier_id INT,
stock_quantity INT DEFAULT 0,
reorder_level INT DEFAULT 10,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modified_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 产品表名称与products相似但内容不同
CREATE TABLE items (
item_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
sku VARCHAR(50) UNIQUE, -- 与product_code相似
variant_name VARCHAR(100),
additional_price DECIMAL(10,2) DEFAULT 0,
inventory_count INT DEFAULT 0,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 商品分类表
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(100) NOT NULL,
parent_category_id INT, -- 自引用,实现层级分类
category_path VARCHAR(500),
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)
);
```
#### 3. 订单相关表
```sql
-- 订单主表
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_number VARCHAR(50) UNIQUE NOT NULL,
customer_id INT NOT NULL, -- 注意这里引用customers表不是users表
user_id INT, -- 冗余字段
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
order_status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
total_amount DECIMAL(10,2),
net_amount DECIMAL(10,2), -- 与total_amount相似
shipping_address_id INT,
billing_address_id INT,
payment_method VARCHAR(50)
);
-- 订单项表
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
item_id INT, -- 引用items表
product_id INT, -- 也引用products表增加复杂度
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
discount DECIMAL(10,2) DEFAULT 0,
subtotal DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (item_id) REFERENCES items(item_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
-- 发货表
CREATE TABLE shipments (
shipment_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
shipment_date DATE,
estimated_delivery DATE, -- 与delivery_date相似
actual_delivery DATE, -- 与estimated_delivery相似
carrier VARCHAR(100),
tracking_number VARCHAR(100),
status ENUM('preparing', 'shipped', 'in_transit', 'delivered') DEFAULT 'preparing'
);
```
#### 4. 多对多关系表
```sql
-- 商品-供应商关系(多对多)
CREATE TABLE product_suppliers (
product_id INT NOT NULL,
supplier_id INT NOT NULL,
is_primary BOOLEAN DEFAULT FALSE,
purchase_price DECIMAL(10,2),
PRIMARY KEY (product_id, supplier_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
-- 故意不创建supplier_id的外键约束增加测试难度
);
-- 用户-收藏夹关系(多对多)
CREATE TABLE user_wishlists (
user_id INT NOT NULL,
product_id INT NOT NULL,
added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
priority INT DEFAULT 1,
PRIMARY KEY (user_id, product_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
```
#### 5. 其他相关表(增加迷惑性)
```sql
-- 支付表
CREATE TABLE payments (
payment_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
payment_date DATETIME DEFAULT CURRENT_TIMESTAMP,
amount DECIMAL(10,2),
payment_type VARCHAR(50), -- 与payment_method相似
transaction_id VARCHAR(100),
payment_status ENUM('pending', 'completed', 'failed', 'refunded')
);
-- 评价表
CREATE TABLE reviews (
review_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
user_id INT NOT NULL,
rating INT CHECK (rating >= 1 AND rating <= 5),
comment TEXT,
review_date DATE, -- 与created_at相似但不同
helpful_count INT DEFAULT 0
);
-- 促销表
CREATE TABLE promotions (
promo_id INT PRIMARY KEY AUTO_INCREMENT,
promo_code VARCHAR(50) UNIQUE,
promo_name VARCHAR(100),
discount_type ENUM('percentage', 'fixed', 'buy_one_get_one'),
discount_value DECIMAL(10,2),
start_date DATE,
end_date DATE,
minimum_purchase DECIMAL(10,2)
);
```
### 迷惑项总结:
1. **相似表名**products/items, users/customers
2. **相似字段名**price/cost_price, total_amount/net_amount, estimated_delivery/actual_delivery
3. **含义相近字段**created_date/created_at/created_time, payment_type/payment_method
4. **冗余字段**order_items表中同时有item_id和product_id
5. **不一致的命名**user_id vs customer_id在不同表的引用
6. **缺失的外键**product_suppliers表中的supplier_id没有外键约束
7. **相似的用途不同名**product_code vs sku
8. **同义词字段**stock_quantity vs inventory_count
### 测试查询示例:
```sql
-- 复杂查询1找出每个用户最常购买的商品类别
-- 需要连接users → customers → orders → order_items → products → categories
-- 复杂查询2计算每个供应商的商品在最近一个月的销售额
-- 需要连接product_suppliers → products → order_items → orders
-- 复杂查询3找出有相同商品的用户对社交推荐
-- 需要多对多关系分析users → user_wishlists → products ← user_wishlists ← users
-- 复杂查询4层级分类的商品统计递归查询
-- 需要使用WITH RECURSIVE处理categories表的层级关系
```
这个设计包含了:
- 一对多关系(用户-地址、订单-订单项)
- 多对多关系(用户-收藏夹、商品-供应商)
- 自引用关系(分类层级)
- 复杂的业务逻辑和数据冗余
- 各种迷惑项和陷阱
你可以用这个数据库模型来测试LLM对复杂SQL查询的理解和生成能力。

View File

@ -0,0 +1,155 @@
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
phone_number VARCHAR(20),
created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
status ENUM('active', 'inactive', 'suspended') DEFAULT 'active'
);
CREATE TABLE customers (
customer_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
full_name VARCHAR(100),
birth_date DATE,
registration_date DATE,
customer_type ENUM('individual', 'business', 'vip') DEFAULT 'individual',
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE user_addresses (
address_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
customer_id INT,
address_line1 VARCHAR(200),
address_line2 VARCHAR(200),
city_id INT,
postal_code VARCHAR(20),
is_default BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_code VARCHAR(50) UNIQUE NOT NULL,
product_name VARCHAR(200) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2),
category_id INT,
supplier_id INT,
stock_quantity INT DEFAULT 0,
reorder_level INT DEFAULT 10,
created_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
modified_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE items (
item_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
sku VARCHAR(50) UNIQUE,
variant_name VARCHAR(100),
additional_price DECIMAL(10,2) DEFAULT 0,
inventory_count INT DEFAULT 0,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(100) NOT NULL,
parent_category_id INT,
category_path VARCHAR(500),
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_number VARCHAR(50) UNIQUE NOT NULL,
customer_id INT NOT NULL,
user_id INT,
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
order_status ENUM('pending', 'processing', 'shipped', 'delivered', 'cancelled') DEFAULT 'pending',
total_amount DECIMAL(10,2),
net_amount DECIMAL(10,2),
shipping_address_id INT,
billing_address_id INT,
payment_method VARCHAR(50)
);
CREATE TABLE order_items (
order_item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
item_id INT,
product_id INT,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
discount DECIMAL(10,2) DEFAULT 0,
subtotal DECIMAL(10,2),
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (item_id) REFERENCES items(item_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE shipments (
shipment_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
shipment_date DATE,
estimated_delivery DATE,
actual_delivery DATE,
carrier VARCHAR(100),
tracking_number VARCHAR(100),
status ENUM('preparing', 'shipped', 'in_transit', 'delivered') DEFAULT 'preparing'
);
CREATE TABLE product_suppliers (
product_id INT NOT NULL,
supplier_id INT NOT NULL,
is_primary BOOLEAN DEFAULT FALSE,
purchase_price DECIMAL(10,2),
PRIMARY KEY (product_id, supplier_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE user_wishlists (
user_id INT NOT NULL,
product_id INT NOT NULL,
added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
priority INT DEFAULT 1,
PRIMARY KEY (user_id, product_id),
FOREIGN KEY (user_id) REFERENCES users(user_id),
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
CREATE TABLE payments (
payment_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
payment_date DATETIME DEFAULT CURRENT_TIMESTAMP,
amount DECIMAL(10,2),
payment_type VARCHAR(50),
transaction_id VARCHAR(100),
payment_status ENUM('pending', 'completed', 'failed', 'refunded')
);
CREATE TABLE reviews (
review_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
user_id INT NOT NULL,
rating INT CHECK (rating >= 1 AND rating <= 5),
comment TEXT,
review_date DATE,
helpful_count INT DEFAULT 0
);
CREATE TABLE promotions (
promo_id INT PRIMARY KEY AUTO_INCREMENT,
promo_code VARCHAR(50) UNIQUE,
promo_name VARCHAR(100),
discount_type ENUM('percentage', 'fixed', 'buy_one_get_one'),
discount_value DECIMAL(10,2),
start_date DATE,
end_date DATE,
minimum_purchase DECIMAL(10,2)
);

View File

@ -0,0 +1,200 @@
这是一个非常棒的想法。为了全面测试大语言模型LLM的 SQL 能力,我们需要一个既有业务逻辑深度,又包含大量“坑”的数据库设计。
我为你设计了一个 **“高校教务与捐赠管理系统”**。
这个场景足够复杂,包含了层级结构(学院-系)、多对多关系(学生-课程、教师-课程),以及容易混淆的财务和人员信息。
### 1. 数据库概览
这个数据库包含 6 张表,以下是它们的关系和陷阱说明:
* **Faculties (学院表)**: 顶级组织单位。
* **Departments (系/专业表)**: 隶属于学院,学生和教师归属于此。
* *关联*: `Faculties` 1:N `Departments`
* **Teachers (教师表)**: 包含入职信息。
* *关联*: `Departments` 1:N `Teachers`
* **Students (学生表)**: 包含学籍信息。
* *关联*: `Departments` 1:N `Students`
* *关联*: `Teachers` N:M (通过 Advisor 关系,这里简化为字段,实际复杂场景可用表)
* **Courses (课程表)**: 课程基础信息。
* **Course_Records (选课及成绩表)**: 核心多对多表。
* *关联*: `Students` N:M `Courses`
* *关联*: `Teachers` 1:N (一门课一个老师教,但老师教多门课)
---
### 2. 详细表结构设计 (SQL DDL)
你可以直接运行以下 SQL 创建表。
```sql
-- 1. 学院表
CREATE TABLE Faculties (
faculty_id INT PRIMARY KEY,
faculty_name VARCHAR(100),
dean_name VARCHAR(100) -- 陷阱1: 这里的名字是人名,不是学院名
);
-- 2. 系/专业表
CREATE TABLE Departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(100),
faculty_id INT,
FOREIGN KEY (faculty_id) REFERENCES Faculties(faculty_id),
dept_code VARCHAR(10) UNIQUE -- 陷阱2: 类似ID但不是主键容易搞混
);
-- 3. 教师表
CREATE TABLE Teachers (
teacher_id INT PRIMARY KEY,
teacher_name VARCHAR(100),
dept_id INT,
hire_date DATE,
title VARCHAR(50), -- 职称Professor, Lecturer
salary DECIMAL(10, 2), -- 陷阱3: 薪资字段,可能被误用为学生的学费
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
);
-- 4. 学生表
CREATE TABLE Students (
student_id INT PRIMARY KEY,
student_name VARCHAR(100),
dept_id INT,
enrollment_year INT, -- 陷阱4: 这里存的是年份(2023),不是日期
admission_date DATE, -- 陷阱5: 这才是真正的日期
tuition_fee DECIMAL(10, 2), -- 陷阱6: 学费,容易和 teacher.salary 搞混
status VARCHAR(20), -- 状态: Active, Graduated, Suspended
advisor_id INT, -- 导师ID
total_credit INT DEFAULT 0, -- 陷阱7: 已修总学分,容易和课程的 credit 搞混
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id),
FOREIGN KEY (advisor_id) REFERENCES Teachers(teacher_id)
);
-- 5. 课程表
CREATE TABLE Courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100),
credit INT, -- 学分
course_type VARCHAR(50), -- 类型: Core, Elective
dept_id INT, -- 开课系
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
);
-- 6. 选课及成绩表 (多对多关系)
CREATE TABLE Course_Records (
record_id INT PRIMARY KEY,
student_id INT,
course_id INT,
teacher_id INT,
semester VARCHAR(20), -- 例如 "2023-Fall"
score DECIMAL(5, 2), -- 陷阱8: 卷面分数 (0-100)
grade_point DECIMAL(3, 2), -- 陷阱9: 绩点 (0.0-4.0),含义相近易混
attendance_rate INT, -- 考勤率百分比
FOREIGN KEY (student_id) REFERENCES Students(student_id),
FOREIGN KEY (course_id) REFERENCES Courses(course_id),
FOREIGN KEY (teacher_id) REFERENCES Teachers(teacher_id)
);
```
---
### 3. 迷惑项与陷阱设计解析
在设计上述数据库时,我特意埋下了以下几类“坑”,用于测试 LLM 的语义理解能力:
1. **相似的字段名与含义**:
* `Students.enrollment_year` (年份, Integer) vs `Students.admission_date` (日期, Date)。
* *测试点*: 模型能否识别“年份”和“日期”的区别,在写 WHERE 条件时不会用错。
* `Course_Records.score` (考试分数) vs `Course_Records.grade_point` (绩点) vs `Courses.credit` (学分)。
* *测试点*: 当问“平均分”时,模型应该算 `score`;当问“总学分”时,应该累加 `Courses.credit`。模型经常会混淆“分”和“点”。
* `Teachers.salary` (工资) vs `Students.tuition_fee` (学费)。
* *测试点*: 两个字段都是钱,模型在写 JOIN 时如果只关注金额字段,很容易连错表。
2. **层级关系**:
* `Faculties` -> `Departments` -> `Students/Teachers`
* *测试点*: 如果问题是“统计 **计算机学院** (Faculty) 的所有学生人数”,模型必须通过 `Departments` 表进行两跳连接 (`Students` -> `Departments` -> `Faculties`),而不能直接连。
3. **聚合函数的干扰**:
* `Students.total_credit` (表中已存在的冗余字段) vs 动态计算 `SUM(Courses.credit)`
* *测试点*: 严谨的 SQL 应该基于 `Course_Records``Courses` 动态计算,但如果模型偷懒,可能会直接读取 `Students.total_credit`。我们可以测试问“实际修读学分”看模型是读字段还是计算。
4. **多对多关系的中间表**:
* `Course_Records` 包含了 `student_id`, `course_id`, `teacher_id`
* *测试点*: 问“谁教了张三?”,模型需要 JOIN `Students` -> `Course_Records` -> `Teachers`。如果模型误以为 `Students.advisor_id` 就是任课老师,就会写错。
5. **命名相似**:
* `dept_id``dept_code`
* *测试点*: 如果在查询条件中给出了代码(如 'CS01'),模型必须知道是用 `dept_code` 而不是 `dept_id` 去匹配。
---
### 4. 插入测试数据
为了让测试更真实,这里插入几条基础数据:
```sql
-- Faculties
INSERT INTO Faculties VALUES (1, 'Engineering', 'Dr. Smith');
INSERT INTO Faculties VALUES (2, 'Arts', 'Dr. Joyce');
-- Departments
INSERT INTO Departments VALUES (101, 'Computer Science', 1, 'CS');
INSERT INTO Departments VALUES (102, 'Mechanical Eng', 1, 'ME');
INSERT INTO Departments VALUES (201, 'English Lit', 2, 'ENG');
-- Teachers
INSERT INTO Teachers VALUES (1, 'Prof. Alice', 101, '2020-01-01', 'Professor', 9000.00);
INSERT INTO Teachers VALUES (2, 'Dr. Bob', 101, '2021-06-01', 'Lecturer', 6000.00);
INSERT INTO Teachers VALUES (3, 'Prof. Carol', 201, '2019-09-01', 'Professor', 8500.00);
-- Students
-- 注意:张三和李四在同一个系,王五在不同系
INSERT INTO Students VALUES (1001, 'Zhang San', 101, 2022, '2022-09-01', 5000.00, 'Active', 1, 0);
INSERT INTO Students VALUES (1002, 'Li Si', 101, 2023, '2023-09-01', 5500.00, 'Active', 2, 0);
INSERT INTO Students VALUES (1003, 'Wang Wu', 201, 2022, '2022-09-01', 4500.00, 'Active', 3, 0);
-- Courses
INSERT INTO Courses VALUES (501, 'Database Systems', 4, 'Core', 101);
INSERT INTO Courses VALUES (502, 'Algorithms', 3, 'Core', 101);
INSERT INTO Courses VALUES (503, 'Shakespeare', 3, 'Elective', 201);
-- Course_Records (选课记录)
-- 张三选了数据库老师是Alice考了85分
INSERT INTO Course_Records VALUES (1, 1001, 501, 1, '2023-Fall', 85.0, 3.5, 90);
-- 张三选了算法老师是Bob考了92分
INSERT INTO Course_Records VALUES (2, 1001, 502, 2, '2023-Fall', 92.0, 4.0, 95);
-- 李四选了数据库老师是Alice考了78分
INSERT INTO Course_Records VALUES (3, 1002, 501, 1, '2023-Fall', 78.0, 2.7, 80);
-- 王五选了莎士比亚老师是Carol
INSERT INTO Course_Records VALUES (4, 1003, 503, 3, '2023-Fall', 88.0, 3.7, 100);
```
---
### 5. 推荐的测试 Prompt 样例
你可以用下面这些问题去测试模型,观察它是否掉入陷阱:
1. **测试层级过滤与相似字段名**:
* *问题*: “查询 **Engineering 学院** (Faculty) 下所有学生的名字和他们的入学年份。”
* *陷阱*: 需要两跳 JOIN必须选 `enrollment_year` 而不是 `admission_date`
2. **测试多对多关系与字段混淆**:
* *问题*: “查询 Database Systems 这门课的平均考试分数。”
* *陷阱*: 必须选 `Course_Records.score`,不能选 `grade_point`,也不能选 `Courses.credit`
3. **测试金额字段区分**:
* *问题*: “列出所有学费高于 5000 的学生姓名以及他们所属系的名称。”
* *陷阱*: 必须用 `Students.tuition_fee`,如果模型写了 `salary` 就错了。
4. **测试聚合与 JOIN 顺序**:
* *问题*: “找出教过学生 Zhang San 的所有老师的名字。”
* *陷阱*: 路径是 `Students` -> `Course_Records` -> `Teachers`。不能直接用 `Students.advisor_id`,因为那只是导师,不一定教过课。
5. **测试相似表名/代码**:
* *问题*: “查询系代码为 'CS' 的系里,职称是 'Professor' 的老师薪资总和。”
* *陷阱*: 条件是用 `dept_code = 'CS'` 而不是 `dept_id`
这套设计应该能很好地帮你分辨出 LLM 在 Schema Linking模式链接和语义理解方面的真实水平。

View File

@ -0,0 +1,84 @@
CREATE TABLE Faculties (
faculty_id INT PRIMARY KEY,
faculty_name VARCHAR(100),
dean_name VARCHAR(100)
);
CREATE TABLE Departments (
dept_id INT PRIMARY KEY,
dept_name VARCHAR(100),
faculty_id INT,
FOREIGN KEY (faculty_id) REFERENCES Faculties(faculty_id),
dept_code VARCHAR(10) UNIQUE
);
CREATE TABLE Teachers (
teacher_id INT PRIMARY KEY,
teacher_name VARCHAR(100),
dept_id INT,
hire_date DATE,
title VARCHAR(50),
salary DECIMAL(10, 2),
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
);
CREATE TABLE Students (
student_id INT PRIMARY KEY,
student_name VARCHAR(100),
dept_id INT,
enrollment_year INT,
admission_date DATE,
tuition_fee DECIMAL(10, 2),
status VARCHAR(20),
advisor_id INT,
total_credit INT DEFAULT 0,
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id),
FOREIGN KEY (advisor_id) REFERENCES Teachers(teacher_id)
);
CREATE TABLE Courses (
course_id INT PRIMARY KEY,
course_name VARCHAR(100),
credit INT,
course_type VARCHAR(50),
dept_id INT,
FOREIGN KEY (dept_id) REFERENCES Departments(dept_id)
);
CREATE TABLE Course_Records (
record_id INT PRIMARY KEY,
student_id INT,
course_id INT,
teacher_id INT,
semester VARCHAR(20),
score DECIMAL(5, 2),
grade_point DECIMAL(3, 2),
attendance_rate INT,
FOREIGN KEY (student_id) REFERENCES Students(student_id),
FOREIGN KEY (course_id) REFERENCES Courses(course_id),
FOREIGN KEY (teacher_id) REFERENCES Teachers(teacher_id)
);
INSERT INTO Faculties VALUES (1, 'Engineering', 'Dr. Smith');
INSERT INTO Faculties VALUES (2, 'Arts', 'Dr. Joyce');
INSERT INTO Departments VALUES (101, 'Computer Science', 1, 'CS');
INSERT INTO Departments VALUES (102, 'Mechanical Eng', 1, 'ME');
INSERT INTO Departments VALUES (201, 'English Lit', 2, 'ENG');
INSERT INTO Teachers VALUES (1, 'Prof. Alice', 101, '2020-01-01', 'Professor', 9000.00);
INSERT INTO Teachers VALUES (2, 'Dr. Bob', 101, '2021-06-01', 'Lecturer', 6000.00);
INSERT INTO Teachers VALUES (3, 'Prof. Carol', 201, '2019-09-01', 'Professor', 8500.00);
INSERT INTO Students VALUES (1001, 'Zhang San', 101, 2022, '2022-09-01', 5000.00, 'Active', 1, 0);
INSERT INTO Students VALUES (1002, 'Li Si', 101, 2023, '2023-09-01', 5500.00, 'Active', 2, 0);
INSERT INTO Students VALUES (1003, 'Wang Wu', 201, 2022, '2022-09-01', 4500.00, 'Active', 3, 0);
INSERT INTO Courses VALUES (501, 'Database Systems', 4, 'Core', 101);
INSERT INTO Courses VALUES (502, 'Algorithms', 3, 'Core', 101);
INSERT INTO Courses VALUES (503, 'Shakespeare', 3, 'Elective', 201);
INSERT INTO Course_Records VALUES (1, 1001, 501, 1, '2023-Fall', 85.0, 3.5, 90);
INSERT INTO Course_Records VALUES (2, 1001, 502, 2, '2023-Fall', 92.0, 4.0, 95);
INSERT INTO Course_Records VALUES (3, 1002, 501, 1, '2023-Fall', 78.0, 2.7, 80);
INSERT INTO Course_Records VALUES (4, 1003, 503, 3, '2023-Fall', 88.0, 3.7, 100);

View File

@ -0,0 +1,682 @@
# TestECommerceDB 数据库完整建表SQL
以下是完整的MySQL数据库建表脚本包含表结构、约束、索引和测试数据。
```sql
-- =====================================================
-- 数据库创建脚本
-- 数据库名称TestECommerceDB
-- 用途测试大语言模型的SQL编写能力
-- 设计特点:复杂关联关系、一对多、多对多、自关联
-- 迷惑项:相似字段名、相近表名、含义相近的字段
-- =====================================================
-- 创建数据库
DROP DATABASE IF EXISTS TestECommerceDB;
CREATE DATABASE TestECommerceDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE TestECommerceDB;
-- =====================================================
-- 1. 用户表 (Users)
-- 存储用户基本信息
-- 迷惑项user_id、user_email、user_status 字段名相似
-- =====================================================
CREATE TABLE Users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
user_email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
phone VARCHAR(20),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
user_status TINYINT DEFAULT 1 COMMENT '1=活跃, 0=禁用',
last_login DATETIME,
INDEX idx_username (username),
INDEX idx_user_email (user_email),
INDEX idx_user_status (user_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 2. 分类表 (Categories)
-- 存储产品分类信息
-- 迷惑项自关联关系category_id、category_name、parent_id
-- 特点:树形结构,支持多级分类
-- =====================================================
CREATE TABLE Categories (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(50) NOT NULL,
category_desc VARCHAR(200),
parent_id INT DEFAULT NULL,
category_order INT DEFAULT 0,
is_active TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES Categories(category_id) ON DELETE SET NULL,
INDEX idx_parent_id (parent_id),
INDEX idx_category_name (category_name),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 3. 产品表 (Products)
-- 存储产品信息
-- 迷惑项product_id、product_name、product_desc、product_status
-- 含义相近字段price vs cost_price
-- =====================================================
CREATE TABLE Products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
product_desc TEXT,
product_specs VARCHAR(255) COMMENT '产品规格JSON字符串',
price DECIMAL(10,2) NOT NULL COMMENT '销售价格',
cost_price DECIMAL(10,2) COMMENT '成本价格',
stock_quantity INT DEFAULT 0,
stock_alert_level INT DEFAULT 10,
category_id INT,
brand VARCHAR(50),
product_status TINYINT DEFAULT 1 COMMENT '1=上架, 0=下架, 2=缺货',
view_count INT DEFAULT 0,
sales_count INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES Categories(category_id) ON DELETE SET NULL,
INDEX idx_product_name (product_name),
INDEX idx_price (price),
INDEX idx_category_id (category_id),
INDEX idx_product_status (product_status),
INDEX idx_brand (brand),
INDEX idx_sales_count (sales_count)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 4. 产品-分类关联表 (ProductCategories)
-- 实现产品和分类的多对多关系
-- 迷惑项表名与Products、Categories相似
-- 特点:支持产品属于多个分类,设置主分类
-- =====================================================
CREATE TABLE ProductCategories (
product_id INT NOT NULL,
category_id INT NOT NULL,
is_primary TINYINT DEFAULT 0 COMMENT '1=主分类, 0=副分类',
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (product_id, category_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES Categories(category_id) ON DELETE CASCADE,
INDEX idx_category_id (category_id),
INDEX idx_is_primary (is_primary)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 5. 订单表 (Orders)
-- 存储订单信息
-- 迷惑项order_id、order_date、order_status
-- 含义相近字段total_amount
-- =====================================================
CREATE TABLE Orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_number VARCHAR(30) NOT NULL UNIQUE COMMENT '订单编号',
user_id INT NOT NULL,
order_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '折扣金额',
shipping_fee DECIMAL(10,2) DEFAULT 0 COMMENT '运费',
payment_method VARCHAR(30) COMMENT '支付方式',
payment_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/failed/refunded',
order_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/confirmshipped/delivered/cancelled/completed',
shipping_addr_id INT,
billing_addr_id INT,
shipping_addr VARCHAR(500) COMMENT '收货地址快照',
billing_addr VARCHAR(500) COMMENT '账单地址快照',
customer_remark VARCHAR(500),
internal_remark VARCHAR(500),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE RESTRICT,
INDEX idx_order_number (order_number),
INDEX idx_user_id (user_id),
INDEX idx_order_date (order_date),
INDEX idx_order_status (order_status),
INDEX idx_payment_status (payment_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 6. 订单详情表 (OrderItems)
-- 存储订单中每个产品的详细信息
-- 迷惑项order_item_id、order_id
-- 含义相近字段item_price vs priceitem_total vs total_amount
-- =====================================================
CREATE TABLE OrderItems (
order_item_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
item_price DECIMAL(10,2) NOT NULL COMMENT '下单时的产品单价',
item_cost DECIMAL(10,2) COMMENT '成本单价',
item_discount DECIMAL(10,2) DEFAULT 0 COMMENT '该项折扣',
item_total DECIMAL(10,2) NOT NULL COMMENT '该项总金额',
item_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/shipped/delivered/returned',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE RESTRICT,
INDEX idx_order_id (order_id),
INDEX idx_product_id (product_id),
INDEX idx_item_status (item_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 7. 地址表 (Addresses)
-- 存储用户的多个地址
-- 迷惑项address_id、address_line1、address_line2
-- 一对多关系:一个用户有多个地址
-- =====================================================
CREATE TABLE Addresses (
address_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
address_label VARCHAR(50) COMMENT '地址标签,如:家、公司',
recipient_name VARCHAR(100) NOT NULL,
recipient_phone VARCHAR(20) NOT NULL,
country VARCHAR(50) DEFAULT '中国',
province VARCHAR(50),
city VARCHAR(50) NOT NULL,
district VARCHAR(50),
address_line1 VARCHAR(200) NOT NULL,
address_line2 VARCHAR(200),
postal_code VARCHAR(20),
address_type VARCHAR(20) DEFAULT 'shipping' COMMENT 'shipping/billing/both',
is_default TINYINT DEFAULT 0,
is_active TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_address_type (address_type),
INDEX idx_is_default (is_default),
INDEX idx_city (city)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 8. 评论表 (Reviews)
-- 存储用户对产品的评论
-- 迷惑项review_id、review_text、review_date
-- 多对一关系:评论关联用户和产品
-- =====================================================
CREATE TABLE Reviews (
review_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
order_id INT COMMENT '订单ID可选',
rating TINYINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
review_title VARCHAR(100),
review_text TEXT,
is_anonymous TINYINT DEFAULT 0,
is_verified TINYINT DEFAULT 0 COMMENT '是否购买后评论',
helpful_count INT DEFAULT 0,
reply_count INT DEFAULT 0,
review_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/approved/rejected',
review_date DATETIME DEFAULT CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_rating (rating),
INDEX idx_review_status (review_status),
INDEX idx_review_date (review_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 9. 购物车表 (CartItems)
-- 存储用户当前购物车中的商品
-- 迷惑项cart_id、product_id、quantity
-- =====================================================
CREATE TABLE CartItems (
cart_item_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
UNIQUE KEY uk_user_product (user_id, product_id),
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 10. 产品浏览历史表 (ProductViews)
-- 存储用户的浏览历史
-- 迷惑项view_id、product_id、view_date
-- =====================================================
CREATE TABLE ProductViews (
view_id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
product_id INT NOT NULL,
view_date DATETIME DEFAULT CURRENT_TIMESTAMP,
session_id VARCHAR(100),
view_duration INT DEFAULT 0 COMMENT '浏览时长(秒)',
source_type VARCHAR(30) COMMENT '来源search/category/recommend/direct',
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_view_date (view_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 11. 优惠券表 (Coupons)
-- 存储优惠券信息
-- 迷惑项coupon_id、coupon_code、coupon_type
-- =====================================================
CREATE TABLE Coupons (
coupon_id INT AUTO_INCREMENT PRIMARY KEY,
coupon_code VARCHAR(30) NOT NULL UNIQUE,
coupon_name VARCHAR(100) NOT NULL,
coupon_desc VARCHAR(255),
coupon_type VARCHAR(20) DEFAULT 'percentage' COMMENT 'percentage/fixed',
discount_value DECIMAL(10,2) NOT NULL COMMENT '折扣值(百分比或固定金额)',
min_order_amount DECIMAL(10,2) DEFAULT 0,
max_discount_amount DECIMAL(10,2) COMMENT '最大折扣金额',
usage_limit INT COMMENT '总使用次数限制',
usage_limit_per_user INT DEFAULT 1,
usage_count INT DEFAULT 0,
valid_from DATETIME NOT NULL,
valid_until DATETIME NOT NULL,
is_active TINYINT DEFAULT 1,
applicable_product_ids TEXT COMMENT '适用的产品ID列表JSON格式',
applicable_category_ids TEXT COMMENT '适用的分类ID列表JSON格式',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_coupon_code (coupon_code),
INDEX idx_valid_dates (valid_from, valid_until),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 12. 用户优惠券关联表 (UserCoupons)
-- 存储用户领取的优惠券
-- 迷惑项user_coupon_id、user_id、coupon_id
-- =====================================================
CREATE TABLE UserCoupons (
user_coupon_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
coupon_id INT NOT NULL,
status VARCHAR(20) DEFAULT 'available' COMMENT 'available/used/expired',
received_at DATETIME DEFAULT CURRENT_TIMESTAMP,
used_at DATETIME,
order_id INT,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (coupon_id) REFERENCES Coupons(coupon_id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_coupon_id (coupon_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 13. 产品收藏表 (Wishlists)
-- 存储用户收藏的产品
-- 迷惑项wishlist_id、product_id、user_id
-- =====================================================
CREATE TABLE Wishlists (
wishlist_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
note VARCHAR(255),
priority INT DEFAULT 0 COMMENT '优先级排序',
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
UNIQUE KEY uk_user_product (user_id, product_id),
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_added_at (added_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 14. 支付记录表 (Payments)
-- 存储订单支付信息
-- 迷惑项payment_id、order_id、payment_amount
-- =====================================================
CREATE TABLE Payments (
payment_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
payment_method VARCHAR(30) NOT NULL,
payment_amount DECIMAL(10,2) NOT NULL,
transaction_id VARCHAR(100) UNIQUE,
payment_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/success/failed/refunded',
payment_date DATETIME,
refund_amount DECIMAL(10,2) DEFAULT 0,
refund_reason VARCHAR(255),
gateway_response TEXT COMMENT '支付网关响应',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE RESTRICT,
INDEX idx_order_id (order_id),
INDEX idx_transaction_id (transaction_id),
INDEX idx_payment_status (payment_status),
INDEX idx_payment_date (payment_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 15. 管理员表 (Admins)
-- 存储管理员信息
-- 迷惑项admin_id、admin_email、admin_role
-- =====================================================
CREATE TABLE Admins (
admin_id INT AUTO_INCREMENT PRIMARY KEY,
admin_email VARCHAR(100) NOT NULL UNIQUE,
admin_name VARCHAR(50) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
admin_role VARCHAR(30) DEFAULT 'staff' COMMENT 'super_admin/admin/staff',
is_active TINYINT DEFAULT 1,
last_login DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_admin_email (admin_email),
INDEX idx_admin_role (admin_role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 添加外键约束到Orders表的shipping_addr_id和billing_addr_id
-- =====================================================
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_shipping_addr
FOREIGN KEY (shipping_addr_id) REFERENCES Addresses(address_id) ON DELETE SET NULL;
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_billing_addr
FOREIGN KEY (billing_addr_id) REFERENCES Addresses(address_id) ON DELETE SET NULL;
-- =====================================================
-- 插入测试数据
-- =====================================================
-- 插入分类数据(树形结构)
INSERT INTO Categories (category_id, category_name, category_desc, parent_id, category_order) VALUES
(1, '电子产品', '手机、电脑、相机等电子设备', NULL, 1),
(2, '服装', '男装、女装、童装等', NULL, 2),
(3, '家居用品', '家具、厨具、床上用品等', NULL, 3),
(4, '食品', '零食、饮料、生鲜等', NULL, 4),
(5, '手机', '智能手机', 1, 1),
(6, '笔记本电脑', '笔记本、台式机', 1, 2),
(7, '相机', '数码相机、摄像机', 1, 3),
(8, '男装', '男性服装', 2, 1),
(9, '女装', '女性服装', 2, 2),
(10, '智能手机', '高端智能手机', 5, 1),
(11, '功能手机', '老年机、备用机', 5, 2);
-- 插入用户数据
INSERT INTO Users (user_id, username, user_email, password_hash, full_name, phone, user_status) VALUES
(1, 'zhangsan', 'zhangsan@example.com', 'hash_abc123', '张三', '13800138001', 1),
(2, 'lisi', 'lisi@example.com', 'hash_def456', '李四', '13800138002', 1),
(3, 'wangwu', 'wangwu@example.com', 'hash_ghi789', '王五', '13800138003', 1),
(4, 'zhaoliu', 'zhaoliu@example.com', 'hash_jkl012', '赵六', '13800138004', 0),
(5, 'qianqi', 'qianqi@example.com', 'hash_mno345', '钱七', '13800138005', 1),
(6, 'sunba', 'sunba@example.com', 'hash_pqr678', '孙八', '13800138006', 1),
(7, 'zhoujiu', 'zhoujiu@example.com', 'hash_stu901', '周九', '13800138007', 1),
(8, 'wushiyi', 'wushiyi@example.com', 'hash_vwx234', '吴十', '13800138008', 1),
(9, 'zhengshier', 'zhengshier@example.com', 'hash_yza567', '郑十二', '13800138009', 1),
(10, 'xushisan', 'xushisan@example.com', 'hash_bcd890', '徐十三', '13800138010', 1);
-- 插入产品数据
INSERT INTO Products (product_id, product_name, product_desc, price, cost_price, stock_quantity, category_id, brand, product_status) VALUES
(1, 'iPhone 15 Pro Max', '苹果最新旗舰手机A17 Pro芯片钛金属机身', 9999.00, 6500.00, 100, 10, 'Apple', 1),
(2, 'Samsung Galaxy S24 Ultra', '三星Galaxy S24 Ultra钛金属机身AI功能', 8999.00, 5800.00, 80, 10, 'Samsung', 1),
(3, 'MacBook Pro 16', '苹果MacBook Pro 16英寸M3 Max芯片', 24999.00, 18000.00, 50, 6, 'Apple', 1),
(4, 'Dell XPS 15', '戴尔XPS 15笔记本电脑英特尔酷睿i7', 12999.00, 9500.00, 60, 6, 'Dell', 1),
(5, 'Sony A7 IV', '索尼A7 IV全画幅微单相机3300万像素', 16999.00, 12000.00, 30, 7, 'Sony', 1),
(6, 'Canon R6 Mark II', '佳能R6 Mark II全画幅微单相机', 15999.00, 11500.00, 25, 7, 'Canon', 1),
(7, 'Nike Air Jordan 1', '耐克Air Jordan 1经典篮球鞋', 1299.00, 650.00, 200, 8, 'Nike', 1),
(8, 'Adidas Ultraboost', '阿迪达斯Ultraboost跑鞋', 1099.00, 550.00, 150, 8, 'Adidas', 1),
(9, 'Zara女士连衣裙', 'Zara时尚女士连衣裙2024新款', 599.00, 200.00, 300, 9, 'Zara', 1),
(10, 'H&M半身裙', 'H&M时尚半身裙百搭款', 299.00, 100.00, 400, 9, 'H&M', 1),
(11, 'IKEA双人床', '宜家马尔姆双人床,简约风格', 2999.00, 1800.00, 20, 3, 'IKEA', 1),
(12, '美的微波炉', '美的M1-L213B微波炉21L容量', 499.00, 280.00, 100, 3, '美的', 1),
(13, '三只松鼠坚果大礼包', '三只松鼠坚果礼盒2103g', 128.00, 55.00, 500, 4, '三只松鼠', 1),
(14, '可口可乐330ml*24罐', '可口可乐经典装24罐装', 59.90, 35.00, 1000, 4, '可口可乐', 1),
(15, '老干妈辣椒酱', '老干妈风味豆豉油辣椒酱280g', 12.90, 5.00, 2000, 4, '老干妈', 1);
-- 插入产品-分类关联数据
INSERT INTO ProductCategories (product_id, category_id, is_primary) VALUES
(1, 5, 1), (1, 10, 1),
(2, 5, 1), (2, 10, 1),
(3, 6, 1),
(4, 6, 1),
(5, 7, 1),
(6, 7, 1),
(7, 8, 1),
(8, 8, 1),
(9, 9, 1),
(10, 9, 1),
(11, 3, 1),
(12, 3, 1),
(13, 4, 1),
(14, 4, 1),
(15, 4, 1);
-- 插入地址数据
INSERT INTO Addresses (address_id, user_id, address_label, recipient_name, recipient_phone, province, city, district, address_line1, postal_code, address_type, is_default) VALUES
(1, 1, '家', '张三', '13800138001', '北京', '北京市', '朝阳区', '建国路100号', '100000', 'shipping', 1),
(2, 1, '公司', '张三', '13800138001', '北京', '北京市', '海淀区', '中关村大街1号', '100080', 'shipping', 0),
(3, 2, '默认地址', '李四', '13800138002', '上海', '上海市', '浦东新区', '陆家嘴环路1000号', '200120', 'both', 1),
(4, 3, '家', '王五', '13800138003', '广东', '深圳市', '南山区', '科技园路100号', '518000', 'shipping', 1),
(5, 4, '地址1', '赵六', '13800138004', '浙江', '杭州市', '西湖区', '文三路100号', '310000', 'shipping', 1),
(6, 5, '家', '钱七', '13800138005', '江苏', '南京市', '鼓楼区', '中山北路100号', '210000', 'shipping', 1);
-- 插入订单数据
INSERT INTO Orders (order_id, order_number, user_id, total_amount, discount_amount, shipping_fee, payment_status, order_status, shipping_addr_id, billing_addr_id, shipping_addr, customer_remark) VALUES
(1, 'ORD202401010001', 1, 10998.00, 0.00, 0.00, 'paid', 'delivered', 1, 1, '北京市朝阳区建国路100号', '请尽快发货'),
(2, 'ORD202401020001', 1, 25998.00, 500.00, 0.00, 'paid', 'shipped', 2, 2, '北京市海淀区中关村大街1号', '工作日收货'),
(3, 'ORD202401030001', 2, 17998.00, 0.00, 15.00, 'paid', 'pending', 3, 3, '上海市浦东新区陆家嘴环路1000号', ''),
(4, 'ORD202401040001', 3, 32998.00, 1000.00, 0.00, 'paid', 'completed', 4, 4, '广东省深圳市南山区科技园路100号', '包装仔细一些'),
(5, 'ORD202401050001', 5, 258.90, 20.00, 0.00, 'paid', 'pending', 6, 6, '江苏省南京市鼓楼区中山北路100号', ''),
(6, 'ORD202401060001', 2, 1398.00, 0.00, 10.00, 'pending', 'pending', 3, 3, '上海市浦东新区陆家嘴环路1000号', ''),
(7, 'ORD202401070001', 7, 8999.00, 899.00, 0.00, 'paid', 'shipped', NULL, NULL, '四川省成都市武侯区天府大道100号', '生日礼物'),
(8, 'ORD202401080001', 1, 541.80, 0.00, 8.00, 'paid', 'delivered', 1, 1, '北京市朝阳区建国路100号', ''),
(9, 'ORD202401090001', 8, 16999.00, 0.00, 0.00, 'paid', 'delivered', NULL, NULL, '湖北省武汉市洪山区珞珈山路100号', ''),
(10, 'ORD202401100001', 9, 128.00, 10.00, 0.00, 'paid', 'pending', NULL, NULL, '湖南省长沙市岳麓区麓山南路100号', '');
-- 插入订单详情数据
INSERT INTO OrderItems (order_item_id, order_id, product_id, quantity, item_price, item_cost, item_total, item_status) VALUES
(1, 1, 1, 1, 9999.00, 6500.00, 9999.00, 'delivered'),
(2, 1, 14, 24, 59.90, 35.00, 1437.60, 'delivered'),
(3, 2, 3, 1, 24999.00, 18000.00, 24999.00, 'shipped'),
(4, 2, 15, 7, 12.90, 5.00, 90.30, 'shipped'),
(5, 3, 2, 2, 8999.00, 5800.00, 17998.00, 'pending'),
(6, 4, 5, 1, 16999.00, 12000.00, 16999.00, 'delivered'),
(7, 4, 6, 1, 15999.00, 11500.00, 15999.00, 'delivered'),
(8, 5, 9, 1, 599.00, 200.00, 599.00, 'pending'),
(9, 5, 10, 2, 299.00, 100.00, 598.00, 'pending'),
(10, 6, 7, 1, 1299.00, 650.00, 1299.00, 'pending'),
(11, 7, 2, 1, 8999.00, 5800.00, 8999.00, 'shipped'),
(12, 8, 11, 1, 2999.00, 1800.00, 2999.00, 'delivered'),
(13, 8, 12, 1, 499.00, 280.00, 499.00, 'delivered'),
(14, 8, 13, 1, 128.00, 55.00, 128.00, 'delivered'),
(15, 9, 6, 1, 15999.00, 11500.00, 15999.00, 'delivered'),
(16, 10, 13, 1, 128.00, 55.00, 128.00, 'pending');
-- 插入评论数据
INSERT INTO Reviews (review_id, user_id, product_id, order_id, rating, review_title, review_text, is_verified, review_status) VALUES
(1, 1, 1, 1, 5, '非常满意', '手机质感很好,拍照效果出色,电池续航也比之前的手机好很多。', 1, 'approved'),
(2, 2, 2, 3, 4, '不错', '系统流畅,屏幕显示效果好,但是价格有点贵。', 1, 'approved'),
(3, 3, 5, 4, 5, '专业级相机', '对焦速度快,高感光度表现优秀,非常适合专业摄影。', 1, 'approved'),
(4, 1, 3, 2, 5, '性能怪兽', 'M3 Max芯片性能太强了编译代码速度飞快。', 1, 'approved'),
(5, 4, 7, NULL, 3, '一般', '鞋子样式不错,但是鞋底偏硬,走路久了脚疼。', 0, 'approved'),
(6, 5, 9, 5, 4, '好看', '穿上身效果很好,面料也很舒服,推荐购买。', 1, 'approved'),
(7, 6, 11, NULL, 5, '安装方便', '床很结实,安装也很简单,一个人就能搞定。', 0, 'approved'),
(8, 7, 14, 7, 5, '全家喜欢', '家里常备的可乐,味道正宗,价格实惠。', 1, 'approved'),
(9, 8, 6, 9, 4, '功能强大', '相机很好用,但是菜单操作有点复杂,需要时间学习。', 1, 'approved'),
(10, 9, 13, 10, 5, '坚果新鲜', '坚果很新鲜,种类多,口感好,已经复购好几次了。', 1, 'approved'),
(11, 2, 15, NULL, 4, '下饭神器', '辣椒酱味道很好,用来拌饭很香。', 0, 'approved'),
(12, 1, 14, 1, 5, '实惠', '比超市便宜很多,一箱能喝很久。', 1, 'approved');
-- 插入购物车数据
INSERT INTO CartItems (user_id, product_id, quantity, added_at) VALUES
(1, 2, 1, '2024-01-10 10:00:00'),
(1, 5, 1, '2024-01-10 10:05:00'),
(2, 3, 1, '2024-01-10 11:00:00'),
(2, 7, 2, '2024-01-10 11:10:00'),
(3, 1, 1, '2024-01-10 12:00:00'),
(4, 8, 1, '2024-01-10 13:00:00'),
(5, 9, 2, '2024-01-10 14:00:00'),
(6, 10, 1, '2024-01-10 15:00:00'),
(7, 11, 1, '2024-01-10 16:00:00'),
(8, 12, 2, '2024-01-10 17:00:00');
-- 插入优惠券数据
INSERT INTO Coupons (coupon_id, coupon_code, coupon_name, coupon_desc, coupon_type, discount_value, min_order_amount, max_discount_amount, usage_limit, valid_from, valid_until, is_active) VALUES
(1, 'NEWUSER10', '新用户专享10%off', '新用户首单立享10%折扣', 'percentage', 10.00, 100.00, 500.00, 10000, '2024-01-01', '2024-12-31', 1),
(2, 'SAVE50', '满500减50', '订单满500元减50元', 'fixed', 50.00, 500.00, NULL, NULL, '2024-01-01', '2024-12-31', 1),
(3, 'VIP20', 'VIP会员20%off', 'VIP会员享20%折扣', 'percentage', 20.00, 200.00, 1000.00, 5000, '2024-01-01', '2024-12-31', 1),
(4, 'FREESHIP', '免运费券', '订单免运费', 'fixed', 0.00, 0.00, NULL, NULL, '2024-01-01', '2024-12-31', 1),
(5, 'SUPER100', '超级满减100', '满1000减100', 'fixed', 100.00, 1000.00, NULL, 1000, '2024-01-01', '2024-06-30', 1),
(6, 'EXPIRED50', '已过期优惠券', '测试用过期优惠券', 'fixed', 50.00, 200.00, NULL, NULL, '2023-01-01', '2023-12-31', 1);
-- 插入用户优惠券数据
INSERT INTO UserCoupons (user_id, coupon_id, status, used_at, order_id) VALUES
(1, 1, 'used', '2024-01-01 10:00:00', 1),
(1, 2, 'available', NULL, NULL),
(1, 3, 'available', NULL, NULL),
(2, 1, 'used', '2024-01-03 10:00:00', 3),
(2, 4, 'available', NULL, NULL),
(3, 2, 'available', NULL, NULL),
(4, 1, 'available', NULL, NULL),
(5, 5, 'used', '2024-01-05 10:00:00', 5),
(6, 3, 'available', NULL, NULL),
(7, 4, 'used', '2024-01-07 10:00:00', 7);
-- 插入收藏数据
INSERT INTO Wishlists (user_id, product_id, added_at, note, priority) VALUES
(1, 6, '2024-01-05 10:00:00', '等降价再买', 1),
(1, 8, '2024-01-06 10:00:00', NULL, 2),
(2, 3, '2024-01-05 11:00:00', '想要', 1),
(2, 4, '2024-01-06 11:00:00', '备选', 2),
(3, 1, '2024-01-05 12:00:00', '送给女朋友', 1),
(4, 9, '2024-01-05 13:00:00', NULL, 1),
(5, 11, '2024-01-05 14:00:00', '搬家时买', 1),
(6, 13, '2024-01-05 15:00:00', NULL, 1);
-- 插入支付记录数据
INSERT INTO Payments (order_id, payment_method, payment_amount, transaction_id, payment_status, payment_date) VALUES
(1, 'alipay', 10998.00, 'TXN202401010001', 'success', '2024-01-01 10:05:00'),
(2, 'wechat', 25998.00, 'TXN202401020001', 'success', '2024-01-02 10:05:00'),
(3, 'alipay', 17998.00, 'TXN202401030001', 'success', '2024-01-03 10:05:00'),
(4, 'credit_card', 32998.00, 'TXN202401040001', 'success', '2024-01-04 10:05:00'),
(5, 'wechat', 258.90, 'TXN202401050001', 'success', '2024-01-05 10:05:00'),
(7, 'alipay', 8999.00, 'TXN202401070001', 'success', '2024-01-07 10:05:00'),
(8, 'wechat', 541.80, 'TXN202401080001', 'success', '2024-01-08 10:05:00'),
(9, 'credit_card', 16999.00, 'TXN202401090001', 'success', '2024-01-09 10:05:00'),
(10, 'alipay', 128.00, 'TXN202401100001', 'success', '2024-01-10 10:05:00');
-- 插入管理员数据
INSERT INTO Admins (admin_id, admin_email, admin_name, password_hash, admin_role) VALUES
(1, 'admin@example.com', '超级管理员', 'hash_superadmin', 'super_admin'),
(2, 'manager@example.com', '运营经理', 'hash_manager', 'admin'),
(3, 'staff@example.com', '客服人员', 'hash_staff', 'staff'),
(4, 'finance@example.com', '财务人员', 'hash_finance', 'admin');
-- 插入产品浏览历史数据
INSERT INTO ProductViews (user_id, product_id, view_date, session_id, view_duration, source_type) VALUES
(1, 1, '2024-01-01 09:00:00', 'SES001', 120, 'search'),
(1, 2, '2024-01-01 09:05:00', 'SES001', 90, 'category'),
(1, 3, '2024-01-02 10:00:00', 'SES002', 180, 'recommend'),
(2, 1, '2024-01-03 11:00:00', 'SES003', 60, 'search'),
(2, 5, '2024-01-03 11:10:00', 'SES003', 240, 'direct'),
(3, 6, '2024-01-04 12:00:00', 'SES004', 300, 'search'),
(4, 7, '2024-01-05 13:00:00', 'SES005', 45, 'category'),
(5, 9, '2024-01-06 14:00:00', 'SES006', 120, 'search'),
(6, 11, '2024-01-07 15:00:00', 'SES007', 90, 'recommend'),
(7, 13, '2024-01-08 16:00:00', 'SES008', 30, 'direct');
-- =====================================================
-- 验证数据完整性
-- =====================================================
-- 查看所有表
SHOW TABLES;
-- 查看表结构示例
-- DESCRIBE Users;
-- DESCRIBE Orders;
-- DESCRIBE OrderItems;
-- 测试查询示例
-- SELECT u.username, COUNT(o.order_id) as order_count
-- FROM Users u LEFT JOIN Orders o ON u.user_id = o.user_id
-- GROUP BY u.user_id;
-- SELECT p.product_name, AVG(r.rating) as avg_rating
-- FROM Products p LEFT JOIN Reviews r ON p.product_id = r.product_id
-- GROUP BY p.product_id;
-- SELECT c.category_name, COUNT(p.product_id) as product_count
-- FROM Categories c LEFT JOIN ProductCategories pc ON c.category_id = pc.category_id
-- LEFT JOIN Products p ON pc.product_id = p.product_id
-- GROUP BY c.category_id;
```
## SQL文件说明
### 包含内容
| 组成部分 | 说明 |
|---------|------|
| **15张表** | Users、Categories、Products、ProductCategories、Orders、OrderItems、Addresses、Reviews、CartItems、ProductViews、Coupons、UserCoupons、Wishlists、Payments、Admins |
| **复杂关联** | 一对多、多对多、自关联 |
| **约束** | 主键、外键、UNIQUE、CHECK、DEFAULT |
| **索引** | 常用查询字段均建立索引 |
| **测试数据** | 每张表都包含实际数据 |
| **迷惑项** | 按设计要求保留相似字段名、相近表名 |
### 表关联关系图
```
Users (1) ----< (N) Orders (1) ----< (N) OrderItems (N) >---- (1) Products
| | |
| | |
+-----< (N) Addresses +-----< (N) Payments +-----< (N) Reviews
| |
+-----< (N) Reviews |
| |
+-----< (N) CartItems +-----< (N) ProductViews
| |
+-----< (N) UserCoupons +----< (N) Coupons +-----< (N) Wishlists
|
+-----< (N) ProductCategories
|
Categories (1) ---------------------------------------------------+
|
+--< (N) Categories (自关联)
```
### 使用方法
```bash
# 在MySQL中执行
mysql -u username -p < test_ecommerce_db.sql
# 或在MySQL客户端中执行
source /path/to/test_ecommerce_db.sql
```
此SQL文件可直接在MySQL 8.0+环境中执行,包含完整的表结构、约束、索引和测试数据。

View File

@ -0,0 +1,403 @@
-- =====================================================
-- 数据库创建脚本
-- 数据库名称TestECommerceDB
-- 用途测试大语言模型的SQL编写能力
-- 设计特点:复杂关联关系、一对多、多对多、自关联
-- 迷惑项:相似字段名、相近表名、含义相近的字段
-- =====================================================
-- 创建数据库
DROP DATABASE IF EXISTS TestECommerceDB;
CREATE DATABASE TestECommerceDB CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE TestECommerceDB;
-- =====================================================
-- 1. 用户表 (Users)
-- 存储用户基本信息
-- 迷惑项user_id、user_email、user_status 字段名相似
-- =====================================================
CREATE TABLE Users (
user_id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
user_email VARCHAR(100) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
full_name VARCHAR(100),
phone VARCHAR(20),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
user_status TINYINT DEFAULT 1 COMMENT '1=活跃, 0=禁用',
last_login DATETIME,
INDEX idx_username (username),
INDEX idx_user_email (user_email),
INDEX idx_user_status (user_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 2. 分类表 (Categories)
-- 存储产品分类信息
-- 迷惑项自关联关系category_id、category_name、parent_id
-- 特点:树形结构,支持多级分类
-- =====================================================
CREATE TABLE Categories (
category_id INT AUTO_INCREMENT PRIMARY KEY,
category_name VARCHAR(50) NOT NULL,
category_desc VARCHAR(200),
parent_id INT DEFAULT NULL,
category_order INT DEFAULT 0,
is_active TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (parent_id) REFERENCES Categories(category_id) ON DELETE SET NULL,
INDEX idx_parent_id (parent_id),
INDEX idx_category_name (category_name),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 3. 产品表 (Products)
-- 存储产品信息
-- 迷惑项product_id、product_name、product_desc、product_status
-- 含义相近字段price vs cost_price
-- =====================================================
CREATE TABLE Products (
product_id INT AUTO_INCREMENT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
product_desc TEXT,
product_specs VARCHAR(255) COMMENT '产品规格JSON字符串',
price DECIMAL(10,2) NOT NULL COMMENT '销售价格',
cost_price DECIMAL(10,2) COMMENT '成本价格',
stock_quantity INT DEFAULT 0,
stock_alert_level INT DEFAULT 10,
category_id INT,
brand VARCHAR(50),
product_status TINYINT DEFAULT 1 COMMENT '1=上架, 0=下架, 2=缺货',
view_count INT DEFAULT 0,
sales_count INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES Categories(category_id) ON DELETE SET NULL,
INDEX idx_product_name (product_name),
INDEX idx_price (price),
INDEX idx_category_id (category_id),
INDEX idx_product_status (product_status),
INDEX idx_brand (brand),
INDEX idx_sales_count (sales_count)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 4. 产品-分类关联表 (ProductCategories)
-- 实现产品和分类的多对多关系
-- 迷惑项表名与Products、Categories相似
-- 特点:支持产品属于多个分类,设置主分类
-- =====================================================
CREATE TABLE ProductCategories (
product_id INT NOT NULL,
category_id INT NOT NULL,
is_primary TINYINT DEFAULT 0 COMMENT '1=主分类, 0=副分类',
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (product_id, category_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES Categories(category_id) ON DELETE CASCADE,
INDEX idx_category_id (category_id),
INDEX idx_is_primary (is_primary)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 5. 订单表 (Orders)
-- 存储订单信息
-- 迷惑项order_id、order_date、order_status
-- 含义相近字段total_amount
-- =====================================================
CREATE TABLE Orders (
order_id INT AUTO_INCREMENT PRIMARY KEY,
order_number VARCHAR(30) NOT NULL UNIQUE COMMENT '订单编号',
user_id INT NOT NULL,
order_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
total_amount DECIMAL(10,2) NOT NULL COMMENT '订单总金额',
discount_amount DECIMAL(10,2) DEFAULT 0 COMMENT '折扣金额',
shipping_fee DECIMAL(10,2) DEFAULT 0 COMMENT '运费',
payment_method VARCHAR(30) COMMENT '支付方式',
payment_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/paid/failed/refunded',
order_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/confirmshipped/delivered/cancelled/completed',
shipping_addr_id INT,
billing_addr_id INT,
shipping_addr VARCHAR(500) COMMENT '收货地址快照',
billing_addr VARCHAR(500) COMMENT '账单地址快照',
customer_remark VARCHAR(500),
internal_remark VARCHAR(500),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE RESTRICT,
INDEX idx_order_number (order_number),
INDEX idx_user_id (user_id),
INDEX idx_order_date (order_date),
INDEX idx_order_status (order_status),
INDEX idx_payment_status (payment_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 6. 订单详情表 (OrderItems)
-- 存储订单中每个产品的详细信息
-- 迷惑项order_item_id、order_id
-- 含义相近字段item_price vs priceitem_total vs total_amount
-- =====================================================
CREATE TABLE OrderItems (
order_item_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
item_price DECIMAL(10,2) NOT NULL COMMENT '下单时的产品单价',
item_cost DECIMAL(10,2) COMMENT '成本单价',
item_discount DECIMAL(10,2) DEFAULT 0 COMMENT '该项折扣',
item_total DECIMAL(10,2) NOT NULL COMMENT '该项总金额',
item_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/shipped/delivered/returned',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE RESTRICT,
INDEX idx_order_id (order_id),
INDEX idx_product_id (product_id),
INDEX idx_item_status (item_status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 7. 地址表 (Addresses)
-- 存储用户的多个地址
-- 迷惑项address_id、address_line1、address_line2
-- 一对多关系:一个用户有多个地址
-- =====================================================
CREATE TABLE Addresses (
address_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
address_label VARCHAR(50) COMMENT '地址标签,如:家、公司',
recipient_name VARCHAR(100) NOT NULL,
recipient_phone VARCHAR(20) NOT NULL,
country VARCHAR(50) DEFAULT '中国',
province VARCHAR(50),
city VARCHAR(50) NOT NULL,
district VARCHAR(50),
address_line1 VARCHAR(200) NOT NULL,
address_line2 VARCHAR(200),
postal_code VARCHAR(20),
address_type VARCHAR(20) DEFAULT 'shipping' COMMENT 'shipping/billing/both',
is_default TINYINT DEFAULT 0,
is_active TINYINT DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_address_type (address_type),
INDEX idx_is_default (is_default),
INDEX idx_city (city)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 8. 评论表 (Reviews)
-- 存储用户对产品的评论
-- 迷惑项review_id、review_text、review_date
-- 多对一关系:评论关联用户和产品
-- =====================================================
CREATE TABLE Reviews (
review_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
order_id INT COMMENT '订单ID可选',
rating TINYINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
review_title VARCHAR(100),
review_text TEXT,
is_anonymous TINYINT DEFAULT 0,
is_verified TINYINT DEFAULT 0 COMMENT '是否购买后评论',
helpful_count INT DEFAULT 0,
reply_count INT DEFAULT 0,
review_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/approved/rejected',
review_date DATETIME DEFAULT CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_rating (rating),
INDEX idx_review_status (review_status),
INDEX idx_review_date (review_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 9. 购物车表 (CartItems)
-- 存储用户当前购物车中的商品
-- 迷惑项cart_id、product_id、quantity
-- =====================================================
CREATE TABLE CartItems (
cart_item_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
UNIQUE KEY uk_user_product (user_id, product_id),
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 10. 产品浏览历史表 (ProductViews)
-- 存储用户的浏览历史
-- 迷惑项view_id、product_id、view_date
-- =====================================================
CREATE TABLE ProductViews (
view_id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id INT,
product_id INT NOT NULL,
view_date DATETIME DEFAULT CURRENT_TIMESTAMP,
session_id VARCHAR(100),
view_duration INT DEFAULT 0 COMMENT '浏览时长(秒)',
source_type VARCHAR(30) COMMENT '来源search/category/recommend/direct',
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE SET NULL,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_view_date (view_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 11. 优惠券表 (Coupons)
-- 存储优惠券信息
-- 迷惑项coupon_id、coupon_code、coupon_type
-- =====================================================
CREATE TABLE Coupons (
coupon_id INT AUTO_INCREMENT PRIMARY KEY,
coupon_code VARCHAR(30) NOT NULL UNIQUE,
coupon_name VARCHAR(100) NOT NULL,
coupon_desc VARCHAR(255),
coupon_type VARCHAR(20) DEFAULT 'percentage' COMMENT 'percentage/fixed',
discount_value DECIMAL(10,2) NOT NULL COMMENT '折扣值(百分比或固定金额)',
min_order_amount DECIMAL(10,2) DEFAULT 0,
max_discount_amount DECIMAL(10,2) COMMENT '最大折扣金额',
usage_limit INT COMMENT '总使用次数限制',
usage_limit_per_user INT DEFAULT 1,
usage_count INT DEFAULT 0,
valid_from DATETIME NOT NULL,
valid_until DATETIME NOT NULL,
is_active TINYINT DEFAULT 1,
applicable_product_ids TEXT COMMENT '适用的产品ID列表JSON格式',
applicable_category_ids TEXT COMMENT '适用的分类ID列表JSON格式',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_coupon_code (coupon_code),
INDEX idx_valid_dates (valid_from, valid_until),
INDEX idx_is_active (is_active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 12. 用户优惠券关联表 (UserCoupons)
-- 存储用户领取的优惠券
-- 迷惑项user_coupon_id、user_id、coupon_id
-- =====================================================
CREATE TABLE UserCoupons (
user_coupon_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
coupon_id INT NOT NULL,
status VARCHAR(20) DEFAULT 'available' COMMENT 'available/used/expired',
received_at DATETIME DEFAULT CURRENT_TIMESTAMP,
used_at DATETIME,
order_id INT,
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (coupon_id) REFERENCES Coupons(coupon_id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE SET NULL,
INDEX idx_user_id (user_id),
INDEX idx_coupon_id (coupon_id),
INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 13. 产品收藏表 (Wishlists)
-- 存储用户收藏的产品
-- 迷惑项wishlist_id、product_id、user_id
-- =====================================================
CREATE TABLE Wishlists (
wishlist_id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
product_id INT NOT NULL,
added_at DATETIME DEFAULT CURRENT_TIMESTAMP,
note VARCHAR(255),
priority INT DEFAULT 0 COMMENT '优先级排序',
FOREIGN KEY (user_id) REFERENCES Users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES Products(product_id) ON DELETE CASCADE,
UNIQUE KEY uk_user_product (user_id, product_id),
INDEX idx_user_id (user_id),
INDEX idx_product_id (product_id),
INDEX idx_added_at (added_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 14. 支付记录表 (Payments)
-- 存储订单支付信息
-- 迷惑项payment_id、order_id、payment_amount
-- =====================================================
CREATE TABLE Payments (
payment_id INT AUTO_INCREMENT PRIMARY KEY,
order_id INT NOT NULL,
payment_method VARCHAR(30) NOT NULL,
payment_amount DECIMAL(10,2) NOT NULL,
transaction_id VARCHAR(100) UNIQUE,
payment_status VARCHAR(20) DEFAULT 'pending' COMMENT 'pending/success/failed/refunded',
payment_date DATETIME,
refund_amount DECIMAL(10,2) DEFAULT 0,
refund_reason VARCHAR(255),
gateway_response TEXT COMMENT '支付网关响应',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES Orders(order_id) ON DELETE RESTRICT,
INDEX idx_order_id (order_id),
INDEX idx_transaction_id (transaction_id),
INDEX idx_payment_status (payment_status),
INDEX idx_payment_date (payment_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 15. 管理员表 (Admins)
-- 存储管理员信息
-- 迷惑项admin_id、admin_email、admin_role
-- =====================================================
CREATE TABLE Admins (
admin_id INT AUTO_INCREMENT PRIMARY KEY,
admin_email VARCHAR(100) NOT NULL UNIQUE,
admin_name VARCHAR(50) NOT NULL,
password_hash VARCHAR(255) NOT NULL,
admin_role VARCHAR(30) DEFAULT 'staff' COMMENT 'super_admin/admin/staff',
is_active TINYINT DEFAULT 1,
last_login DATETIME,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX idx_admin_email (admin_email),
INDEX idx_admin_role (admin_role)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- =====================================================
-- 添加外键约束到Orders表的shipping_addr_id和billing_addr_id
-- =====================================================
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_shipping_addr
FOREIGN KEY (shipping_addr_id) REFERENCES Addresses(address_id) ON DELETE SET NULL;
ALTER TABLE Orders
ADD CONSTRAINT fk_orders_billing_addr
FOREIGN KEY (billing_addr_id) REFERENCES Addresses(address_id) ON DELETE SET NULL;

View File

@ -0,0 +1,225 @@
CREATE DATABASE ecommerce_test;
USE ecommerce_test;
CREATE TABLE users (
user_id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
user_name VARCHAR(50),
email VARCHAR(100) NOT NULL UNIQUE,
phone VARCHAR(20),
registration_date DATETIME DEFAULT CURRENT_TIMESTAMP,
user_type ENUM('regular', 'vip', 'admin') DEFAULT 'regular',
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE products (
product_id INT PRIMARY KEY AUTO_INCREMENT,
product_name VARCHAR(200) NOT NULL,
prod_name VARCHAR(200),
sku VARCHAR(50) UNIQUE,
product_code VARCHAR(50) UNIQUE,
description TEXT,
prod_desc TEXT,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2),
original_price DECIMAL(10,2),
brand VARCHAR(100),
weight DECIMAL(8,3),
size VARCHAR(50),
color VARCHAR(50),
status ENUM('active', 'inactive', 'discontinued') DEFAULT 'active',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE categories (
category_id INT PRIMARY KEY AUTO_INCREMENT,
category_name VARCHAR(100) NOT NULL,
cat_name VARCHAR(100),
parent_category_id INT,
category_level TINYINT DEFAULT 1,
category_code VARCHAR(50),
description TEXT,
is_active BOOLEAN DEFAULT TRUE,
sort_order INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parent_category_id) REFERENCES categories(category_id) ON DELETE SET NULL
);
CREATE TABLE product_category_map (
map_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
category_id INT NOT NULL,
is_primary BOOLEAN DEFAULT FALSE,
assigned_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
FOREIGN KEY (category_id) REFERENCES categories(category_id) ON DELETE CASCADE,
UNIQUE KEY unique_product_category (product_id, category_id)
);
CREATE TABLE inventory (
inventory_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
warehouse_location VARCHAR(100),
stock_quantity INT DEFAULT 0,
stock_num INT DEFAULT 0,
stock_count INT DEFAULT 0,
reserved_quantity INT DEFAULT 0,
available_quantity INT DEFAULT 0,
min_stock_level INT DEFAULT 0,
max_stock_level INT DEFAULT 1000,
last_restock_date DATETIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
UNIQUE KEY unique_product_warehouse (product_id, warehouse_location)
);
CREATE TABLE orders (
order_id INT PRIMARY KEY AUTO_INCREMENT,
order_number VARCHAR(50) NOT NULL UNIQUE,
order_no VARCHAR(50) UNIQUE,
order_code VARCHAR(50),
user_id INT NOT NULL,
order_status ENUM('pending', 'paid', 'shipped', 'delivered', 'cancelled', 'refunded') DEFAULT 'pending',
total_amount DECIMAL(10,2) NOT NULL,
discount_amount DECIMAL(10,2) DEFAULT 0,
final_amount DECIMAL(10,2) NOT NULL,
shipping_address TEXT,
billing_address TEXT,
payment_method VARCHAR(50),
payment_status ENUM('unpaid', 'paid', 'refunded') DEFAULT 'unpaid',
order_date DATETIME DEFAULT CURRENT_TIMESTAMP,
shipped_date DATETIME,
delivered_date DATETIME,
notes TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE RESTRICT
);
CREATE TABLE order_items (
item_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
total_price DECIMAL(10,2) NOT NULL,
discount_rate DECIMAL(5,2) DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE RESTRICT
);
CREATE TABLE shopping_cart (
cart_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL DEFAULT 1,
added_date DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
UNIQUE KEY unique_user_product (user_id, product_id)
);
CREATE TABLE user_addresses (
address_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT NOT NULL,
address_type ENUM('home', 'work', 'other') DEFAULT 'home',
recipient_name VARCHAR(100) NOT NULL,
recipient_phone VARCHAR(20) NOT NULL,
province VARCHAR(50) NOT NULL,
city VARCHAR(50) NOT NULL,
district VARCHAR(50),
street_address TEXT NOT NULL,
postal_code VARCHAR(10),
is_default BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);
CREATE TABLE promotions (
promotion_id INT PRIMARY KEY AUTO_INCREMENT,
promotion_name VARCHAR(200) NOT NULL,
promo_name VARCHAR(200),
promotion_type ENUM('percentage', 'fixed_amount', 'buy_x_get_y') NOT NULL,
promo_value DECIMAL(10,2) NOT NULL,
start_date DATETIME NOT NULL,
end_date DATETIME NOT NULL,
min_order_amount DECIMAL(10,2) DEFAULT 0,
max_discount_amount DECIMAL(10,2),
usage_limit INT,
used_count INT DEFAULT 0,
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE order_promotions (
order_promo_id INT PRIMARY KEY AUTO_INCREMENT,
order_id INT NOT NULL,
promotion_id INT NOT NULL,
discount_amount DECIMAL(10,2) NOT NULL,
applied_date DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE CASCADE,
FOREIGN KEY (promotion_id) REFERENCES promotions(promotion_id) ON DELETE RESTRICT,
UNIQUE KEY unique_order_promotion (order_id, promotion_id)
);
CREATE TABLE product_reviews (
review_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
user_id INT NOT NULL,
order_id INT,
rating TINYINT NOT NULL CHECK (rating >= 1 AND rating <= 5),
review_title VARCHAR(200),
review_content TEXT,
helpful_count INT DEFAULT 0,
is_verified_purchase BOOLEAN DEFAULT FALSE,
review_date DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE,
FOREIGN KEY (order_id) REFERENCES orders(order_id) ON DELETE SET NULL,
UNIQUE KEY unique_user_product_review (user_id, product_id, order_id)
);
CREATE TABLE suppliers (
supplier_id INT PRIMARY KEY AUTO_INCREMENT,
supplier_name VARCHAR(200) NOT NULL,
vendor_name VARCHAR(200),
contact_person VARCHAR(100),
contact_phone VARCHAR(20),
contact_email VARCHAR(100),
supplier_address TEXT,
payment_terms VARCHAR(100),
credit_limit DECIMAL(12,2),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE product_suppliers (
product_supplier_id INT PRIMARY KEY AUTO_INCREMENT,
product_id INT NOT NULL,
supplier_id INT NOT NULL,
supplier_price DECIMAL(10,2) NOT NULL,
lead_time_days INT DEFAULT 7,
is_primary_supplier BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (product_id) REFERENCES products(product_id) ON DELETE CASCADE,
FOREIGN KEY (supplier_id) REFERENCES suppliers(supplier_id) ON DELETE CASCADE,
UNIQUE KEY unique_product_supplier (product_id, supplier_id)
);
CREATE INDEX idx_products_name ON products(product_name);
CREATE INDEX idx_products_brand ON products(brand);
CREATE INDEX idx_orders_user_date ON orders(user_id, order_date);
CREATE INDEX idx_orders_status ON orders(order_status);
CREATE INDEX idx_inventory_product ON inventory(product_id);
CREATE INDEX idx_cart_user ON shopping_cart(user_id);
CREATE INDEX idx_reviews_product_rating ON product_reviews(product_id, rating);