用户模块数据库设计
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,点赞时间,非空,默认当前时间
注明
- User_Torrent_Downloads表记录的是用户下载种子文件(.torrent)的行为,而非实际文件传输记录
- 实际文件的上传下载记录将在积分模块中设计,不在此处包含
- 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内容,非空
评论区