欢迎投稿

今日深度:

MySQL以用户为本 构建SNS网站的核心数据库(1)(2)

3 数据持久化及缓存处理

数据持久化

THINKPHP处理数据机制简单的说,直接实例化model类得到model示例即可进行数据库语句的相关操作,如下图所示

数据持久化

 点击这里查看大图

DbMysql 继承自Db,  AdvModel,ViewModel,RelationModel继承自Model类,Model类调用DB类进行具体的数据库操作

比如查询所有用户操作

  1. $user = newModel('User');    
  2. $result =$user->select();    
  3. var_dump($result);//输出所有的用户  

比如添加用户操作

  1. //接收POST过来的表单数据,创建数据    
  2. if($user->create())    
  3. {    
  4.   if($user->add())    
  5.    {    
  6.      echo '添加成功';    
  7.  
  8.     }    
  9. }  

对于数据单表操作,使用ThinkPHP框架的Model进行处理相对比较简单.对于关联查询,可以使用TP的RelationModel 也可以自己在自定义模型中定义,比如查询用户及头像信息,这里自定义了Model UserModel.class.php

  1. <?php    
  2. //+----------------------------------------------------------------------    
  3. // | WoShiMaiJia Projcet    
  4. // +----------------------------------------------------------------------    
  5. // | Copyright (c) 2010 http://woshimaijia.com All rights reserved.    
  6. //+----------------------------------------------------------------------    
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )    
  8. //+----------------------------------------------------------------------    
  9. // | Author: xinqiyang <517577550@qq.com>    
  10. //+----------------------------------------------------------------------    
  11. /**    
  12.  * 用户模型文件    
  13.  * @author xinqiyang    
  14.  * @date   2010-4-9    
  15.  *    
  16.  */   
  17. class UserModel extends MetaModel {    
  18.    // 自动验证设置    
  19.    protected $_validate     =     array(    
  20.    array('email','email','邮箱没填或格式不正确',1,'',1),    
  21.    array('email','','邮箱已被使用',1,'unique',1),    
  22.    array('password','require','密码必须输入',0,'',1),    
  23.    array('enname','charecter','英文名只能由数字,字母,下划线组成',1,'',1),    
  24.    array('enname','','名称已被使用',1,'unique',1),    
  25.    array ('birthday','date','生日必须输入格式如 1980-01-01',2,'',2),    
  26.    array ('qq','qq','QQ号不能为空或者 位数不正确',2,'',2),    
  27.    array ('mobile','mobile','手机不能为空,或格式不正确',2,'',2),    
  28.    );    
  29.    // 自动填充设置    
  30.    protected $_auto     =     array(    
  31.    array('image_id','1'),//设置默认头像,使得评论可以成功    
  32.    array('password','md5',1,'function'),    
  33.    array('createtime','time',1,'function'),    
  34.    array('registerip','get_client_ip',1,'function'),    
  35.    array ('lastloginip','get_client_ip',2,'function'),    
  36.    array ('lastlogintime','time',2,'function'),    
  37.    );    
  38.    /**    
  39.     * 返回用户信息    
  40.     * @param $arr    
  41.     */   
  42.    function getUsers($arr)    
  43.    {    
  44.      return $this->query("selectsz_user.id,sz_user.cnname,sz_user.city,
  45. sz_user.gogonum,sz_user.shownum,sz_image.filename,sz_image.url,sz_image.model  
  1. from sz_user,sz_image    
  2. view sourceprint?   
  3. where sz_image.id = sz_user.image_id and sz_user.id in".$arr);    
  4.    }    
  5.    function getUserTotal()    
  6.    {    
  7.      $total =$this->query("    
  8.      select count(*) fromsz_user;    
  9.      ");    
  10.      return $total[0]['count(*)'];    
  11.    }    
  12. }    
  13. ?>  

这里的返回用户信息,执行了一条SQL查询,对多表进行关联查询,返回用户的信息数据集,操作也比较方便

调用如下

  1. $u = newModel('user');    
  2. $lst =$u->getUsers($ids); //带入需要调用的ID  

本类没有使用到缓存,以下以Memcache缓存的使用为例来讲解项目中的应用

先看下cache的类图

cache类图

具体cache实现类继承自cache类

使用如下

自定义model类  DistrictModel 继承自 MetaModel , MetaModel继承自Model , 在MetaModel类中实现缓存调用

  1. <?php    
  2. //+----------------------------------------------------------------------    
  3. // | WoShiMaiJia Projcet    
  4. // +----------------------------------------------------------------------    
  5. // | Copyright (c) 2010 http://woshimaijia.com All rights reserved.    
  6. //+----------------------------------------------------------------------    
  7. // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )    
  8. //+----------------------------------------------------------------------    
  9. // | Author: xinqiyang <517577550@qq.com>    
  10. //+----------------------------------------------------------------------    
  11. /**    
  12.  * 元数据基类    
  13.  * 提供了缓存操作功能及基本的CRUD操作功能    
  14.  * @author xinqiyang    
  15.  *    
  16.  */   
  17. class MetaModel extends Model    
  18. {    
  19.    //缓存实例    
  20.    protected $cache;    
  21.    /**    
  22.     * 返回一个缓存操作实例    
  23.     */   
  24.    function _initialize()    
  25.    {    
  26.      //如果未设置则设置缓存实例    
  27.      if(!isset($this->cache))    
  28.      {    
  29.         $this->cache= Cache::getInstance('Memcache');    
  30.      }    
  31.    }    
  32.    /**    
  33.     * 删除缓存    
  34.     * @param$cachename 缓存名称    
  35.     */   
  36.    protected function rm($cachename)    
  37.    {    
  38.      $this->cache->rm($cachename);    
  39.    }    
  40. }    
  41. ?>  

这里以城市表信息的memcache缓存为例来实现缓存的获取及调用

  1. <?php    
  2. class DistrictModel extends MetaModel    
  3. {    
  4.    /**    
  5.     * 获取省市区    
  6.     * TODO:现在先用文件缓存,部署memcache后用 内存缓存就好了    
  7.     */   
  8.    public function getDistrict()    
  9.    {    
  10.      //获得数据    
  11.      if(!$this->cache->get('district'))    
  12.      {    
  13.          //写入cache,5000多条的时候就挂掉了,数据不能超过1M    
  14. $this->cache->set('district',$this->where('level=2 or id in (1,2,9,22)')- >select(),0,-1);    
  15.      }    
  16.      return $this->cache->get('district');    
  17.     }    
  18. }    
  19. ?>  

调用过程,在调用过程中,先创建cache实例,在进行调用,缓存数据,如果缓存数据则直接读取数据

4 结语

本文主要是从大家设计过程中常见的问题进行讨论,对于数据库设计方面还存在很多的不足,大家是否在项目中也是自己设计的呢?

原文标题:以用户为中心的SNS站点数据库设计及实现

链接:http://www.cnblogs.com/scotoma/archive/2010/08/08/1794964.html


www.htsjk.Com true http://www.htsjk.com/shujukugl/17882.html NewsArticle 3 数据持久化及缓存处理 数据持久化 THINKPHP处理数据机制简单的说,直接实例化model类得到model示例即可进行数据库语句的相关操作,如下图所示 点击这里查...
评论暂时关闭