1 前言
最近项目开发过程中,遇到数据库设计方面的问题,参考了多个数据库,总结了一些相关的数据库实体及关系的表示 3月份的时候也写过一篇,现在再次进行总结,并添加了在项目中的数据库设计及具体的持久化及cache实现.
数据库作为底层,命名规范和变动都会直接影响到上层,所以在设计上更需要谨慎.
先看下大图,点击查看大图 本次 我是买家 开源项目设计软件 采用的是 MySQL Workbench
DbMysql 继承自Db, AdvModel,ViewModel,RelationModel继承自Model类,Model类调用DB类进行具体的数据库操作
比如查询所有用户操作
$user = newModel(‘User’);
$result =$user->select();
var_dump($result);//输出所有的用户
比如添加用户操作
//接收POST过来的表单数据,创建数据
if($user->create())
{
if($user->add())
{
echo ‘添加成功’;
}
}
对于数据单表操作,使用ThinkPHP框架的Model进行处理相对比较简单.对于关联查询,可以使用TP的RelationModel 也可以自己在自定义模型中定义,比如查询用户及头像信息,这里自定义了Model UserModel.class.php
//+———————————————————————-
// | WoShiMaiJia Projcet
// +———————————————————————-
// | Copyright (c) 2010 http://woshimaijia.com All rights reserved.
//+———————————————————————-
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
//+———————————————————————-
// | Author: xinqiyang
//+———————————————————————-
/**
* 用户模型文件
* @author xinqiyang
* @date 2010-4-9
*
*/
class UserModel extends MetaModel {
// 自动验证设置
protected $_validate = array(
array(’email’,’email’,’邮箱没填或格式不正确’,1,”,1),
array(’email’,”,’邮箱已被使用’,1,’unique’,1),
array(‘password’,’require’,’密码必须输入’,0,”,1),
array(‘enname’,’charecter’,’英文名只能由数字,字母,下划线组成’,1,”,1),
array(‘enname’,”,’名称已被使用’,1,’unique’,1),
array (‘birthday’,’date’,’生日必须输入格式如 1980-01-01′,2,”,2),
array (‘qq’,’qq’,’QQ 不能为空或者 位数不正确’,2,”,2),
array (‘mobile’,’mobile’,’手机不能为空,或格式不正确’,2,”,2),
);
// 自动填充设置
protected $_auto = array(
array(‘image_id’,’1′),//设置默认头像,使得评论可以成功
array(‘password’,’md5′,1,’function’),
array(‘createtime’,’time’,1,’function’),
array(‘registerip’,’get_client_ip’,1,’function’),
array (‘lastloginip’,’get_client_ip’,2,’function’),
array (‘lastlogintime’,’time’,2,’function’),
);
/**
* 返回用户信息
* @param $arr
*/
function getUsers($arr)
{
return $this->query(“selectsz_user.id,sz_user.cnname,sz_user.city,sz_user.gogonum,sz_user.shownum,sz_image.filename,sz_image.url,sz_image.model
from sz_user,sz_image
where sz_image.id = sz_user.image_id and sz_user.id in”.$arr);
}
function getUserTotal()
{
$total =$this->query(“
select count(*) fromsz_user;
“);
return $total[0][‘count(*)’];
}
}
这里的返回用户信息,执行了一条SQL查询,对多表进行关联查询,返回用户的信息数据集,操作也比较方便
调用如下
$u = newModel(‘user’);
$lst =$u->getUsers($ids); //带入需要调用的ID
本类没有使用到缓存,以下以Memcache缓存的使用为例来讲解项目中的应用
先看下cache的类图

具体cache实现类继承自cache类
使用如下
自定义model类 DistrictModel 继承自 MetaModel , MetaModel继承自Model , 在MetaModel类中实现缓存调用
//+———————————————————————-
// | WoShiMaiJia Projcet
// +———————————————————————-
// | Copyright (c) 2010 http://woshimaijia.com All rights reserved.
//+———————————————————————-
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
//+———————————————————————-
// | Author: xinqiyang
//+———————————————————————-
/**
* 元数据基类
* 提供了缓存操作功能及基本的CRUD操作功能
* @author xinqiyang
*
*/
class MetaModel extends Model
{
//缓存实例
protected $cache;
/**
* 返回一个缓存操作实例
*/
function _initialize()
{
//如果未设置则设置缓存实例
if(!isset($this->cache))
{
$this->cache= Cache::getInstance(‘Memcache’);
}
}
/**
* 删除缓存
* @param$cachename 缓存名称
*/
protected function rm($cachename)
{
$this->cache->rm($cachename);
}
}
这里以城市表信息的memcache缓存为例来实现缓存的获取及调用
class DistrictModel extends MetaModel
{
/**
* 获取省市区
* TODO:现在先用文件缓存,部署memcache后用 内存缓存就好了
*/
public function getDistrict()
{
//获得数据
if(!$this->cache->get(‘district’))
{
//写入cache,5000多条的时候就挂掉了,数据不能超过1M
$this->cache->set(‘district’,$this->where(‘level=2 or id in (1,2,9,22)’)- >select(),0,-1);
}
return $this->cache->get(‘district’);
}
}
调用过程,在调用过程中,先创建cache实例,在进行调用,缓存数据,如果缓存数据则直接读取数据
4 结语
如果是的话,希望大家能够多提出意见
文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成表31861 人正在系统学习中 相关资源:圣诞贺卡制作软件(ChristmasCard)v2014.2.0绿色版-其它代码类资源…
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!