发新话题
打印

[强推] Zend Framework 留言本实战 -- 数据库设计

[强推] Zend Framework 留言本实战 -- 数据库设计

四、设计数据库

      本篇主要是设计Mysql数据库,提及了两个数据库设计中比较重要的问题,并推荐了3篇相关的文章,希望对大家有所帮助。
      
      4.1 字段类型
      设计数据库,字段类型的选择是非常重要的,原则是尽量选择占用空间最小的数据类型,尽量采用确定长度的数据类型(如CHAR)而不用变长的数据 类型(如VARCHAR)。例如表`zf_guestbook`的字段`mana_id`,长度仅仅设为(5),实际可以更小,就是考虑到留言本的管理员 数量很有限,其编号不会增长到那么大,哪怕你经常删除了重新添加;又例如表`zf_guestbook`的其它两个字段
都设为CHAR类型,而不是VARCHAR类型,也是因为在本应用中我们可以确认其最大长度,故使用定长的数据类型(当然CHAR类型字段会占用固定的储存空间,如果你设置的过大而实际上使用的比例确很小就会造成存储空间的浪费,这就要根据具体的应用来权衡了)。

      4.2 建立索引
      一个大型应用,数据库索引的设计和优化是至关重要的,学问就大了去了,当然也有一些基本的原则,相信大家看了《Mysql索引分析和优化》之后就会有个比较感性的认识了。


      虽然本教程的数据库应用非常简单,但是我一向坚持按照最优的方式来设计和制作东西,所以再小也要考虑的全面些,无奈我对数据库的设计也只是入门级别的,就不敢班门弄斧了,所以在本篇之前转载了几篇觉得很好的数据库设计相关的文章,大家有时间可以仔细看下:

      Mysql索引分析和优化

      高效的MySQL数据库应用原则

      数据库设计方法、规范与技巧

      通常,在数据库、表、字段命名上我喜欢用前缀(通过下划线分隔),也建议大家这样做,这样做有很多好处,比如便于标识,形成统一的风格,数据库名称如果前缀相同在phpmyadmin管理的时候它会自动按照前缀进行分组,不同的表前缀可以使用同一个数据库支持多个相同应用,等等。

====以下是通过phpmyadmin导出的Sql代码=========================================================


-- phpMyAdmin SQL Dump
-- version 2.10.1
-- http://www.phpmyadmin.net
--
-- 主机: localhost
-- 生成日期: 2007 年 11 月 06 日 12:43
-- 服务器版本: 5.0.41
-- PHP 版本: 5.2.2

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";

--
-- 数据库: `zf_guestbook`
--
CREATE DATABASE `zf_guestbook` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
-- --------------------------------------------------------

USE `zf_guestbook`;

--
-- 表的结构 `gb_manager`   管理员表,用于存储留言管理员的帐号信息
--

DROP TABLE IF EXISTS `gb_manager`;
CREATE TABLE IF NOT EXISTS `gb_manager` (
`mana_id` tinyint(5) NOT NULL auto_increment,
`mana_name` char(20) collate utf8_unicode_ci NOT NULL,
`mana_pass` char(32) collate utf8_unicode_ci NOT NULL,
PRIMARY KEY (`mana_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;

-- --------------------------------------------------------

--
-- 表的结构 `gb_message`     留言表,用于存储访客留言,其中 `mess_ip`是为了跟踪留言人的地区信息
--

DROP TABLE IF EXISTS `gb_message`;
CREATE TABLE IF NOT EXISTS `gb_message` (
`mess_id` int(11) NOT NULL auto_increment,
`mess_name` char(50) collate utf8_unicode_ci NOT NULL,
`mess_content` text collate utf8_unicode_ci NOT NULL,
`mess_addtime` int(11) NOT NULL,
`mess_ip` int(10) NOT NULL,
PRIMARY KEY (`mess_id`),
KEY `mess_addtime` (`mess_addtime`,`mess_ip`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1 ;


====SQL代码结束=======================================================

      4.3 配置文件编写
      下面我们来写数据库连接的配置文件,我们采用ZF推荐的方式,ini类型的配置文件,在本教程《实战学习 Zend Framework 之--留言本[03]--创建应用的入口文件./index.php》中讲到了在index.php中读取ini配置文件的方法,再将相关代码贴过来下:

// 加载配置。主要是数据库相关的配置,可以分多个组,便于更改,建议使用,也可以直接在这里配置
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);

      新建一个config.ini的文本文件,存放在application文件夹下(这个文件夹通过.htaccess禁止了直接http访问请求的)。内容如下:

[general]
db.adapter = PDO_MYSQL
db.config.host = localhost
db.config.username = gbuser
db.config.password = guestbook
db.config.dbname = zf_guestbook

      当然,你也可以把数据库配置直接使用php代码写在index文件里面,但是推荐采用这种方式,这样做有几种好处,首先通过配置代替编程,更加容易更改你的数据库配置,数据库相关的信息变了只用改下这个文本文件,而不用动php代码了;其次,通过在最前面"[ ]"中指定配置组名称,可以在一个配置文件里面采用多种数据库配置,便于大型应用对数据库变换的要求。

[ 本帖最后由 tomsou 于 2008-4-7 17:29 编辑 ]

TOP

发新话题