用户模块数据库设计

1. 用户表(Users)

  • user_id: BIGINT,主键,自增
  • username: VARCHAR(50),用户名,唯一,非空
  • email: VARCHAR(100),电子邮箱,唯一,非空
  • password_hash: CHAR(60),加密后的密码,非空
  • avatar_url: VARCHAR(255),头像链接,可空
  • invitation_code: CHAR(16),个人邀请码,唯一,非空
  • invited_by: BIGINT,邀请人ID,外键→users.user_id,可空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • updated_at: TIMESTAMP,更新时间,非空,默认当前时间(头像,用户名,passkey修改时更新)
  • last_login: TIMESTAMP,最后登录时间,可空
  • status: ENUM('active','inactive','banned'),账户状态,非空,默认'active'

2. Passkey历史表(Passkey_History)

  • passkey_id: BIGINT,Passkey记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • passkey: CHAR(32),用户Passkey,唯一,非空
  • is_active: BOOLEAN,是否为当前有效Passkey,非空,默认TRUE
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • expired_at: TIMESTAMP,过期时间,可空
  • next_change_allowed_at: TIMESTAMP,下次允许更改的时间,非空

3. 验证码表(Verification_Codes)

  • id: BIGINT,验证记录ID,主键,自增
  • email: VARCHAR(100),邮箱,外键→users.email
  • token: CHAR(6),6位数字验证码,非空
  • purpose: ENUM('email_verification','password_reset'),验证码用途,非空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • expires_at: TIMESTAMP,过期时间,非空
  • is_used: BOOLEAN,是否已使用,非空,默认FALSE
  • used_at: TIMESTAMP,使用时间,可空

4. 用户-局域网关系表(User_Network_Membership)

  • membership_id: BIGINT,关系ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • role: ENUM('member','admin'),用户在该局域网中的角色,非空,默认'member'
  • joined_at: TIMESTAMP,加入时间,非空,默认当前时间

资源模块数据库设计

5. 资源表(Resources)

  • resource_id: BIGINT,资源ID,主键,自增
  • title: VARCHAR(200),资源标题,非空
  • description: TEXT,资源描述,可空
  • uploader_id: BIGINT,上传者ID,外键→users.user_id
  • category_id: BIGINT,分类ID,外键→resource_categories.category_id
  • tags: JSON,标签(JSON格式),可空
  • cover_url: VARCHAR(255),封面图片URL,可空
  • file_size: BIGINT,文件总大小(字节),非空
  • file_count: INT,文件数量,非空,默认1
  • info_hash: CHAR(40),种子InfoHash值,唯一,非空
  • torrent_file_path: VARCHAR(255),种子文件存储路径,非空
  • price: DECIMAL(10,2),资源价格(积分),非空,默认0
  • is_free: BOOLEAN,是否免费资源,非空,默认FALSE
  • likes_count: INT,点赞数量,非空,默认0
  • torrent_downloads_count: INT,种子文件下载总次数,非空,默认0
  • status: ENUM('pending','active','removed'),资源状态,非空,默认'active'
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • updated_at: TIMESTAMP,更新时间,非空,默认当前时间

6. 资源分类表(Resource_Categories)

  • category_id: BIGINT,分类ID,主键,自增
  • name: VARCHAR(50),分类名称,非空
  • description: VARCHAR(255),分类描述,可空
  • icon: VARCHAR(50),分类图标,可空

7. 资源-局域网可用性表(Resource_Network_Availability)

  • id: BIGINT,ID,主键,自增
  • resource_id: BIGINT,资源ID,外键→resources.resource_id
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • torrent_downloads_count: INT,该局域网内种子下载次数,非空,默认0
  • resource_last_upload_at: TIMESTAMP,资源在该局域网最后一次上传活动时间,可空
  • first_available_at: TIMESTAMP,首次在该局域网可用时间,非空,默认当前时间
  • last_downloaded_at: TIMESTAMP,最后下载时间,非空,默认当前时间

8. 用户资源购买记录表(User_Resource_Purchases)

  • purchase_id: BIGINT,购买记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • resource_id: BIGINT,资源ID,外键→resources.resource_id
  • seller_id: BIGINT,卖家(上传者)ID,外键→users.user_id
  • purchase_time: TIMESTAMP,购买时间,非空,默认当前时间
  • points_paid: DECIMAL(10,2),支付的积分,非空,默认0

9. 用户Torrent下载记录表(User_Torrent_Downloads)

  • download_id: BIGINT,下载记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • resource_id: BIGINT,资源ID,外键→resources.resource_id
  • purchase_id: BIGINT,非空,关联的购买记录ID,外键→user_resource_purchases.purchase_id
  • network_id: BIGINT,用户选择的局域网ID,外键→networks.network_id
  • download_time: TIMESTAMP,下载时间,非空,默认当前时间

10. 资源评论表(Resource_Comments)

  • comment_id: BIGINT,评论ID,主键,自增
  • resource_id: BIGINT,资源ID,外键→resources.resource_id
  • user_id: BIGINT,评论用户ID,外键→users.user_id
  • content: TEXT,评论内容,非空
  • likes_count: INT,点赞数量,非空,默认0
  • is_deleted: BOOLEAN,软删除标记,默认FALSE
  • created_at: TIMESTAMP,评论时间,非空,默认当前时间
  • updated_at: TIMESTAMP,更新时间,可空

11. 点赞表(Likes)

  • like_id: BIGINT,点赞ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • target_type: ENUM('resource','comment'),点赞目标类型,非空
  • target_id: BIGINT,目标ID(根据target_type对应不同表的ID),非空
  • created_at: TIMESTAMP,点赞时间,非空,默认当前时间

注明

  1. User_Torrent_Downloads表记录的是用户下载种子文件(.torrent)的行为,而非实际文件传输记录
  2. 实际文件的上传下载记录将在积分模块中设计,不在此处包含
  3. torrent_downloads_count字段特指种子文件的下载次数,与实际内容的传输次数区分开

局域网-Tracker模块数据库设计

12. 局域网表(Networks)

  • network_id: BIGINT,局域网ID,主键,自增
  • name: VARCHAR(100),局域网名称,非空,唯一
  • description: TEXT,局域网描述,可空
  • physical_address: VARCHAR(255),物理地址,可空
  • tracker_name: VARCHAR(100),Tracker名称,非空
  • tracker_url: VARCHAR(255),Tracker URL地址(局域网IP),非空
  • is_public: BOOLEAN,是否为公网Tracker,非空,默认FALSE
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • member_count: INT,局域网内的人数
  • status: ENUM('active','inactive','pending'),状态,非空,默认'active'

13. 局域网规则配置表(Network_Rules)

  • rule_id: BIGINT,规则ID,主键,自增
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • epsilon_value: FLOAT,防止分母为零的ε值,非空,默认0.01
  • norm_ratio: FLOAT,标准下载/上传比例n值,非空,默认1.0
  • delta_value: FLOAT,最小贡献度补偿δ值,非空,默认0.01
  • max_download_ratio: FLOAT,最大允许下载/上传比例,非空,默认5.0
  • updated_at: TIMESTAMP,更新时间,非空,默认当前时间
  • updated_by: BIGINT,更新者ID,外键→users.user_id

14. 网络禁止记录表(Network_Ban_Records)

  • record_id: BIGINT,记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • network_id: BIGINT,网络ID,外键→networks.network_id
  • banned_at: TIMESTAMP,禁止时间,非空
  • can_rejoin_at: TIMESTAMP,可再次加入时间,非空
  • banned_by: BIGINT,操作者ID,外键→users.user_id
  • is_active: BOOLEAN,记录是否有效,非空,默认TRUE
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间

15. Redis消息队列数据结构 用户上传下载数据

每条记录以时间戳加序号为ID,格式:{timestamp}-{sequence},内容为哈希结构:

"{timestamp}-{sequence}" : {
    "passkey": "用户的passkey",
    "tracker": "tracker名称(如tracker-public, tracker-syd-home)",
    "infohash": "资源的哈希值",
    "timestamp": "Unix时间戳",
    "uploaded" 或 "downloaded" 或 "uploaded" 和 "downloaded"都有: "字节数" 
}

示例:

"1744191062011-0": {
    "passkey": "syd_home_laptop",
    "tracker": "tracker-public",
    "infohash": "e940a7a57294e4c98f62514b32611e38181b6cae",
    "timestamp": "1744191062",
    "downloaded": "2555904"
}

