主键设计uuid_使用wxPython打造自己的印象笔记(5)数据库设计

74726203b70b424bedc13a78ef9ba7de.png

前面四篇介绍了wxPython的一些基础知识,从这一篇文章开始,我们就准备进行实际的开发工作了。

需求分析

首先进行需求分析,看看我们的笔记需要哪些功能。

73df93be896162cec7a27e7976bc701c.png
  • 最左侧是笔记本列表,可以通过右键菜单来使用笔记本的创建、修改和删除功能。创建时支持无限子目录。
  • 中间一栏是笔记列表,可以通过右键菜单来拷贝笔记,移动笔记以及删除笔记。并且可以通过顶部的按钮对笔记进行排序,还可以通过搜索框来搜索笔记,并支持搜索结果高亮。
  • 最右边是一个富文本编辑器,可以自动保存笔记标题和内容。

以上就是笔记本的主要功能,在前言部分还提及到,除了笔记功能以外,还支持待办事项管理功能,来看一个截图。

9b322369c2e2a252b6085cd4062dfa9c.png

点击底部状态栏的数字区域,就会弹出如上图所示的待办事项面板,面板下方有一个工具栏,可以进行增删改查功能。状态栏的数字区域显示了当前任务完成情况。

因为我们的主要任务是开发笔记本,所以待办事项的实现会放在最后。

可以看到,主要功能就是笔记本和笔记的增删改查,暂时不考虑内容同步。

对于数据存储,我们可以将笔记本和笔记数据存放在数据库里面,但笔记详情可以考虑保存在单个文件里面,在数据库里面存储实际的文件路径即可,这样做便于笔记管理。

接下来我们来设计一下数据库。

数据库设计

考虑到数据便携性,我们准备使用SQLite数据库。从上面的需求分析可以看到,笔记应用涉及到了三个实体,分别是笔记本、笔记、待办事项,接下来逐个设计表结构。

笔记本实体

对于笔记本,我们需要以下属性:

  • id:主键
  • parent_id 上一级笔记本id
  • name: 笔记本名称
  • description 笔记本描述
  • updated_at 更新时间
  • created_at 创建时间

对应的SQLite语句是

CREATE TABLE IF NOT EXISTS `notebooks` (
  `id` integer  NOT NULL PRIMARY KEY AUTOINCREMENT
,  `name` varchar(20) NOT NULL DEFAULT ''
,  `parent_id` integer  DEFAULT NULL
,  `description` varchar(300) DEFAULT ''
,  `updated_at` timestamp NOT NULL DEFAULT current_timestamp
,  `created_at` timestamp NOT NULL DEFAULT current_timestamp
,  CONSTRAINT `notebooks_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `notebooks` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);

650bf7e2e8b81d0f56d024189c12a57e.png

笔记实体

一个笔记本包含多条笔记,需要的属性如下:

  • id 主键
  • title 笔记标题
  • notebook_id 笔记本id
  • local_uuid 笔记所在文件夹,这个接下来会讲到
  • updated_at 更新时间
  • created_at 创建时间

因为笔记是富文本,所以我们将笔记详情保存为html文件,并将对应的纯文本保存为txt文件,用于笔记列表里面的预览。这样每个笔记就有两个文件了,我们将这两个文件放在一个文件夹里面,文件夹名字通过uuid来实现,这就是为什么笔记实体需要 local_uuid 的原因。

对应的SQLite语句如下

CREATE TABLE IF NOT EXISTS `notes` (
  `id` integer  NOT NULL PRIMARY KEY AUTOINCREMENT
,  `title` varchar(30) DEFAULT ''
,  `notebook_id` integer  DEFAULT NULL
,  `created_at` timestamp NULL DEFAULT current_timestamp
,  `updated_at` timestamp NULL DEFAULT current_timestamp
,  `local_uuid` varchar(36) DEFAULT ''
,  CONSTRAINT `notes_ibfk_1` FOREIGN KEY (`notebook_id`) REFERENCES `notebooks` (`id`) ON DELETE CASCADE
);

待办事项实体

一条笔记会关联多个待办事项,不难分析得出以下属性:

  • id 主键
  • title 标题
  • content 详情内容
  • remark 备注
  • note_id 关联的笔记id
  • group 分组名称
  • is_finished 是否已完成
  • finished_at 完成时间
  • updated_at 更新时间
  • created_at 创建时间

对应的SQLite语句如下

CREATE TABLE IF NOT EXISTS `todos` (
  `id` integer  NOT NULL PRIMARY KEY AUTOINCREMENT
,  `title` varchar(150) NOT NULL DEFAULT ''
,  `content` varchar(5000) DEFAULT ''
,  `remark` varchar(5000) DEFAULT ''
,  `finished_at` datetime DEFAULT NULL
,  `is_finished` integer DEFAULT '0'
,  `note_id` integer  DEFAULT NULL
,  `created_at` timestamp NULL DEFAULT current_timestamp
,  `updated_at` timestamp NULL DEFAULT current_timestamp
,  `group` varchar(200) DEFAULT NULL
,  CONSTRAINT `todos_ibfk_1` FOREIGN KEY (`note_id`) REFERENCES `notes` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
);

总结

以上就是笔记本应用的数据库设计,我们会在接下来的文章中通过Python来创建这些数据表以及相关索引,暂时不需要手动运行上面的SQL语句。下一篇将介绍笔记本应用的界面组成和实现思路,并搭建基本框架。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值