MySQL以用戶為本 構建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 ,群組作為系統獨立模塊獨立出來
常用表 常有表從實體表中分離出來,放站點需要的表
#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
【編輯推薦】




















