# 电商系统建模

URL: https://caijiao.org/postgresql/project/cases/ecommerce
Source: docs/postgresql/project/cases/ecommerce.md
Description: 本章节介绍如何进行电商系统的数据库建模，帮助开发者了解如何设计符合实际需求的数据库结构。

电商系统的数据库设计是构建一个成功电商平台的核心部分。良好的数据库模型可以保证数据的存储、查询和管理效率，并支持系统的扩展性和高可用性。本章节将通过实际的案例，展示如何为一个电商系统进行数据库建模。

## 1. 数据库设计概述

电商系统通常包含以下几个关键功能模块：

- 用户管理
- 商品管理
- 订单管理
- 支付系统
- 库存管理
- 营销活动
- 评论与评分

在设计数据库时，我们需要考虑如何将这些模块中的数据进行合理分离，并确保数据的完整性和一致性。

## 2. 用户管理

用户管理是电商系统的基础模块之一。主要包括用户的注册、登录、个人信息管理等。

### 用户表设计

```sql
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(100) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    phone_number VARCHAR(20),
    address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
````

* `user_id`: 用户的唯一标识。
* `username`: 用户名，唯一。
* `password_hash`: 存储加密后的密码。
* `email`: 用户的电子邮件，唯一。
* `phone_number`: 用户的电话号码。
* `address`: 用户的地址。
* `created_at` 和 `updated_at`: 记录用户创建和更新的时间。

### 用户角色表设计（如管理员与普通用户）

```sql
CREATE TABLE user_roles (
    role_id SERIAL PRIMARY KEY,
    role_name VARCHAR(50) UNIQUE NOT NULL
);

CREATE TABLE user_role_mapping (
    user_id INT REFERENCES users(user_id),
    role_id INT REFERENCES user_roles(role_id),
    PRIMARY KEY (user_id, role_id)
);
```

## 3. 商品管理

商品管理包括商品的添加、修改、删除、查询等功能。商品表需要存储商品的详细信息，如名称、描述、价格、库存等。

### 商品表设计

```sql
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    product_name VARCHAR(255) NOT NULL,
    description TEXT,
    price DECIMAL(10, 2) NOT NULL,
    stock_quantity INT DEFAULT 0,
    category_id INT REFERENCES categories(category_id),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

* `product_id`: 商品的唯一标识。
* `product_name`: 商品名称。
* `description`: 商品描述。
* `price`: 商品价格。
* `stock_quantity`: 商品库存数量。
* `category_id`: 商品所属类别的外键。

### 商品类别表设计

```sql
CREATE TABLE categories (
    category_id SERIAL PRIMARY KEY,
    category_name VARCHAR(100) NOT NULL
);
```

## 4. 订单管理

订单管理涉及用户购买商品时创建订单，跟踪订单状态，以及管理订单的支付和发货等流程。

### 订单表设计

```sql
CREATE TABLE orders (
    order_id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(user_id),
    order_status VARCHAR(50) NOT NULL,
    total_price DECIMAL(10, 2) NOT NULL,
    shipping_address TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

* `order_id`: 订单的唯一标识。
* `user_id`: 下单的用户。
* `order_status`: 订单状态（如待支付、已支付、待发货、已完成）。
* `total_price`: 订单总金额。
* `shipping_address`: 发货地址。

### 订单明细表设计

```sql
CREATE TABLE order_items (
    order_item_id SERIAL PRIMARY KEY,
    order_id INT REFERENCES orders(order_id),
    product_id INT REFERENCES products(product_id),
    quantity INT DEFAULT 1,
    price DECIMAL(10, 2) NOT NULL
);
```

* `order_item_id`: 订单明细的唯一标识。
* `order_id`: 订单的外键。
* `product_id`: 商品的外键。
* `quantity`: 商品数量。
* `price`: 商品价格。

## 5. 支付管理

支付管理记录用户支付订单的情况，包括支付方式、支付金额等信息。

### 支付表设计

```sql
CREATE TABLE payments (
    payment_id SERIAL PRIMARY KEY,
    order_id INT REFERENCES orders(order_id),
    payment_method VARCHAR(50) NOT NULL,
    payment_amount DECIMAL(10, 2) NOT NULL,
    payment_status VARCHAR(50) NOT NULL,
    payment_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

* `payment_id`: 支付记录的唯一标识。
* `order_id`: 关联订单的外键。
* `payment_method`: 支付方式（如信用卡、支付宝、微信支付）。
* `payment_amount`: 支付金额。
* `payment_status`: 支付状态（如待支付、已支付、支付失败）。
* `payment_date`: 支付日期。

## 6. 库存管理

库存管理涉及商品库存的监控、更新和警告等功能。

### 库存表设计

```sql
CREATE TABLE inventory (
    inventory_id SERIAL PRIMARY KEY,
    product_id INT REFERENCES products(product_id),
    quantity INT DEFAULT 0,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

* `inventory_id`: 库存记录的唯一标识。
* `product_id`: 商品的外键。
* `quantity`: 当前库存数量。
* `updated_at`: 库存更新时间。

## 7. 营销活动

营销活动包括促销、折扣、优惠券等功能。通过这些活动可以提高销售额并吸引更多用户。

### 优惠券表设计

```sql
CREATE TABLE coupons (
    coupon_id SERIAL PRIMARY KEY,
    coupon_code VARCHAR(50) UNIQUE NOT NULL,
    discount_amount DECIMAL(10, 2) NOT NULL,
    valid_from TIMESTAMP,
    valid_until TIMESTAMP,
    is_active BOOLEAN DEFAULT TRUE
);
```

* `coupon_id`: 优惠券的唯一标识。
* `coupon_code`: 优惠券代码。
* `discount_amount`: 优惠金额。
* `valid_from` 和 `valid_until`: 优惠券有效期。
* `is_active`: 优惠券是否有效。

## 8. 评论与评分

评论与评分功能允许用户对商品进行评价，帮助其他用户做出购买决策。

### 商品评论表设计

```sql
CREATE TABLE product_reviews (
    review_id SERIAL PRIMARY KEY,
    product_id INT REFERENCES products(product_id),
    user_id INT REFERENCES users(user_id),
    rating INT CHECK (rating >= 1 AND rating <= 5),
    review_text TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
```

* `review_id`: 评论的唯一标识。
* `product_id`: 商品的外键。
* `user_id`: 用户的外键。
* `rating`: 商品评分，1-5 分。
* `review_text`: 评论内容。

## 小结

通过对电商系统的数据库建模，我们能够清晰地设计出各个功能模块的数据结构。合理的数据库设计不仅有助于提升系统的性能和可扩展性，还能保证数据的完整性与一致性。在实际开发中，还需要根据业务需求进一步调整和优化数据库结构。
