2009年5月1日星期五

搭建数据库系统(SQLite+C)~基础篇


SQLite
http://www.sqlite.org/
License:public domain
当前版本3.6.13


数据库概念
数据库的产生是随着人们处理的数据变得庞大和复杂,单纯以人工或文件形式的管理已无法很好的满足需求。运用不同数据库管理系统(比如本篇的SQLite),建立基于数据库的硬件软件和相关人员的结合的数据库系统。数据库的数据模型是对实体模型信息化的描述,如网状,层次,关系模型。其中在各数据库中关系模型被广泛的采用,将现实中的实体与关系,运用关系代数,建立包含多张有列与项的数据表。此外,根据表中列的函数依赖关系,可划分成不同级别的范式。

SQLite特点
单文件数据库
无需配置和安装服务进程
小巧高效
数据库系统与数据库文件跨平台
动态数据类型
变长记录
代码公开协议开放
SQL语句编译为虚拟代码
可以自定义扩展
(也意味不适用于C/S,高容量,特别巨大或高并发的数据库)

SQL基础提示
创建表
CREATE TABLE <表名>(<列名>[,<列名n>]);
列可选参数 <列名> 参数 [参数]
数据类型 <类型名>[(精度)] TEXT|NUMERIC|INTEGER|REAL|NONE
数据将被储存为的类型是 NULL|INTEGER|REAL|TEXT|BLOB
(注 SQLite为除整数主键其余为动态类型,会根据类型名称中出现的字符串(比如INT,FLOA,CHAR,BLOB...)限定储存类型)
主键 PRIMARY KEY
非空 NOT NULL
自动递增 AUTOINCREMENT
插入记录
INSERT INTO <表名> values(<数据>[,<数据n>]);
查询记录
SELECT *|<列名>[,<列名n>] FROM <表名>;
可选参数
条件 WHERE <表达式>
排序"ORDER BY <列名> [ASC|DESC]"
分组 GROUP BY <列名> [HAVING <条件表达式>]
条数 LIMIT
关联 <表名> JOIN <表名>
可以嵌套使用查询语句
删除记录
DELETE FROM <表名> WHERE <条件表达式>;
更新记录
UPDATE <表名> SET <列名>=<数据> [WHERE <条件表达式>];
创建索引 用以提升数据表操作速度
CREATE INDEX <索引名> ON <表名>(<列名>);
创建视图 包含以储存查询的虚表
CREATE VIEW <视图名> AS
删除数据库对象
DROP TABLE|INDEX|VIEW <对应名称>
触发
事务 进行大量操作,确保完整性
BEGIN TRANSACTION;COMMIT;ROLLBACK;
VACUUM 整理已移除数据的空间
支持函数
http://www.sqlite.org/lang_corefunc.html
参见开发文档中"SQL As Understood By SQLite"
SQLite能理解的SQL

SQLite命令行
建立数据库
sqlite3 <文件名> [<语句>](需先下载"sqlite3.exe"或"sudo apt-get install sqlite3")
此时在交互模式,可用".help"查看帮助。
查询";"结尾,可以换行,用"--"/"/**/"注释行和块
".dump"用于以SQL格式将数据库输出(可以重定向)
分析工具 sqlite3_analyzer

图形界面工具
sqlitebrowser 跨平台,可用于表的创建和显示修改
其他管理工具(For Win) sqliteadmin,SQLiteSpy


C语言接口
示例 http://www.sqlite.org/quickstart.html
说明 http://www.sqlite.org/cintro.html
参考 http://www.sqlite.org/capi3ref.html
示例在ubuntu810下编译通过,需安装包"libsqlite3-dev",编译增加参数"-lsqlite3"。

练手
人员管理系统,人员有自身属性或归于某一分类,同时某一分类也在另一表中存储它的属性,大体构想如此。
不过下面是写一个电子辞典(我取名"Dictite",暂无实用价值),作用是用来查英汉的单词解释,数据是单词和对应解释。
数据表有两列,为"word","expl",都是字符串,例句可以放在单独的表中。
下一步,开始写代码(有空再慢慢补,尚未调试)

/* A Simple Dict Prog Example V0 by ee.zsy Published Under BSD License
"gcc -Wall -O2 -o Dictite Dictite.c -lsqlite3"
put "Dictite word expl"
get "Dictite word"
"CREATE TABLE DictiteMain(word CHAR,expl CHAR);"
*/

--感觉用"Dictite put word expl"语法繁琐些但可以减少输入错误。
编译打包加说明文档即可发布,日后可根据需求和反馈维护或继续开发。

参考
http://www.sqlite.com.cn/MySqlite/4/523.Html
http://www.yuanma.org/data/2008/1212/article_3407.htm
http://www.2ky.cn/h/149/4110.html
http://www.lupaworld.com/action-viewstutorial-itemid-9338.html
wikipedia.org
官方文档

其他
另一个著名的嵌入式数据库是Berkeley DB,以被Oracle收购。
MySQL,目前在网络上流行的数据库服务器,已用于众多网站。
目前来看本文问题不少,汗一下。
第一次发布时间:09.5.10
数据结构SQLite是基于B+Tree。

没有评论: