# 数据模型设计 本文档描述了项目核心领域的数据模型和数据库表结构。 ## 1. 领域模型 (Domain Models) ### 1.1 Activity.java 代表一个营销活动。这是活动管理功能的核心实体。 - `id` (Long): 活动的唯一标识符,主键。 - `name` (String): 活动的名称。 - `startTime` (ZonedDateTime): 活动的开始时间。 - `endTime` (ZonedDateTime): 活动的结束时间。 - `targetUserIds` (Set): 允许参加活动的用户ID集合。如果为空,则表示对所有用户开放。 - `rewardTiers` (List): 奖励规则的层级列表。 - `rewardMode` (RewardMode): 奖励模式(`CUMULATIVE` - 叠加, `DIFFERENTIAL` - 补差)。 - `multiLevelRewardRules` (List): 多级邀请奖励规则。 ### 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); ```