7月 052014
 

所有应用软件之中,数据库可能是最复杂的。

MySQL的手册有3000多页,PostgreSQL的手册有2000多页,Oracle的手册更是比它们相加还要厚。

但是,自己写一个最简单的数据库,做起来并不难。Reddit上面有一个帖子,只用了几百个字,就把原理讲清楚了。下面是我根据这个帖子整理的内容。

一、数据以文本形式保存

第一步,就是将所要保存的数据,写入文本文件。这个文本文件就是你的数据库。

为了方便读取,数据必须分成记录,每一条记录的长度规定为等长。比如,假定每条记录的长度是800字节,那么第5条记录的开始位置就在3200字节。

大多数时候,我们不知道某一条记录在第几个位置,只知道主键(primary key)的值。这时为了读取数据,可以一条条比对记录。但是这样做效率太低,实际应用中,数据库往往采用B树(B-tree)格式储存数据。

二、什么是B树?

要理解B树,必须从二叉查找树(Binary search tree)讲起。

二叉查找树

二叉查找树是一种查找效率非常高的数据结构,它有三个特点。

(1)每个节点最多只有两个子树。

(2)左子树都为小于父节点的值,右子树都为大于父节点的值。

(3)在n个节点中找到目标值,一般只需要log(n)次比较。

二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。

Continue reading »

3月 272009
 

      1,需求分析

      目标是获得用户对数据库需求的实际要求、全面准确的描述。

      2,概念结构设计

      即设计数据库的概念结构,是整个数据库设计的关键。

      在需求分析的基础上,用概念数据模型(例如E-R图)表示数据及其相互间的联系。概念数据模型是与DBMS无关、面向现实世界的数据模型,因而也易于为用户所理解。

      在概念设计阶段,设计人员可以致力于模拟现实世界,而不必过早地纠缠于DBMS所规定的各种细节。在此阶段,用户可以参与和评价数据库的设计,从而有利于保证设计的正确性和质量。在本阶段所设计的数据模式,虽然不能直接在DBMS上实现,但由于易于被用火所理解,且独立于DBMS,因而不但用于后续的设计,而且也是与用户交流和数据库管理的重要资料。

      3,逻辑结构设计

      逻辑设计又称作实现设计,目的是从概念设计到处数据库逻辑结构(包括数据库模式和子模式),能够被DBMS处理,并在功能、性能、完整性、一致性约束和数据库的可扩展性等各方面满足用户要求,并对其进行优化。

      4,数据库物理设计  

      数据库物理设计是对为逻辑数据模型选取一个最适合应用环境的物理结构(包括存储结构和存取方法)。

      5,数据库实施

      在数据库实施阶段,设计人员运用DBMS提供的数据语言及其宿主语言,根据逻辑设计和物理设计的结果建立数据库,编制与调试应用程序,组织数据入库,并进行试运行。

      6,数据库运行和维护
      数据库应用系统经过试运行后即可投入正式运行。在数据库系统运行过程中必须不断地对其进行评价、调整与修改。

3月 272009
 

      数据库设计的目标是在DBMS的支持下,按照应用的要求,为某一部门或组织设计一个结构合理、使用方便、效率较高的数据库。具体来说,应该从满足用户要求、数据库性能、对现实世界模拟的精确程度、开发速度和质量等方面加以考虑。

      1,对于用户和企业来说,最关心的问题是数据库能否满足要求。因此设计者必须充分调查各方面的要求和约束条件,精确地定义系统要求。

      2,数据库通过数据模型来模拟现实世界信息与信息间的联系。模拟的准确程度越高,就越能反映实际,用户就更能充分地利用数据库。准确地反映现实世界,一方面依赖于所采用的数据模型,另一方面要靠数据库设计者的努力。为了提高设计质量,必须充分理解用户要求,掌握系统环境,利用良好的软件工程规范与工具,充分发挥DBMS的特点。

      3,数据库必须有良好的性能,数据库存储结构化的大量数据,具有数据独立性、冗余少、数据安全、完整、一致、可靠等特点,这些都是数据库设计中要考虑到的。

3月 272009
 

      数据库设计是指对于给的应用,建立性能良好、能满足用户使用要求、又能被选定的DBMS所接受的数据库系统模式。按照该模式建立的数据库,能够完整地反映现实世界中信息与信息之间的联系、能够有效地进行数据存储、能够方便地执行各种数据检索和处理操作,并且有利于数据维护和数据控制管理的工作。

      数据库的设计包括逻辑设计和物理设计两大步骤。

      逻辑设计:包括如何表达待管理的信息、如何使用模型概念化信息、如何把概念模型转化为没有冗余和异常的关系,以及如何最终确定逻辑表等。

      物理设计:为逻辑结构选取最适合应用环境的物理结构的过程,包括确定数据库在物理设备上的存储结构和存取方法。

2月 132008
 

MySql数据库修复
                                      

今天早上发现因为磁盘满造成了Mysql服务没法正常运行,首先腾硬盘空间,再停止 mysqld服务,还用了下kill杀掉了mysqld进程,后来发现数据库虽然启动了,但是数据表损坏了,google搜索了下,用myisamchk 修复了下数据表文件,成功。特摘录下文。

检查和修复MySQL数据文件

