mysql sns表_以用户为中心的SNS站点数据库设计及实现

作者:杨鑫奇

1 前言

最近项目开发过程中,遇到数据库设计方面的问题,参考了多个数据库,总结了一些相关的数据库实体及关系的表示 3月份的时候也写过一篇,现在再次进行总结,并添加了在项目中的数据库设计及具体的持久化及cache实现.

数据库作为底层,命名规范和变动都会直接影响到上层,所以在设计上更需要谨慎.

本文从 数据库实体及关系处理,数据持久化及缓存处理,这3个方面来进行阐述

先看下大图,点击查看大图 本次 我是买家 开源项目设计软件 采用的是 MySQL Workbench

f823add74e077d5c5c3c17a5d7b122eb.png

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的类图

b97cc1e433d070dcd3bb1c6c2d8c43c0.png

具体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 结语

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

如果是的话,希望大家能够多提出意见

文章知识点与官方知识档案匹配,可进一步学习相关知识MySQL入门技能树数据库组成31861 人正在系统学习中 相关资源:圣诞贺卡制作软件(ChristmasCard)v2014.2.0绿色版-其它代码类资源…

来源:贺金兰

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年1月3日
下一篇 2021年1月3日

相关推荐