以用户为中心的SNS站点数据库设计及实现
以用户为中心的SNS站点数据库设计及实现
作者:杨鑫奇
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 ,群组作为系统独立模块独立出来
常用表 常有表从实体表中分离出来,放站点需要的表
3 数据持久化及缓存处理
数据持久化
THINKPHP处理数据机制简单的说,直接实例化model类得到model示例即可进行数据库语句的相关操作,如下图所示
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
<?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
|
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查询,对多表进行关联查询,返回用户的信息数据集,操作也比较方便
调用如下
1
2
|
$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 结语
本文主要是从大家设计过程中常见的问题进行讨论,对于数据库设计方面还存在很多的不足,大家是否在项目中也是自己设计的呢?
如果是的话,希望大家能够多提出意见
<script type="text/javascript"></script>
以用户为中心的SNS站点数据库设计及实现相关推荐
- Oracle数据库设计要做到五戒
众所周知,数据库设计的好坏直接关系到数据库运行的效率.根据笔者的经验,对于提升数据库性能来说,合理的数据库设计,比升级服务器的硬件配置,还要来的有效.但是,笔者无论是在跟同事合作,又或者是在论坛上跟相 ...
- MySQL数据库——数据库设计概念和数据库设计步骤
数据库设计就是根据业务系统的具体需求,结合我们所选用的数据库,建立好表结构及表与表之间的管理关系,为这个业务系统构造出最优秀的数据存储模型的过程.使之能有效的对应用的数据进行存储,并高效的对已经存储的 ...
- 数据库设计讲解和案例分析 | mysql 入门
数据库设计 什么是数据库设计 数据库设计是指在数据库系统开发过程中,根据用户需求,通过对数据进行分析.抽象和建模,设计出一个合理.高效的数据库结构的过程.数据库设计的目的是为了实现数据的存储.管理.维 ...
- 系统架构设计笔记(8)——数据库设计
数据库设计的过程是将数据库系统与现实世界密切地.有机地.协调一致地结合起来的过程. 数据库的设计质量与设计者的知识.经验和水平密切相关.作为数据库应用系统的重要组成部分,数据库设计的成败往往直接关系到 ...
- ucenter mysql账号_discuz用户管理中心ucenter介绍
以下为学做网站论坛关于"discuz用户管理中心ucenter介绍"讲解视频教程. UCenter.UCenter Home.Discuz!三者关系: 1,Discuz是一个讨论社 ...
- SNS站点的数据存储方案
今天看了篇文章,谈到SNS站点应用中的分库分表问题,这里我也谈谈我对SNS站点和应用数据存储的看法. 一.数据存储 SNS站点中数据层根据业务和访问特性可分为几类: 1. 读写都很频繁,非重要数据. ...
- java和Discuz论坛实现单点登录,通过Ucenter(用户管理中心)
果学网-专注IT在线www.prismcollege.com 1,按照下面各大链接的教程,把Base64,Client,PHPFunctions,UC,XMLHelper加入web程序. 2,修改we ...
- 苹果手机隐私分析数据是什么_苹果公司以用户为中心的隐私保护方法能教给我们什么?
苹果手机隐私分析数据是什么 重点 (Top highlight) Moving beyond the rollercoaster of excitement and controversy Apple ...
- 白鸦谈“以用户为中心的设计”
主持人:大家安静下,我们现在以热烈的掌声欢迎白鸦先生入场,下面请白鸦自我介绍下. 白鸦: 我可以比较概括的介绍一下: 1,高一被开除,然后去上中专: 2,中专学习舞美设计和油画: 3,中专毕业上大专, ...
最新文章
- python究竟要不要使用多线程
- linux下关于mysqldump备份的.sql导入数据库表数据丢失优化
- 学习几个“××在内存中占几份”的若干问题
- 设置VS2008 快捷键 快速注释
- 用递归和非递归实现斐波那契数列
- HTTP所承载的货物(图像、文本、软件等)要满足的条件
- 【三电平SVPWM学习
- 最新版mysql8.0.13如何汉化_MySQL 8.0.13 下载安装教程图文详解
- 2016年计算机基础题库,2016考试计算机基础知识题库
- LaTeX新手入门以及TeXlive和TeXstudio的安装使用
- 亲戚关系php,中国亲戚关系解析图(大全)
- css background动态图片,CSS3 background-position定位背景图片动画效果
- 索尼Z2(L50t)刷CM12教程
- 定制海报、AI扣人像小程序
- 第3章-2 查验身份证
- docker部署finebi 帆软
- 阿里云大数据工程师ACP认证例题
- 减轻学生过重课业负担的规定
- 普通壳的脱壳方法和脱壳技巧
- MBA-day33 绝对值的几何意义
热门文章
- python网站设计中接口的作用_python接口自动化(三)--如何设计接口测试用例(详解)...
- JQ实现列表增删以及上下移动
- CSS3动画的基本使用(CSS3)
- iView UI常用组件DatePicker清空技巧
- React使用create-react-app 创建项目失败,解决方法
- opencv编译之修改python绑定so名字
- python200行代码_python代码统计200行
- Spring3.0核心组件的源码简单分析
- CentOS connect:fail, reason: connect server 22 port fail
- 【李宏毅2020 ML/DL】P58 Unsupervised Learning - Neighbor Embedding | LLE, t-SNE