由于临时断电,使用kill -9中止MySQL服务进程,或者是Jessica的朋友idiot@%.host.net又犯了一个错误,所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时,服务正在改变文件,文件可能会留下错误的或不一致的状态。因为这样的毁坏有时是不容易被发现的,当你发现这个错误时可能是很久以后的事了。于是,当你发现这个问题时,也许所有的备份都有同样的错误。

MySQL参考手册的第十五章讲述了MySQL自带的myisamchk的功能,以及如何使用它检查和修复你的MySQL数据文件。虽然这一章对于每个想要搭建一个强壮的MySQL服务的人都是推荐阅读的,我们还是有必要在这里对其中的要点进行讨论。

在我们继续之前,你必须意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的。如果MySQL服务正在使用某一文件,并对myisamchk正在检查的文件进行修改,myisamchk会误以为发生了错误,并会试图进行修复–这将导致MySQL服务的崩溃!这样,要避免这种情况的发生,通常我们需要在工作时关闭MySQL服务。作为选择,你也可以暂时关闭服务以制作一个文件的拷贝,然后在这个拷贝上工作。当你做完了以后,重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)。

MySQL数据目录不是太难理解的。每一个数据库对应一个子目录,每个子目录中包含了对应于这个数据库中的数据表的文件。每一个数据表对应三个文件,它们和表名相同,但是具有不同的扩展名。tblName.frm文件是表的定义,它保存了表中包含的数据列的内容和类型。tblName.MYD文件包含了表中的数据。tblName.MYI文件包含了表的索引(例如,它可能包含lookup表以帮助提高对表的主键列的查询)。

要检查一个表的错误,只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名,或者是表的索引文件名:

% myisamchk /usr/local/mysql/var/dbName/tblName
% myisamchk /usr/local/mysql/var/dbName/tblName.MYI

上面的两个命令都可以执行对指定表的检查。要检查数据库中所有的表,可以使用通配符:

% myisamchk /usr/local/mysql/var/dbName/*.MYI

要检查所有数据库中的所有表,可以使用两个通配符:

% myisamchk /usr/local/mysql/var/*/*.MYI

如果不带任何选项,myisamchk将对表文件执行普通的检查。如果你对一个表有怀疑,但是普通的检查不能发现任何错误,你可以执行更彻底的检查(但是也更慢!),这需要使用–extend-check选项:

% myisamchk –extend-check /path/to/tblName
对错误的检查是没有破坏性的,这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟。另一方面,修复选项,虽然通常也是安全的,但是它对你的数据文件的更改是无法撤消的。因为这个原因,我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份,并确保在制作这个备份之前你的MySQL服务是关闭的。

当你试图修复一个被破坏的表的问题时,有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立,删除信息所指出的文件并再试一次–这通常是上一次修复操作遗留下来的。

这三种修复方法如下所示:

% myisamchk –recover –quick /path/to/tblName
% myisamchk –recover /path/to/tblName
% myisamchk –safe-recover /path/to/tblName

第一种是最快的,用来修复最普通的问题;而最后一种是最慢的,用来修复一些其它方法所不能修复的问题。

检查和修复MySQL数据文件

如果上面的方法无法修复一个被损坏的表,在你放弃之前,你还可以试试下面这两个技巧:

如果你怀疑表的索引文件(*.MYI)发生了不可修复的错误,甚至是丢失了这个文件,你可以使用数据文件(*.MYD)和数据格式文件(*.frm)重新生成它。首先制作一个数据文件(tblName.MYD)的拷贝。重启你的MySQL服务并连接到这个服务上,使用下面的命令删除表的内容:

mysql> DELETE FROM tblName;

在删除表的内容的同时,会建立一个新的索引文件。退出登录并重新关闭服务,然后用你刚才保存的数据文件(tblName.MYD)覆盖新的(空)数据文件。最后,使用myisamchk执行标准的修复(上面的第二种方法),根据表的数据的内容和表的格式文件重新生成索引数据。

如果你的表的格式文件(tblName.frm)丢失了或者是发生了不可修复的错误,但是你清楚如何使用相应的CREATE TABLE语句来重新生成这张表,你可以重新生成一个新的.frm文件并和你的数据文件和索引文件(如果索引文件有问题,使用上面的方法重建一个新的)一起使用。首先制作一个数据和索引文件的拷贝,然后删除原来的文件(删除数据目录下有关这个表的所有记录)。

启动MySQL服务并使用当初的CREATE TABLE文件建立一个新的表。新的.frm文件应该可以正常工作了,但是最好你还是执行一下标准的修复(上面的第二种方法)。

5月 032007
 

mysql字符集编码

字符集和整理
整理 描述
armscii8 (ARMSCII-8 Armenian)
armscii8_bin 亚美尼亚语, 二进制
armscii8_general_ci 亚美尼亚语, 不区分大小写
ascii (US ASCII)
ascii_bin 西欧 (多语言), 二进制
ascii_general_ci 西欧 (多语言), 不区分大小写
big5 (Big5 Traditional Chinese)
big5_bin 繁体中文, 二进制
big5_chinese_ci 繁体中文, 不区分大小写
binary (Binary pseudo charset)
binary 二进制
cp1250 (Windows Central European) Continue reading »