Files
wenzi/docs/data-model.md

2.7 KiB
Raw Blame History

数据模型设计

本文档描述了项目核心领域的数据模型和数据库表结构。

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 创建。

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 创建。

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 创建。

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 创建。

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);