"1744511407660-0": {
    "passkey": "edgeServerKey",
    "tracker": "tracker-public",
    "infohash": "5c64738fe982efd53a4ebbe3d4c8162c8d635ff3",
    "timestamp": "1744511407",
    "uploaded": "29169516"
}

"1744891320472-0": {
    "passkey": "mobile_device_01",
    "tracker": "tracker-syd-home",
    "infohash": "a7d42c45e56f8c34d96a1e23b639f815e9d78b21",
    "timestamp": "1744891320",
    "uploaded": "15728640",
    "downloaded": "52428800"
}

字段说明:

字段 类型 说明
passkey 字符串 用户的唯一标识
tracker 字符串 来源tracker的名称
infohash 字符串 资源的SHA-1哈希值,固定40个十六进制字符
timestamp 整数 Unix时间戳,记录数据生成时间
uploaded 整数 上传的字节数增量(可选)
downloaded 整数 下载的字节数增量(可选)

每条记录至少包含uploaded或downloaded其中一个字段,表示当前的上传或下载增量。

积分模块数据库设计

16. 用户积分余额表(User_Points_Balance)

  • user_id: BIGINT,用户ID,主键,外键→users.user_id
  • points_balance: DECIMAL(10,2),全局积分余额,非空,默认0
  • total_global_uploaded: BIGINT,全局总上传量(字节),非空,默认0
  • total_global_downloaded: BIGINT,全局总下载量(字节),非空,默认0
  • updated_at: TIMESTAMP,最后更新时间,非空,默认当前时间

17. 用户传输统计表(User_Transfer_Stats)

  • stat_id: BIGINT,统计记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • total_uploaded: BIGINT,该局域网总上传量(字节),非空,默认0
  • total_downloaded: BIGINT,该局域网总下载量(字节),非空,默认0
  • updated_at: TIMESTAMP,最后更新时间,非空,默认当前时间

18. 周期累计传输表(Weekly_Transfer_Accumulation)

  • accumulation_id: BIGINT,累计记录ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • settlement_start: TIMESTAMP,当前结算周期开始时间,非空
  • next_settlement: TIMESTAMP,下次结算时间,非空
  • period_uploaded: BIGINT,本周期上传量(字节),非空,默认0
  • period_downloaded: BIGINT,本周期下载量(字节),非空,默认0
  • status: ENUM('pending', 'settled'),结算状态,非空,默认'pending'
  • normalized_contribution: DECIMAL(10,6),标准化贡献度,可空
  • points_earned: DECIMAL(10,2),本期获得积分,可空
  • updated_at: TIMESTAMP,最后更新时间,非空,默认当前时间

19. 用户积分历史表(User_Points_History)

  • history_id: BIGINT,历史ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id
  • points_amount: DECIMAL(10,2),获得的积分数量,非空
  • points_type: ENUM('network_settlement', 'resource_sale_commission'),积分来源类型,非空
  • reference_id: BIGINT,关联ID(周期结算为network_id,销售分成为purchase_id),非空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • applied_status: enum('pending','applied','failed'),积分历史需要经过schedule任务导入余额。可空
  • applied_at: TIMESTAMP,导入时间。可空

20. 局域网结算历史表(Network_Settlement_History)

  • history_id: BIGINT,历史ID,主键,自增
  • network_id: BIGINT,局域网ID,外键→networks.network_id
  • settlement_time: TIMESTAMP,结算时间,非空
  • user_count: INT,参与用户数,非空
  • total_points: DECIMAL(10,2),分配的总积分,非空
  • epsilon_used: FLOAT,使用的ε值,非空
  • norm_ratio_used: FLOAT,使用的标准比例n值,非空
  • delta_used: FLOAT,使用的δ值,非空
  • variance: FLOAT,计算的方差值σ²,非空
  • min_contribution: DECIMAL(10,6),本次结算的最小贡献度值,非空
  • execution_duration: INT,执行耗时(毫秒),非空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间

