TREK数据库设计全解析:SQLite Schema、171步迁移机制与种子数据完整指南
TREK数据库设计全解析SQLite Schema、171步迁移机制与种子数据完整指南【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREKTREK是一款自托管旅行规划器支持实时协作、互动地图、PWA、SSO 登录、预算管理和行李清单等。它的后端只依赖一个 SQLite 文件就把整套系统撑了起来本文将带你完整看懂它的数据库设计SQLite Schema 如何组织 50 张表、171 步迁移机制如何保证老数据平滑升级以及种子数据如何在首次启动时自动就绪。一个文件搞定SQLite WAL 的极简架构TREK 使用 better-sqlite3 中启动时依次执行三件事建表调用 schema.ts 中的createTables用CREATE TABLE IF NOT EXISTS幂等地创建全部表结构迁移执行 migrations.ts 中的版本化升级播种运行 seeds.ts 写入种子数据数据库连接做了三项关键配置database.tsPRAGMA 配置作用journal_mode WAL写前日志读写并发不阻塞适合多人协作场景busy_timeout 5000遇到锁定时最多等待 5 秒避免并发冲突直接报错foreign_keys ON开启外键约束保证数据完整性在 Docker 部署时只需把./data挂载为卷见 docker-compose.yml数据库文件就被持久化在宿主机上备份时直接复制这个文件即可。测试与生产环境的路径策略也很聪明NODE_ENVtest时每个测试进程使用独立的内存数据库:memory:避免并行测试互相干扰E2E 测试可通过TREK_DB_FILE环境变量指向一次性数据库database.ts。核心表结构从 users 到 trips、places整个 Schema 定义在 schema.ts 中按业务域可以分成 6 大块。1️⃣ 用户与安全域users表是系统的地基除了username、email、password_hash外还内嵌了大量集成凭证字段地图 API Key、天气 Key、Immich 相册、群晖 NAS 等。围绕它的安全相关表包括password_reset_tokens密码重置令牌存哈希而非明文webauthn_credentialsPasskey 公钥凭据mfa_enabled/mfa_backup_codes两步验证与备用码直接在 users 表上2️⃣ 行程核心域这是整个应用的中枢关系链是trips行程→ days天数→ day_assignments日程安排→ places地点trips行程主表含起止日期、货币、封面图、提醒天数days按UNIQUE(trip_id, day_number)保证一天不重复places地点表携带经纬度、Google Places ID、交通方式、预订状态等 20 字段day_assignments把地点挂到某天order_index控制当天顺序trip_membersUNIQUE(trip_id, user_id)实现多人协作删除语义经过精心设计删行程会ON DELETE CASCADE级联清理全部子数据而地点上的分类外键用ON DELETE SET NULL删分类不会误伤地点。3️⃣ 费用与文档域budget_items记录每笔花费分类、金额、分摊人数、天数配合budget_item_members实现谁付款、谁已付平的 AA 制结算photos和trip_files则分别管理行程照片和文档文件还可以关联到具体的预订reservations或日程项。4️⃣ 协作域Collab 插件四张collab_*表支撑实时协作便签、投票含collab_poll_votes投票记录、聊天消息及表情回应。每条表都通过trip_id外键隔离到具体行程并建有按行程查询的索引5️⃣ 插件化扩展域addons表用id enabled控制功能开关packing、budget、collab、vacay、atlas 等都注册在此这让管理员可以按实例禁用不需要的功能。Vacay假期日历、Collections地点收藏夹等功能则各有一组独立表遵循插件自带表的惯例。6️⃣ 系统域audit_log记录审计日志、notifications存储可交互通知支持简单消息、是/否询问、跳转三种类型、app_settings是键值对全局配置表。此外所有高频查询字段都建了索引schema.ts比如notifications(recipient_id, is_read, created_at DESC)直接服务于未读通知列表页。迁移机制171 步版本化升级事务保护不丢数据migrations.ts 是 TREK 数据库演进的核心目前累积了171 个迁移步骤。它的工作方式非常经典且稳健① 版本追踪schema_version表记录当前已执行的版本号。首次启动时系统会通过探测users表是否已有unsplash_api_key列来猜老库的初始版本实现老版本数据库的自动接入。② 顺序执行 事务保护从当前版本开始逐步执行到最新版本。每个迁移都在db.transaction()中运行任何一步失败都会自动回滚并以退出码 1 终止进程绝不让数据库停在半迁移状态migrations.ts[DB] Running migration 42/171 [DB] Migrations complete — schema version 171③ 防御式写法大量迁移用try/catch吞掉 duplicate column name 错误保证在不同基线版本上重跑都安全建表则统一用IF NOT EXISTS。④ 不只是加列还做数据搬运。例如第 22 步把预订信息从places表迁移到day_assignments表地点的预订和日程的预订合并第 83 步把trip_photos整表重建为带provider字段的通用结构——用建新表 → 拷数据 → 删旧表 → 改名的四板斧完成平滑重构。⑤ 安全加固也走迁移把app_settings里明文的 OIDC 客户端密钥、SMTP 密码以及users表里明文的 Immich API Key 统一加密为enc:v1:前缀格式migrations.ts。对新手来说这套机制意味着你从任何旧版本升级 TREK数据都会自动、安全地迁移到最新结构无需手动动 SQL。种子数据首次启动一切自动就绪建表和迁移完成后seeds.ts 的runSeeds会注入三类种子数据。管理员账户first-run admin如果users表为空seeds.ts配置了ADMIN_EMAILADMIN_PASSWORD→ 用你的凭据创建未配置 → 自动生成随机密码邮箱为admintrek.local并在控制台用醒目边框打印出来账户带must_change_password1标记首次登录后强制改密配置了OIDC_ONLYtrue→ 跳过创建第一个 SSO 登录的用户自动成为管理员默认地点分类10 个开箱即用的分类Hotel 、Restaurant ️、Attraction ️、Shopping ️、Transport 、Activity 、Bar/Cafe ☕、Beach ️、Nature 、Other 每个都带颜色和图标建行程时点选地点即可直接使用。插件与照片源seedAddons把 13 个插件写入addons表packing、budget、documents、vacay、atlas、collab 等默认开启MCP、journey、AirTrail 默认关闭并注册 Immich 与 Synology Photos 两个照片源及其配置字段定义——插件表单因此完全数据驱动无需改代码。Demo 模式一键体验设置DEMO_MODEtrue后demo-seed.ts 会接管创建admin和demo两个演示用户密码分别为admin12345/demo12345关闭注册并写入东京与京都等完整示例行程——包含天数、地点、打包清单、预算项、预订和协作便签让你不配置任何数据就能完整体验全部功能。备份与运维一个文件的底气正因为所有状态都收敛在travel.db备份异常简单WAL checkpoint 后复制该文件即可TREK 内置的备份功能正是这样做的运维场景操作要点备份复制data/travel.dbWAL 模式下建议先触发 checkpoint升级版本直接换新镜像迁移自动执行无需手工 SQL重置管理员运行 reset-admin.js 即可换机迁移挂载新卷 → 拷入 db 文件 → 启动总结TREK 的数据库设计堪称自托管项目的范本SQLite 单文件 WAL 并发模型让部署门槛降到最低幂等建表 171 步事务化迁移让版本升级对数据零风险种子数据则保证首次启动即有管理员、分类和插件生态可用。对于想学习如何给 Node.js 应用设计可演进的数据库的开发者server/src/db/ 目录下的四个文件schema.ts、migrations.ts、seeds.ts、database.ts值得逐行精读。【免费下载链接】TREKA self-hosted travel/trip planner with real-time collaboration, interactive maps, PWA support, SSO, budgets, packing lists, and more.项目地址: https://gitcode.com/GitHub_Trending/nomad22/TREK创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

