Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

exoticknight's blog


年寿有时而尽,荣乐止乎其身,二者必至之常期,未若文章之无穷。

python × Qt应用开发 · 4 -- 数据库设计

在上一篇探讨MVC模式使用的博文中,已经成功实现了Tree Viewwidget的数据显示。而实际上,其中的数据是我们自己硬编码的,显然不符合要求。节点中的_data域也只是简单的字符串,没有体现出MVC的优势。对于本应用中要求的比较有结构化的数据,很自然地考虑使用数据库来组织。

数据库的考虑

作为本地应用,考虑使用python自带的嵌入式数据库sqlite3。SQLite跟普通数据库管理如MYSQL等大同小异,SQL语句也是相差不大,一般有学习过数据库的读者找找资料大概就能轻松理解,而没有使用过数据库或者不懂数据库的读者则应该先补充好数据库的知识再来阅读本文。

在python,只需要加上import sqlite3语句就能使用SQLite,方便至极。

笔记本

笔记本的数据结构是一棵棵树,叶子节点是章节。考虑使用一个名为notebook的表来保存笔记本数据,一个名为chapter的表来保存章节。

打开数据库设计工具,这里选用了一个在线的工具WWW SQL Designer。画出以下设计图。

数据库设计图1

notebook

字段 内容
id 主键
name 笔记本名称

chapter

字段 内容
id 主键
name 章节名称
nid 所属笔记本id,外键

document

字段 内容
id 主键
cid 章节id,外键
title 文档标题
content 文档内容
last_update 文档最后更新时间

然后使用输出功能输出sql脚本文件,注意这里的代码在我的电脑上是能够运行的,但不一定能够在你的电脑上运行:

CREATE TABLE 'chapter' (  
'id' INTEGER NOT NULL  PRIMARY KEY AUTOINCREMENT,  
'name' TEXT NOT NULL  DEFAULT 'new group',  
'nid' INTEGER NOT NULL  DEFAULT 0 REFERENCES 'notebook' ('id') REFERENCES 'notebook' ('id')  
);

CREATE TABLE 'document' (  
'id' INTEGER NOT NULL  PRIMARY KEY AUTOINCREMENT,  
'cid' INTEGER NOT NULL  DEFAULT 0 REFERENCES 'chapter' ('id') REFERENCES 'chapter' ('id'),  
'title' TEXT NOT NULL  DEFAULT 'New document',  
'content' TEXT DEFAULT NULL,  
'last_update' NUMERIC NOT NULL  
);

CREATE TABLE 'notebook' (  
'id' INTEGER NOT NULL  DEFAULT NULL PRIMARY KEY AUTOINCREMENT,  
'name' TEXT NOT NULL  DEFAULT 'new notebook'  
);

生成数据库

保存sql脚本到工程根目录下的data.sql中,到SQLite官网下载windows版本的CLI文件sqlite3.exe,同样放在工程根目录下。执行以下命令:

sqlite3.exe data.db < data.sql  

如无报错则生成了一个data.db的数据库文件了。

小结

文章只说明了各个表和字段的关系,字段的详细属性请查看sql语句。


About the author

exoticknight


Discussions

comments powered by Disqus