Files
wenzi/docs/data-model.md

94 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 数据模型设计
本文档描述了项目核心领域的数据模型和数据库表结构。
## 1. 领域模型 (Domain Models)
### 1.1 Activity.java
代表一个营销活动。这是活动管理功能的核心实体。
- `id` (Long): 活动的唯一标识符,主键。
- `name` (String): 活动的名称。
- `startTime` (ZonedDateTime): 活动的开始时间。
- `endTime` (ZonedDateTime): 活动的结束时间。
- `targetUserIds` (Set<Long>): 允许参加活动的用户ID集合。如果为空则表示对所有用户开放。
- `rewardTiers` (List<RewardTier>): 奖励规则的层级列表。
- `rewardMode` (RewardMode): 奖励模式(`CUMULATIVE` - 叠加, `DIFFERENTIAL` - 补差)。
- `multiLevelRewardRules` (List<MultiLevelRewardRule>): 多级邀请奖励规则。
### 1.2 ApiKey.java
代表一个API密钥用于授权外部系统访问特定活动的API。
- `id` (Long): 密钥的唯一标识符,主键。
- `activityId` (Long): 关联的活动ID。
- `name` (String): 方便用户识别的密钥名称。
- `keyHash` (String): 经过哈希加盐处理的API密钥值。
- `salt` (String): 用于哈希计算的盐值Base64编码存储。
## 2. 数据库表设计 (Database Schema)
### 2.1 activities 表
`V1__Create_activities_table.sql` 创建。
```sql
CREATE TABLE activities (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
start_time TIMESTAMP WITH TIME ZONE NOT NULL,
end_time TIMESTAMP WITH TIME ZONE NOT NULL,
-- 其他字段将根据需求添加
);
```
### 2.2 activity_rewards 表
`V2__Create_activity_rewards_table.sql` 创建。
```sql
CREATE TABLE activity_rewards (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
activity_id BIGINT NOT NULL,
threshold INT NOT NULL,
reward_type VARCHAR(50) NOT NULL,
points INT,
coupon_batch_id VARCHAR(255),
FOREIGN KEY (activity_id) REFERENCES activities(id)
);
```
### 2.3 multi_level_reward_rules 表
`V3__Create_multi_level_reward_rules_table.sql` 创建。
```sql
CREATE TABLE multi_level_reward_rules (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
activity_id BIGINT NOT NULL,
level INT NOT NULL,
decay_coefficient DECIMAL(5, 4) NOT NULL,
FOREIGN KEY (activity_id) REFERENCES activities(id),
UNIQUE (activity_id, level)
);
```
### 2.4 api_keys 表
`V4__Create_api_keys_table.sql` 创建。
```sql
CREATE TABLE api_keys (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
key_hash VARCHAR(255) NOT NULL UNIQUE,
salt VARCHAR(255) NOT NULL,
created_at TIMESTAMP NOT NULL,
revoked_at TIMESTAMP NULL,
last_used_at TIMESTAMP NULL
);
CREATE INDEX idx_api_keys_key_hash ON api_keys(key_hash);
```