1 前言
最近项目开发过程中,遇到数据库设计方面的问题,参考了多个数据库,总结了一些相关的数据库实体及关系的表示 3月份的时候也写过一篇MySQL数据库设计复习笔记及项目实战 ,现在再次进行总结,并添加了在项目中的数据库设计及具体的持久化及cache实现.
数据库作为底层,命名规范和变动都会直接影响到上层,所以在设计上更需要谨慎.
本文从 数据库实体及关系处理,数据持久化及缓存处理,这3个方面来进行阐述
先看下本次 我是买家 开源项目设计软件 采用的是 MySQL Workbench
点击查看详细大图
2 实体及关联处理
筛选实体,从图中我们可以看到,图中主要分成了6个部分
实体表 goods 商品 communicate 群 say 我说 comment 评论 url 站点 brand 品牌 compaign 活动 |
用户表user |
关系表 userandmodel 用户模型关系 modelandmodel 模型模型关系 aactionandmodel 页面实体关系 tags TAG实体关系 |
资源表 image 图片 album 相册 |
群组表 group 小组 topic 话题 post 回复 userandgroup 用户群组关联
|
站点常用表 systemtree 系统树 content 内容 ad 广告 report 举报 district 地区 log 日志 services 客服人员 mail 站内信 |
以用户为中心,user表放在中间,关联其他的实体
实体表 可以进行扩展 添加相关的应用实体
关系表 主要包含4个表
用户和模型关联表 比如: 张三 喜欢 IPOD 李四 想买 IPOD linktype="like/buy"
模型模型关联表 比如商品评论关联 modela 商品 modelb 评论
actionandmodel 页面模型关联表 tag关键字及实体关联表
资源表 主要包含了 image ablum image表包含了系统实体类关联的图片
群组表 包含了group,topic,post userandgroup ,群组作为系统独立模块独立出来
常用表 常有表从实体表中分离出来,放站点需要的表
#p#
3 数据持久化及缓存处理
数据持久化
THINKPHP处理数据机制简单的说,直接实例化model类得到model示例即可进行数据库语句的相关操作,如下图所示
点击这里查看大图
DbMysql 继承自Db, AdvModel,ViewModel,RelationModel继承自Model类,Model类调用DB类进行具体的数据库操作
比如查询所有用户操作
- $user = newModel('User');
- $result =$user->select();
- var_dump($result);//输出所有的用户
比如添加用户操作
|
对于数据单表操作,使用ThinkPHP框架的Model进行处理相对比较简单.对于关联查询,可以使用TP的RelationModel 也可以自己在自定义模型中定义,比如查询用户及头像信息,这里自定义了Model UserModel.class.php
- <?php
- //+----------------------------------------------------------------------
- // | WoShiMaiJia Projcet
- // +----------------------------------------------------------------------
- // | Copyright (c) 2010 http://woshimaijia.com All rights reserved.
- //+----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- //+----------------------------------------------------------------------
- // | Author: xinqiyang <517577550@qq.com>
- //+----------------------------------------------------------------------
- /**
- * 用户模型文件
- * @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
- view sourceprint?
- 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类中实现缓存调用
- <?php
- //+----------------------------------------------------------------------
- // | WoShiMaiJia Projcet
- // +----------------------------------------------------------------------
- // | Copyright (c) 2010 http://woshimaijia.com All rights reserved.
- //+----------------------------------------------------------------------
- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
- //+----------------------------------------------------------------------
- // | Author: xinqiyang <517577550@qq.com>
- //+----------------------------------------------------------------------
- /**
- * 元数据基类
- * 提供了缓存操作功能及基本的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缓存为例来实现缓存的获取及调用
- <?php
- 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 结语
本文主要是从大家设计过程中常见的问题进行讨论,对于数据库设计方面还存在很多的不足,大家是否在项目中也是自己设计的呢?
原文标题:以用户为中心的SNS站点数据库设计及实现
链接:http://www.cnblogs.com/scotoma/archive/2010/08/08/1794964.html
【编辑推荐】