MySQL以用戶為本 構(gòu)建SNS網(wǎng)站的核心數(shù)據(jù)庫(kù)
1 前言
最近項(xiàng)目開發(fā)過程中,遇到數(shù)據(jù)庫(kù)設(shè)計(jì)方面的問題,參考了多個(gè)數(shù)據(jù)庫(kù),總結(jié)了一些相關(guān)的數(shù)據(jù)庫(kù)實(shí)體及關(guān)系的表示 3月份的時(shí)候也寫過一篇MySQL數(shù)據(jù)庫(kù)設(shè)計(jì)復(fù)習(xí)筆記及項(xiàng)目實(shí)戰(zhàn) ,現(xiàn)在再次進(jìn)行總結(jié),并添加了在項(xiàng)目中的數(shù)據(jù)庫(kù)設(shè)計(jì)及具體的持久化及cache實(shí)現(xiàn).
數(shù)據(jù)庫(kù)作為底層,命名規(guī)范和變動(dòng)都會(huì)直接影響到上層,所以在設(shè)計(jì)上更需要謹(jǐn)慎.
本文從 數(shù)據(jù)庫(kù)實(shí)體及關(guān)系處理,數(shù)據(jù)持久化及緩存處理,這3個(gè)方面來進(jìn)行闡述
先看下本次 我是買家 開源項(xiàng)目設(shè)計(jì)軟件 采用的是 MySQL Workbench
點(diǎn)擊查看詳細(xì)大圖
2 實(shí)體及關(guān)聯(lián)處理
篩選實(shí)體,從圖中我們可以看到,圖中主要分成了6個(gè)部分
實(shí)體表 goods 商品 communicate 群 say 我說 comment 評(píng)論 url 站點(diǎn) brand 品牌 compaign 活動(dòng) |
用戶表user |
關(guān)系表 userandmodel 用戶模型關(guān)系 modelandmodel 模型模型關(guān)系 aactionandmodel 頁(yè)面實(shí)體關(guān)系 tags TAG實(shí)體關(guān)系 |
資源表 image 圖片 album 相冊(cè) |
群組表 group 小組 topic 話題 post 回復(fù) userandgroup 用戶群組關(guān)聯(lián)
|
站點(diǎn)常用表 systemtree 系統(tǒng)樹 content 內(nèi)容 ad 廣告 report 舉報(bào) district 地區(qū) log 日志 services 客服人員 mail 站內(nèi)信 |
以用戶為中心,user表放在中間,關(guān)聯(lián)其他的實(shí)體
實(shí)體表 可以進(jìn)行擴(kuò)展 添加相關(guān)的應(yīng)用實(shí)體
關(guān)系表 主要包含4個(gè)表
用戶和模型關(guān)聯(lián)表 比如: 張三 喜歡 IPOD 李四 想買 IPOD linktype="like/buy"
模型模型關(guān)聯(lián)表 比如商品評(píng)論關(guān)聯(lián) modela 商品 modelb 評(píng)論
actionandmodel 頁(yè)面模型關(guān)聯(lián)表 tag關(guān)鍵字及實(shí)體關(guān)聯(lián)表
資源表 主要包含了 image ablum image表包含了系統(tǒng)實(shí)體類關(guān)聯(lián)的圖片
群組表 包含了group,topic,post userandgroup ,群組作為系統(tǒng)獨(dú)立模塊獨(dú)立出來
常用表 常有表從實(shí)體表中分離出來,放站點(diǎn)需要的表
#p#
3 數(shù)據(jù)持久化及緩存處理
數(shù)據(jù)持久化
THINKPHP處理數(shù)據(jù)機(jī)制簡(jiǎn)單的說,直接實(shí)例化model類得到model示例即可進(jìn)行數(shù)據(jù)庫(kù)語(yǔ)句的相關(guān)操作,如下圖所示
點(diǎn)擊這里查看大圖
DbMysql 繼承自Db, AdvModel,ViewModel,RelationModel繼承自Model類,Model類調(diào)用DB類進(jìn)行具體的數(shù)據(jù)庫(kù)操作
比如查詢所有用戶操作
- $user = newModel('User');
- $result =$user->select();
- var_dump($result);//輸出所有的用戶
比如添加用戶操作
|
對(duì)于數(shù)據(jù)單表操作,使用ThinkPHP框架的Model進(jìn)行處理相對(duì)比較簡(jiǎn)單.對(duì)于關(guān)聯(lián)查詢,可以使用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 {
- // 自動(dòng)驗(yàn)證設(shè)置
- protected $_validate = array(
- array('email','email','郵箱沒填或格式不正確',1,'',1),
- array('email','','郵箱已被使用',1,'unique',1),
- array('password','require','密碼必須輸入',0,'',1),
- array('enname','charecter','英文名只能由數(shù)字,字母,下劃線組成',1,'',1),
- array('enname','','名稱已被使用',1,'unique',1),
- array ('birthday','date','生日必須輸入格式如 1980-01-01',2,'',2),
- array ('qq','qq','QQ號(hào)不能為空或者 位數(shù)不正確',2,'',2),
- array ('mobile','mobile','手機(jī)不能為空,或格式不正確',2,'',2),
- );
- // 自動(dòng)填充設(shè)置
- protected $_auto = array(
- array('image_id','1'),//設(shè)置默認(rèn)頭像,使得評(píng)論可以成功
- 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(*)'];
- }
- }
- ?>
這里的返回用戶信息,執(zhí)行了一條SQL查詢,對(duì)多表進(jìn)行關(guān)聯(lián)查詢,返回用戶的信息數(shù)據(jù)集,操作也比較方便
調(diào)用如下
- $u = newModel('user');
- $lst =$u->getUsers($ids); //帶入需要調(diào)用的ID
本類沒有使用到緩存,以下以Memcache緩存的使用為例來講解項(xiàng)目中的應(yīng)用
先看下cache的類圖
具體cache實(shí)現(xiàn)類繼承自cache類
使用如下
自定義model類 DistrictModel 繼承自 MetaModel , MetaModel繼承自Model , 在MetaModel類中實(shí)現(xiàn)緩存調(diào)用
- <?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>
- //+----------------------------------------------------------------------
- /**
- * 元數(shù)據(jù)基類
- * 提供了緩存操作功能及基本的CRUD操作功能
- * @author xinqiyang
- *
- */
- class MetaModel extends Model
- {
- //緩存實(shí)例
- protected $cache;
- /**
- * 返回一個(gè)緩存操作實(shí)例
- */
- function _initialize()
- {
- //如果未設(shè)置則設(shè)置緩存實(shí)例
- if(!isset($this->cache))
- {
- $this->cache= Cache::getInstance('Memcache');
- }
- }
- /**
- * 刪除緩存
- * @param$cachename 緩存名稱
- */
- protected function rm($cachename)
- {
- $this->cache->rm($cachename);
- }
- }
- ?>
這里以城市表信息的memcache緩存為例來實(shí)現(xiàn)緩存的獲取及調(diào)用
- <?php
- class DistrictModel extends MetaModel
- {
- /**
- * 獲取省市區(qū)
- * TODO:現(xiàn)在先用文件緩存,部署memcache后用 內(nèi)存緩存就好了
- */
- public function getDistrict()
- {
- //獲得數(shù)據(jù)
- if(!$this->cache->get('district'))
- {
- //寫入cache,5000多條的時(shí)候就掛掉了,數(shù)據(jù)不能超過1M
- $this->cache->set('district',$this->where('level=2 or id in (1,2,9,22)')- >select(),0,-1);
- }
- return $this->cache->get('district');
- }
- }
- ?>
調(diào)用過程,在調(diào)用過程中,先創(chuàng)建cache實(shí)例,在進(jìn)行調(diào)用,緩存數(shù)據(jù),如果緩存數(shù)據(jù)則直接讀取數(shù)據(jù)
4 結(jié)語(yǔ)
本文主要是從大家設(shè)計(jì)過程中常見的問題進(jìn)行討論,對(duì)于數(shù)據(jù)庫(kù)設(shè)計(jì)方面還存在很多的不足,大家是否在項(xiàng)目中也是自己設(shè)計(jì)的呢?
原文標(biāo)題:以用戶為中心的SNS站點(diǎn)數(shù)據(jù)庫(kù)設(shè)計(jì)及實(shí)現(xiàn)
鏈接:http://www.cnblogs.com/scotoma/archive/2010/08/08/1794964.html
【編輯推薦】
- SNS網(wǎng)站數(shù)據(jù)庫(kù)技術(shù)分析
- MySQL 修改密碼的6個(gè)好用方案
- MySQL數(shù)據(jù)庫(kù)訪問妙招在Linux之下
- 從MySQL數(shù)據(jù)庫(kù)表中來檢索數(shù)據(jù)并不難
- 圖解MySQL數(shù)據(jù)庫(kù)安裝與實(shí)際操作