1. 项目背景与动机
作为一个长期从事数据工作的从业者,我一直在寻找一种能够完美记录个人生活轨迹的数据管理方式。传统的笔记软件和待办事项应用总是让我感到局限——它们要么过于结构化,要么太过自由散漫。直到某天整理书房时,看着满架子的手账本和便签纸,我突然意识到:为什么不建立一个真正属于自己的个人数据库?
这个"world_fullof_flower的个人数据库"项目就这样诞生了。它不同于企业级的MySQL或MongoDB,也不是简单的Notion模板克隆,而是一个完全按照我的思维方式和记录习惯定制的数据管理系统。Day1记录的是整个系统的构思和基础架构搭建过程。
提示:个人数据库的价值不在于技术复杂度,而在于与使用者思维模式的高度契合。这也是商业软件难以满足个性化需求的原因。
2. 核心设计原则
2.1 数据维度设计
经过多次迭代,我确定了三个核心数据维度:
- 时间线:按时间顺序记录的所有事件
- 知识图谱:概念之间的关联关系
- 资源库:文件、链接等实体资源
这种三维结构确保任何信息都能找到合适的存储位置。比如读完一本书,会在时间线留下阅读记录,在知识图谱建立主题关联,在资源库保存电子书文件。
2.2 技术选型考量
对比了多种方案后,我选择了以下技术组合:
- 数据库:SQLite(轻量、单文件、全功能SQL支持)
- 前端:Tauri+React(跨平台、低内存占用)
- 同步方案:Git版本控制(历史追溯+多设备同步)
这个组合在功能性和简洁性之间取得了完美平衡。特别是SQLite,它的单文件特性让备份变得极其简单——只需要复制一个.db文件。
3. 基础架构实现
3.1 数据库Schema设计
核心表结构如下:
| 表名 | 主要字段 | 用途 |
|---|---|---|
| events | id, timestamp, type, content | 记录时间线事件 |
| concepts | id, name, description | 存储知识概念 |
| relations | source_id, target_id, type | 概念关联关系 |
| resources | id, path, type, metadata | 管理文件资源 |
这个设计最巧妙的是relations表,它通过type字段区分不同关系类型(如"属于"、"反对"、"引用"等),实现了灵活的知识网络构建。
3.2 初始数据导入
我开发了一个简单的命令行工具,将现有数据批量导入:
python import_legacy.py \ --journal ~/Documents/journal/*.md \ --bookmarks ~/Downloads/bookmarks.html这个工具会自动解析Markdown日记的YAML元数据,将每日记录转为events表条目;同时从浏览器书签中提取URL,创建对应的resource记录。
4. 开发环境搭建
4.1 项目初始化
使用以下命令创建Tauri项目:
npm create tauri-app@latest personal-db \ --template react-ts cd personal-db cargo tauri dev特别注意修改了tauri.conf.json中的这些配置:
{ "build": { "devPath": "http://localhost:3000", "distDir": "../build" }, "tauri": { "allowlist": { "fs": { "scope": ["$HOME/Documents/personal-db/**"] } } } }4.2 数据库连接层
采用Rust的rusqlite库处理数据库操作。关键实现片段:
// src/database.rs pub struct Database { conn: Connection, } impl Database { pub fn new(path: &str) -> Result<Self> { let conn = Connection::open(path)?; conn.execute_batch(include_str!("schema.sql"))?; Ok(Database { conn }) } pub fn add_event(&self, event: &Event) -> Result<()> { self.conn.execute( "INSERT INTO events (timestamp, type, content) VALUES (?1, ?2, ?3)", params![event.timestamp, event.type, event.content], )?; Ok(()) } }5. 用户界面原型
5.1 主界面布局
使用React+ChakraUI构建了三栏式布局:
- 左侧:时间线导航
- 中间:当前选中内容
- 右侧:关联知识图谱预览
关键组件结构:
function App() { return ( <Box display="flex" height="100vh"> <TimelinePanel width="300px" /> <MainContentPanel flex={1} /> <KnowledgeGraphPanel width="400px" /> </Box> ); }5.2 数据可视化
采用ForceGraph3D展示知识图谱关系:
import ForceGraph3D from 'react-force-graph-3d'; function Graph({ nodes, links }) { return ( <ForceGraph3D graphData={{ nodes, links }} nodeAutoColorBy="group" linkDirectionalArrowLength={3.5} /> ); }6. Day1成果与反思
经过8小时的开发,目前实现了:
- 数据库基础结构搭建
- 旧数据导入流水线
- 基本的前端框架
- 简单的知识图谱可视化
遇到的主要挑战:
- Tauri的文件系统权限配置需要特别注意
- 大量历史数据的去重和标准化处理
- React状态管理与Rust后端的通信延迟
经验分享:在开发个人工具时,应该尽早建立最小可用版本。我的第一个可运行版本只用了3小时就完成了,这比追求完美设计要重要得多。
下一步计划:
- 实现全文搜索功能
- 添加移动端同步支持
- 开发浏览器插件用于快速收藏网页
这个个人数据库项目将会持续迭代。不同于商业软件,它完全按照我的思维方式成长,就像数字化的第二个大脑。如果你也想构建自己的知识管理系统,不妨从最简单的SQLite开始,逐步添加符合自己需求的功能模块。