TD3在Hardcore环境实战:从崩溃到收敛的连续控制指南

TD3在Hardcore环境实战:从崩溃到收敛的连续控制指南

在BipedalWalkerHardcore这个环境上跑通TD3,是我在连续控制任务上花时间最多的一次实战。它跟普通的BipedalWalker-v3看起来只差一个“Hardcore”后缀,实际上难度完全不在一个量级。当你终于让两足机器人走出第一步、连续跑过几个随机地形、最终在300分奖…

2026/11/9 20:09:48 阅读更多 →
IMM-ISOMAP:面向流式数据的增量式流形学习方法

IMM-ISOMAP:面向流式数据的增量式流形学习方法

简介:本资源是一套面向机器学习与数据科学方向研究者及高年级本科生的增量式流形学习实践代码,聚焦于非线性降维在动态数据流场景下的工程实现。提供的MATLAB源码完整实现了扩展型增量ISOMAP(IMM-ISOMAP)算法,支持逐批…

2026/10/30 13:15:52 阅读更多 →
HTML5 3D射击游戏源码解析:Canvas伪3D渲染与性能调优

HTML5 3D射击游戏源码解析:Canvas伪3D渲染与性能调优

简介:3D反恐精英HTML5游戏源码是一份基于WebGL与Canvas的完整3D射击游戏实例,适合前端开发者、游戏开发初学者以及网页游戏爱好者研究现代浏览器游戏实现。压缩包内共12个文件,包含2个HTML入口、核心JavaScript脚本、PHP服务端文件&#xff0…

2026/10/24 4:54:18 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/12 5:00:00 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/12 5:13:20 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/12 5:13:20 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/12 18:22:26 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/12 18:22:25 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/12 5:13:20 阅读更多 →

日新闻

周新闻

月新闻