- 浏览: 330010 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (354)
- Flash | as3 (53)
- AIR | Starling (46)
- Android (55)
- Java (10)
- C++ (6)
- PHP (43)
- IOS (9)
- Unity3D (2)
- cocos2d-x (1)
- OpenGL (2)
- WebGL (3)
- Server (4)
- MemCache (13)
- MySql (2)
- NoSql (2)
- PhoneGap (13)
- jQuery | jQuery Mobile (14)
- javaScript | html5 | css3 (14)
- Linux (1)
- Box2D (2)
- SmartFox (1)
- Ruby (0)
- Python (2)
- Golang (11)
- Redis (1)
- 开源项目 (6)
- 游戏策划 (1)
- 云平台 (2)
- 项目管理 (6)
- 听见月光 (32)
最新评论
-
kenkao:
http://www.linuxidc.com/Linux/2 ...
解决idea编译时resources文件夹内容不自动复制到输出路径classes的问题 -
kenkao:
http://blog.csdn.net/yanwushu/a ...
解决idea编译时resources文件夹内容不自动复制到输出路径classes的问题 -
wpy126:
你这种比较根本不公平AppCan 用了多个页面,jqm内容都 ...
AppCan VS PhoneGap - 对比两大移动开发平台 -
kenkao:
zs12593 写道这个,这个
这里只是转载,建议看一下原文, ...
android游戏开发框架libgdx环境搭建 -
zs12593:
这个,这个
android游戏开发框架libgdx环境搭建
以用户为中心的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 结语
本文主要是从大家设计过程中常见的问题进行讨论,对于数据库设计方面还存在很多的不足,大家是否在项目中也是自己设计的呢?
如果是的话,希望大家能够多提出意见
发表评论
-
淘宝开放平台SDK对接
2017-11-28 15:38 631http://blog.csdn.net/papalian ... -
基于UCenter关联第三方网站与Discuz用户
2017-11-10 16:57 709https://mo2g.com/view/106/ ... -
IIS访问要求输入用户名密码
2017-10-23 14:08 11121. 打开IIS,右击网站--->属性---> ... -
关于”要执行请求的操作,WordPress需要访问您网页服务器的权限”
2017-10-14 15:50 493http://blog.csdn.net/qq_157108 ... -
PHP中的排序函数sort、asort、rsort、krsort、ksort区别分析
2017-04-20 15:12 502http://www.jb51.net/artic ... -
简单的C#&PHP对称加解密
2017-04-01 10:11 336byte[] ctxbytes = Syst ... -
Windows下安装并设置Redis
2017-01-06 09:48 452http://blog.csdn.net/renfufei/ ... -
深入理解require与require_once与include以及include_once的区别
2016-08-18 15:26 322http://www.jb51.net/article/ ... -
php-redis中文参考手册_zset
2016-07-08 10:05 526http://my.oschina.net/cniiliuq ... -
C#兼容PHP的GZip算法
2016-05-10 15:22 773// php GZip压缩 gzencode($data) ... -
C#兼容PHP的MD5算法
2016-05-10 15:18 455md5($str) public sta ... -
怎样增加phpmyadmin导入文件上限
2015-11-27 10:11 550http://jingyan.baidu.com/art ... -
为PHP添加swoole异步并行扩展
2015-08-12 15:17 889为PHP添加swoole异步并行扩展 ... -
PHP-redis中文文档
2015-07-28 14:21 700PHP-redis中文文档 phpredis是p ... -
PHP中include和require的区别详解
2015-07-25 11:15 493PHP中include和require的区别详解 ... -
Win2003 IIS7配置PHP图解(IIS7+PHP_5.2.17/PHP_5.3.5)
2015-05-08 17:31 2http://www.jb51.net/article/5 ... -
c#保留小数点后位数的方法
2015-04-20 16:22 719Double dValue = 95 ... -
C# to PHP base64 encode/decode
2015-03-31 12:49 1059http://stackoverf ... -
php&.net对称压缩解压缩探讨
2015-03-25 15:42 521http://blog.csdn.net/michaell_ ... -
在C#中获取如PHP函数time()一样的时间戳
2015-01-31 14:03 687c#中没有象PHP一样的time()时间戳函数,但有Date ...
相关推荐
CHSNS# 是成幻小组 开发的一套SNS社区 是类似于Facebook 校内 占座 等SNS站点 可以通过一些配置而形成成一个较完善的SNS社区网站的程序 特色: 界面语言可采用Velocity/Asp.net编辑 扩展应用程序可使用Monorail/...
SpaceBuilder v2.3根据多个客户千万级站点的考验并结合性能测试数据,为了应对大数据量高并发站点对底层重新做了优化,使SpaceBuilder可以更好的实现分布式部署,为面向高端做好了准备。本次优化主要体现在以下几个...
SpaceBuilder v2.3根据多个客户千万级站点的考验并结合性能测试数据,为了应对大数据量高并发站点对底层重新做了优化,使SpaceBuilder可以更好的实现分布式部署,为面向高端做好了准备。本次优化主要体现在以下几个...
SpaceBuilder v2.3根据多个客户千万级站点的考验并结合性能测试数据,为了应对大数据量高并发站点对底层重新做了优化,使SpaceBuilder可以更好的实现分布式部署,为面向高端做好了准备。本次优化主要体现在以下几个...
全文检索:以Lucene为核心实现全文检索功能,索引库实现自动更新,并提供企业级的全文检索性能; 扩展机制:优秀的皮肤实现机制,使客户可以方便的对现有皮肤进行修改或开发新的皮肤;内容的提取全部采用服务器...
全文检索:以Lucene为核心实现全文检索功能,索引库实现自动更新,并提供企业级的全文检索性能; 扩展机制:优秀的皮肤实现机制,使客户可以方便的对现有皮肤进行修改或开发新的皮肤;内容的提取全部采用服务器...
全文检索:以Lucene为核心实现全文检索功能,索引库实现自动更新,并提供企业级的全文检索性能; 扩展机制:优秀的皮肤实现机制,使客户可以方便的对现有皮肤进行修改或开发新的皮肤;内容的提取全部采用...
一个仿校内网和Facebook的...成幻SNS,专注于"人"的互动,我们坚信服务上的持续改进,真正关心用户所想所需,不断追求网站可以给用户带来的价值,才能给用户以真正可以有所收益的功能,使大家可以与成幻SNS共同成长共同进步.
每个人都可以设置Email过滤级别、短消息过滤级别、发表文章成功后跳转到的页面、登录成功后跳转到的页面、收件箱,发件箱每页显示短消息的数量等,增加了软件的友好性,充分体现以用户为中心的产品设计! 高级特性...
>SiteSqlServer节点为正确数据库连接字符串 6、如果本产品所在磁盘是NTFS格式,则确保asp.net或NETWORK SERVICE(即运行ASP.NET应用程序的用户)对Uploads及IndexFiles(即您设置的Lucene索引文件所在目录)具备可...
近乎(Spacebuilder)是基于asp.net mvc最强大的SNS社区软件,借助预置的微博、群组、日志、相册、贴吧、问答等系统应用模块,可以帮助客户快速搭建以用户为中心、用户乐于贡献内容、互动无处不在、易于运营的社区网站...
NT 3.1版本为项目用户专门开发了负载均衡、数据库读写分离、分布式缓存和检测工具一系列套件,为超大型社区建设提供了完美的技术解决方案。 新增功能列表 全新的门户化聚合首页 游客发帖时,帖子页面直接显示游客...
按键跳转以及按Enter以不同参数提交,及其他感应事件 动态控制Page页的Head信息 SubmitOncePage:解决刷新页面造成的数据重复提交问题 SharpRewriter:javascript + xml技术利用#实现url重定向 采用XHTML和CSS设计可...
新一代博客和SNS社区:建立基于Kotlin + Spring Boot + Ebean ORM,前端基于JS + jQuery + Bootstrap。 开发环境安装指南 依赖软件: JDK 8 MySQL 5.6 ElasticSearch 7.5.1(可选,需安装IK Analyzer插件) ...
近乎(Spacebuilder)是一款专业的SNS开源社区建站软件,借助预置的微博、群组、日志、相册、贴吧、问答等应用模块,近乎可以帮助客户快速搭建以用户为中心、用户乐于贡献内容、互动无处不在、易于运营的社区网站。...
Spacebuilder自2007年诞生以来已经成长成为最专业、成熟的SNS社区系统,在v4.1发布之际官方正式启用中文名称——“近乎”。希望通过近乎搭建的社区网站,可以拉近用户之间的距离,让用户之间更加近乎。 v4.0是近乎...
整站程序支持全静态HTML文件生成,可将站点首页、频道首页、各栏目及每个内容页都生成静态HTML文件,这样不仅可以减轻服务器的负载提高搜索收录率,同时也可以实现内容收费和访问权限控制。多种生成文件命名形式可供...
资料收集:高并发 高性能 高扩展性 Web 2.0 站点架构设计及优化策略 243 CommunityServer性能问题浅析 250 鸡肋式的多站点支持 250 内容数据的集中式存储 250 过于依赖缓存 250 CCS的雪上加霜 250 如何...
整站程序支持全静态HTML文件生成,可将站点首页、频道首页、各栏目及每个内容页都生成静态HTML文件,这样不仅可以减轻服务器的负载提高搜索收录率,同时也可以实现内容收费和访问权限控制。多种生成文件命名形式可供...
SpaceBuilderv2.3根据多个客户千万级站点的考验并结合性能测试数据,为了应对大数据量高并发站点对底层重新做了优化,使SpaceBuilder可以更好的实现分布式部署,为面向高端做好了准备。本次优化主要体现在以下几个...