Database.md 6.6 KB

Item 模块数据库设计

1. 核心数据表

1.1 warehouses 仓库表

字段 类型 说明 索引
id BIGINT 仓库ID,主键 PK
user_id BIGINT 所属用户ID IDX_user
type ENUM('available','frozen','storage') 仓库类型:可用/冻结/储藏
capacity INT 容量上限
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.2 items 物品表

字段 类型 说明 索引
id BIGINT 物品ID,主键 PK
name VARCHAR(100) 物品名称
type ENUM('consumable','equipment','material') 物品类型
max_stack SMALLINT 最大堆叠数量
tradable BOOLEAN 是否可交易
attributes JSON 扩展属性
global_expire_at TIMESTAMP 全局过期时间 IDX_expire
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.3 item_instances 物品实例表

字段 类型 说明 索引
id BIGINT 实例ID,主键 PK
item_id BIGINT 物品ID IDX_item
attributes JSON 实例属性数据
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.4 user_items 用户物品表

字段 类型 说明 索引
id BIGINT 记录ID,主键 PK
user_id BIGINT 用户ID IDX_user
item_id BIGINT 物品ID IDX_item
instance_id BIGINT 物品实例ID IDX_instance
warehouse_id BIGINT 仓库ID IDX_warehouse
quantity INT 数量(仅堆叠物品)
expire_at TIMESTAMP 用户物品过期时间 IDX_expire
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.5 item_groups 物品组表

字段 类型 说明 索引
id BIGINT 物品组ID,主键 PK
name VARCHAR(100) 物品组名称
type ENUM('daily','weekly','event') 物品组类型
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.6 item_group_items 物品组内容表

字段 类型 说明 索引
id BIGINT 记录ID,主键 PK
group_id BIGINT 物品组ID IDX_group
item_id BIGINT 物品ID IDX_item
weight SMALLINT 权重
created_at TIMESTAMP 创建时间
updated_at TIMESTAMP 更新时间

1.7 transaction_logs 物品变更日志表

字段 类型 说明 索引
id BIGINT 日志ID,主键 PK
user_id BIGINT 用户ID IDX_user
item_id BIGINT 物品ID IDX_item
instance_id BIGINT 物品实例ID IDX_instance
warehouse_id BIGINT 仓库ID IDX_warehouse
quantity INT 变动数量
operation ENUM('add','remove','transfer') 操作类型
source VARCHAR(50) 来源系统
details JSON 操作详情
created_at TIMESTAMP 创建时间

2. 表关系设计

erDiagram
    users ||--o{ warehouses : "1:N"
    warehouses ||--o{ user_items : "1:N"
    items ||--o{ item_instances : "1:N"
    items ||--o{ user_items : "1:N"
    items ||--o{ item_group_items : "1:N"
    item_groups ||--o{ item_group_items : "1:N"
    item_instances ||--o{ user_items : "1:1"
    user_items ||--o{ transaction_logs : "1:N"
    
    users {
        BIGINT id PK
    }
    warehouses {
        BIGINT id PK
        BIGINT user_id FK
    }
    items {
        BIGINT id PK
    }
    item_instances {
        BIGINT id PK
        BIGINT item_id FK
    }
    item_groups {
        BIGINT id PK
    }
    item_group_items {
        BIGINT id PK
        BIGINT group_id FK
        BIGINT item_id FK
    }
    user_items {
        BIGINT id PK
        BIGINT user_id FK
        BIGINT item_id FK
        BIGINT instance_id FK
        BIGINT warehouse_id FK
    }
    transaction_logs {
        BIGINT id PK
        BIGINT user_id FK
        BIGINT item_id FK
        BIGINT instance_id FK
        BIGINT warehouse_id FK
    }

3. 索引设计

3.1 仓库表索引

-- 用户仓库查询
CREATE INDEX idx_warehouse_user ON warehouses(user_id);

-- 仓库类型查询
CREATE INDEX idx_warehouse_type ON warehouses(type);

3.2 物品表索引

-- 过期物品查询
CREATE INDEX idx_item_expire ON items(global_expire_at);

-- 物品类型查询
CREATE INDEX idx_item_type ON items(type);

3.3 物品实例表索引

-- 物品实例查询
CREATE INDEX idx_instance_item ON item_instances(item_id);

3.4 用户物品表索引

-- 用户物品查询
CREATE INDEX idx_user_item_user ON user_items(user_id);

-- 仓库物品查询
CREATE INDEX idx_user_item_warehouse ON user_items(warehouse_id);

-- 物品实例查询
CREATE INDEX idx_user_item_instance ON user_items(instance_id);

-- 过期物品管理
CREATE INDEX idx_user_item_expire ON user_items(expire_at);

3.5 物品组表索引

-- 物品组查询
CREATE INDEX idx_group_type ON item_groups(type);

-- 物品组内容查询
CREATE INDEX idx_group_item_group ON item_group_items(group_id);
CREATE INDEX idx_group_item_item ON item_group_items(item_id);

3.6 事务日志表索引

-- 用户操作历史
CREATE INDEX idx_log_user_operation ON transaction_logs(user_id, operation);

-- 物品操作记录
CREATE INDEX idx_log_item ON transaction_logs(item_id);

-- 物品实例操作记录
CREATE INDEX idx_log_instance ON transaction_logs(instance_id);

-- 时间范围查询
CREATE INDEX idx_log_created ON transaction_logs(created_at);

4. 关键查询示例

4.1 获取用户仓库物品

SELECT 
    i.name, 
    ui.quantity,
    ui.expire_at
FROM user_items ui
JOIN items i ON ui.item_id = i.id
WHERE ui.user_id = 123
  AND ui.warehouse_id = 456;

4.2 查找过期物品

-- 全局过期物品
SELECT * FROM items 
WHERE global_expire_at < NOW();

-- 用户过期物品
SELECT * FROM user_items 
WHERE expire_at < NOW();

4.3 仓库容量检查

SELECT 
    w.capacity,
    COUNT(ui.id) AS used
FROM warehouses w
LEFT JOIN user_items ui ON w.id = ui.warehouse_id
WHERE w.user_id = 123
GROUP BY w.id;

4.4 查询物品变更历史

```sql SELECT

tl.operation,
tl.quantity,
tl.created_at,
i.name AS item_name,
ii.attributes->>'$.quality' AS quality

FROM transaction_logs tl JOIN items i ON tl.item_id = i.id LEFT JOIN item_instances ii ON tl.instance_id = ii.id WHERE tl.user_id = 123 AND tl.created_at BETWEEN '2023-01-01' AND '2023-12-31' ORDER BY tl.created_at DESC;