21. 传输日志采样表(Transfer_Log_Samples)

  • log_id: BIGINT,日志ID,主键,自增
  • passkey: CHAR(32),用户Passkey,非空
  • user_id: BIGINT, 用户id,外键→users.user_id,可空
  • tracker_name: VARCHAR(100),Tracker名称,非空
  • tracker_id: BIGINT,局域网id,外键→networks.network_id
  • infohash: CHAR(40),资源哈希值,非空
  • resource_id: BIGINT,资源id,外键,可空
  • timestamp: TIMESTAMP,redis中的消息队列时间戳,非空
  • upload_bytes: BIGINT,上传字节数,非空,默认0
  • download_bytes: BIGINT,下载字节数,非空,默认0
  • process_status: ENUM('pending', 'processed', 'user_not_found', 'resource_not_found','tracker_not_found', 'some_not_found'),redis映射后的状态,非空,默认pending
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • processed_at: TIMESTAMP,处理时间,可空

这个表中一条数据会写两次,第一次是消息队列的拉取schedule任务从redis映射到mysql中,此时createdat更新,此时不做连接表的操作,第二次是连接表操作的schedule任务,使用查询,更新userid和resourceid,processedat更新,processed更新

redis数据可能出现意料之外的内容,比如用户的上传内容出现在他没有加入的局域网中,不能调用joinnetwork,因为有可能出现用户在一个未加入的局域网中使用它的Tracker,这样会导致passkey对应的数据没法加入表(因为用户还未加入该局域网),这里认为用户的passkey被盗,可以发异常提醒的邮件,对于公网Tracker也应该注意

用户在下载时,会自动添加该用户全部加入的公网tracker url,然后再添加用户选择的局域网tracker url。

RAG模块数据库设计

22. RAG文档表(rag_documents)

  • document_id: BIGINT,文档ID,主键,自增
  • content_text: TEXT,累积的资源文本内容,非空
  • previous_resource_id: BIGINT,上一次处理的最大资源ID,可空,外键→resources.resource_id
  • accumulation_count: INT,累积次数计数器(最大12),非空,默认值0
  • document_location: VARCHAR(255),RAG服务返回的文件位置,可空
  • upload_status: ENUM('pending','uploaded','failed'),上传状态,非空,默认'pending'
  • embedding_status: ENUM('pending','processing','completed','failed'),嵌入状态,非空,默认'pending'
  • uploaded_at: TIMESTAMP,上传时间,可空
  • embedded_at: TIMESTAMP,嵌入时间,可空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间

23. 聊天线程表(chat_threads)

  • thread_id: BIGINT,线程ID,主键,自增
  • user_id: BIGINT,用户ID,外键→users.user_id,非空
  • thread_slug: VARCHAR(255),AnythingLLM中的线程slug,非空,唯一
  • thread_name: VARCHAR(255),线程名称,非空
  • last_used_at: TIMESTAMP,最后使用时间,非空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间

邮件系统数据库设计

24. 邮件队列表(Email_Queue)

  • email_id: BIGINT,邮件ID,主键,自增
  • recipient_user_id: BIGINT,接收者用户ID,非空,外键关联Users表
  • recipient_email: VARCHAR(255),接收者邮箱地址,非空
  • network_id: BIGINT,相关局域网ID,可空,外键关联Networks表
  • subject: VARCHAR(255),邮件主题,非空
  • created_at: TIMESTAMP,创建时间,非空,默认当前时间
  • status: ENUM('pending', 'success', 'failed'),发送状态,非空,默认'pending'
  • send_time: TIMESTAMP,发送时间,可空
  • content_html: TEXT,邮件HTML内容,非空
erDiagram %% 用户模块 users { bigint user_id PK "用户ID,主键,自增" varchar username UK "用户名,唯一" varchar email UK "电子邮箱,唯一" char password_hash "加密密码" varchar avatar_url "头像链接" char invitation_code UK "邀请码,唯一" bigint invited_by FK "邀请人ID" timestamp created_at "创建时间" timestamp updated_at "更新时间" timestamp last_login "最后登录时间" enum status "账户状态" } passkey_history { bigint passkey_id PK "Passkey记录ID" bigint user_id FK "用户ID" char passkey UK "用户Passkey,唯一" boolean is_active "是否有效" timestamp created_at "创建时间" timestamp expired_at "过期时间" timestamp next_change_allowed_at "下次允许更改时间" } verification_codes { bigint id PK "验证记录ID" varchar email "邮箱" char token "6位验证码" enum purpose "验证码用途" timestamp created_at "创建时间" timestamp expires_at "过期时间" boolean is_used "是否已使用" timestamp used_at "使用时间" } %% 网络模块 networks { bigint network_id PK "局域网ID" varchar name UK "局域网名称,唯一" text description "描述" varchar physical_address "物理地址" varchar tracker_name "Tracker名称" varchar tracker_url "Tracker URL" boolean is_public "是否公网" timestamp created_at "创建时间" int member_count "成员数量" enum status "状态" } user_network_membership { bigint membership_id PK "关系ID" bigint user_id FK "用户ID" bigint network_id FK "局域网ID" enum role "角色" timestamp joined_at "加入时间" } network_rules { bigint rule_id PK "规则ID" bigint network_id FK "局域网ID" float epsilon_value "ε值" float norm_ratio "标准比例" float delta_value "δ值" float max_download_ratio "最大下载比例" timestamp updated_at "更新时间" bigint updated_by FK "更新者ID" } network_ban_records { bigint record_id PK "记录ID" bigint user_id FK "用户ID" bigint network_id FK "网络ID" datetime banned_at "禁止时间" datetime can_rejoin_at "可重新加入时间" bigint banned_by FK "操作者ID" boolean is_active "记录是否有效" } %% 资源模块 resource_categories { bigint category_id PK "分类ID" varchar name UK "分类名称,唯一" varchar description "描述" varchar icon "图标" } resources { bigint resource_id PK "资源ID" varchar title "标题" text description "描述" bigint uploader_id FK "上传者ID" bigint category_id FK "分类ID" json tags "标签" varchar cover_url "封面URL" bigint file_size "文件大小" int file_count "文件数量" char info_hash UK "InfoHash,唯一" varchar torrent_file_path "种子文件路径" decimal price "价格" boolean is_free "是否免费" int likes_count "点赞数" int torrent_downloads_count "下载次数" enum status "状态" timestamp created_at "创建时间" timestamp updated_at "更新时间" } resource_network_availability { bigint id PK "ID" bigint resource_id FK "资源ID" bigint network_id FK "局域网ID" int torrent_downloads_count "下载次数" timestamp resource_last_upload_at "最后上传时间" timestamp first_available_at "首次可用时间" timestamp last_downloaded_at "最后下载时间" } resource_comments { bigint comment_id PK "评论ID" bigint resource_id FK "资源ID" bigint user_id FK "用户ID" text content "内容" int likes_count "点赞数" boolean is_deleted "是否删除" timestamp created_at "创建时间" timestamp updated_at "更新时间" } likes { bigint like_id PK "点赞ID" bigint user_id FK "用户ID" enum target_type "目标类型" bigint target_id "目标ID" timestamp created_at "创建时间" } user_resource_purchases { bigint purchase_id PK "购买记录ID" bigint user_id FK "用户ID" bigint resource_id FK "资源ID" bigint seller_id FK "卖家ID" timestamp purchase_time "购买时间" decimal points_paid "支付积分" } user_torrent_downloads { bigint download_id PK "下载记录ID" bigint user_id FK "用户ID" bigint resource_id FK "资源ID" bigint purchase_id FK "购买记录ID" bigint network_id FK "局域网ID" timestamp download_time "下载时间" } %% 积分模块 user_points_balance { bigint user_id PK "用户ID" decimal points_balance "积分余额" bigint total_global_uploaded "全局总上传" bigint total_global_downloaded "全局总下载" timestamp updated_at "更新时间" } user_transfer_stats { bigint stat_id PK "统计ID" bigint user_id FK "用户ID" bigint network_id FK "局域网ID" bigint total_uploaded "总上传" bigint total_downloaded "总下载" timestamp updated_at "更新时间" } weekly_transfer_accumulation { bigint accumulation_id PK "累计ID" bigint user_id FK "用户ID" bigint network_id FK "局域网ID" timestamp settlement_start "结算开始时间" timestamp next_settlement "下次结算时间" bigint period_uploaded "周期上传" bigint period_downloaded "周期下载" enum status "状态" decimal normalized_contribution "标准化贡献" decimal points_earned "获得积分" timestamp updated_at "更新时间" } user_points_history { bigint history_id PK "历史ID" bigint user_id FK "用户ID" decimal points_amount "积分数量" enum points_type "积分类型" bigint reference_id "关联ID" timestamp created_at "创建时间" enum applied_status "应用状态" timestamp applied_at "应用时间" } network_settlement_history { bigint history_id PK "历史ID" bigint network_id FK "局域网ID" timestamp settlement_time "结算时间" int user_count "用户数" decimal total_points "总积分" float epsilon_used "使用的ε值" float norm_ratio_used "使用的标准比例" float delta_used "使用的δ值" float variance "方差" decimal min_contribution "最小贡献" int execution_duration "执行耗时" timestamp created_at "创建时间" } transfer_log_samples { bigint log_id PK "日志ID" char passkey "用户Passkey" bigint user_id FK "用户ID" varchar tracker_name "Tracker名称" bigint tracker_id FK "局域网ID" char infohash "资源哈希" bigint resource_id FK "资源ID" timestamp timestamp "时间戳" bigint upload_bytes "上传字节" bigint download_bytes "下载字节" enum process_status "处理状态" timestamp created_at "创建时间" timestamp processed_at "处理时间" } %% RAG模块 rag_documents { bigint document_id PK "文档ID" text content_text "文本内容" bigint previous_resource_id FK "上一资源ID" int accumulation_count "累积次数" varchar document_location "文档位置" enum upload_status "上传状态" enum embedding_status "嵌入状态" timestamp uploaded_at "上传时间" timestamp embedded_at "嵌入时间" timestamp created_at "创建时间" timestamp updated_at "更新时间" } chat_threads { bigint thread_id PK "线程ID" bigint user_id FK "用户ID" varchar thread_slug UK "线程slug,唯一" varchar thread_name "线程名称" timestamp last_used_at "最后使用时间" timestamp created_at "创建时间" } %% 邮件模块 email_queue { bigint email_id PK "邮件ID" bigint recipient_user_id FK "接收者用户ID" varchar recipient_email "接收者邮箱" bigint network_id FK "相关局域网ID" varchar subject "主题" timestamp created_at "创建时间" enum status "发送状态" timestamp send_time "发送时间" text content_html "HTML内容" } %% 用户模块关系 users ||--o{ passkey_history : "has" users ||--o{ user_network_membership : "belongs to" users ||--o{ users : "invites" %% 网络模块关系 networks ||--o{ user_network_membership : "contains" networks ||--o{ network_rules : "has rules" networks ||--o{ network_ban_records : "has bans" users ||--o{ network_ban_records : "banned user" users ||--o{ network_ban_records : "banned by" users ||--o{ network_rules : "updated by" %% 资源模块关系 resource_categories ||--o{ resources : "categorizes" users ||--o{ resources : "uploads" resources ||--o{ resource_network_availability : "available in" networks ||--o{ resource_network_availability : "hosts" resources ||--o{ resource_comments : "has comments" users ||--o{ resource_comments : "comments" users ||--o{ likes : "likes" users ||--o{ user_resource_purchases : "purchases" resources ||--o{ user_resource_purchases : "purchased" users ||--o{ user_resource_purchases : "sells" user_resource_purchases ||--o{ user_torrent_downloads : "enables download" users ||--o{ user_torrent_downloads : "downloads" resources ||--o{ user_torrent_downloads : "downloaded" networks ||--o{ user_torrent_downloads : "download from" %% 积分模块关系 users ||--|| user_points_balance : "has balance" users ||--o{ user_transfer_stats : "has stats" networks ||--o{ user_transfer_stats : "tracks stats" users ||--o{ weekly_transfer_accumulation : "accumulates" networks ||--o{ weekly_transfer_accumulation : "accumulates in" users ||--o{ user_points_history : "has history" networks ||--o{ network_settlement_history : "settles" users ||--o{ transfer_log_samples : "transfers" networks ||--o{ transfer_log_samples : "logs in" resources ||--o{ transfer_log_samples : "logs for" %% RAG模块关系 resources ||--o{ rag_documents : "referenced in" users ||--o{ chat_threads : "creates" %% 邮件模块关系 users ||--o{ email_queue : "receives" networks ||--o{ email_queue : "related to"