kalman03

          每天早上看一遍《福布斯》富翁排行榜,如果上面沒有我的名字,我就去學習......
          隨筆 - 22, 文章 - 0, 評論 - 86, 引用 - 0
          數據加載中……

          一個微博數據庫設計帶來的簡單思考

                 在微博系統中,當前用戶、關注者(也就是粉絲)、被關注者(崇拜對象)這三種角色是少不了的。他們之間看似簡單的關系,但是其中數據庫表將如何設計,卻讓我很難琢磨,在如下解決方案中,你們會選擇哪種?為什么要選擇這種?是否有更好的解決方案?

          解決方案一:

          表名

          用戶信息表

          字段名

          字段代碼

          字段類型

          描述

          用戶名

          User_id

          Varchar(20)

          主鍵

          登陸密碼

          Password

          Varchar(20)

          ……

          ……

          ……

          表名

          關注和被關注者表

          字段名

          字段代碼

          字段類型

          描述

          用戶名

          User_id

          Varchar(20)

          主鍵

          關注者

          Funs

          Text

           

          被關注者

          Wasfuns

          Text

              這是我最初想到的一種設計,這里“關注者”和“被關注者”都是采用拼接一些特殊字符分割存儲的,比如A用戶有只有關注者B、C、DE,那么存入數據庫關注者字段的數據將是B;C;D;E(暫且認為分割字符為;)。

          基于上述方案,我提出一個問題:當這個用戶的“關注者”或“被關注者”數量很大的情況下(比如10萬個關注者)將是怎樣的一串字符呢?而且當我們需要查詢“關注者”或者“被關注者”最近的博客信息,將面臨和博文信息表的一些時間排序查詢,處理難度是要浪費性能的。

          解決方案二:

              基于上述面臨的問題,有人給我提供了一個擴展性的解決方案,同時也很好的解決了一個字段海量數據的問題。將方案一中的關注和被關注者表分解成兩張表,如下:

          表名

          關注者表

          字段名

          字段代碼

          字段類型

          描述

          編號

          Id

          Number

          主鍵

          用戶名

          User_id

          Varchar(20)

          關注者編號

          Funs_id

          Varchar(20)

           

          表名

          被關注者表

          字段名

          字段代碼

          字段類型

          描述

          編號

          Id

          Number

          主鍵

          用戶名

          User_id

          Varchar(20)

          被關注者編號

          Wasfuns_id

          Varchar(20)

           

          我看到這樣的設計我很吃驚,試想一下,假如我一個用戶對應有1W個關注者,那么該用戶就會在關注者表中存在一萬條他的記錄,這難道不是嚴重的數據冗余嗎?這甚至不符合數據庫的設計規范。但是事實上證明,這種設計對大數據量的擴展是很不錯的,既然如此,那假如用戶和用戶之間的關系不只是限于關注和被關注的關系,是不是又要新增表?

          解決方案三:

                   話說“合久必分,分久必合”,對上述的設計再進一步修改,于是將方案二的兩張表又合二為一,如下:

          表名

          關注和被關注者表

          字段名

          字段代碼

          字段類型

          描述

          編號

          Id

          Int

          主鍵

          用戶名

          User_id

          Varchar(20)

          目標對象

          Operate_object

          Varchar(20)

           

          狀態

          Status

          Number

          當目標對象為關注者,標示為1;

          當目標對象為被關注者,標示為2;

          當雙方互相關注,標示為3;

          當目標對象為OO,標示為XX。

          OK,這樣的設計不僅解決了相當一部分的數據冗余,而且還能表示用戶之間的多種關系,方便系統日后的擴展。但是問題又出來了,很明顯這樣設計對狀態的維護也是存在疑問的,用一張表代替多張表,數據肯定是成倍的增長,是否不符合當前常說的“拆庫拆表”的戰略方針(好像這樣的狀態一般用于“標記男女”或者“是否刪除了”之類的,貌似用于這種場合比較的少)。

          在上述用戶關系的解決方案中,可以很簡單的歸結為就是一對多,多對一,多對多的關系嘛,那么究竟如何設計,究竟哪種更好,我很難理解,期待大家拍磚!

          posted on 2010-07-19 19:23 kalman03 閱讀(8277) 評論(13)  編輯  收藏 所屬分類: 數據庫

          評論

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          我認為方案二是最清晰的
          2010-07-20 09:31 | cxh8318

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          方案3, 以后可以根據狀態做分區或者路由.
          2010-07-20 09:48 | dead_lee

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          為什么不是這樣呢
          create user (
          user_id varchar(20) primary key,
          password varchar(160)
          );
          create watches (
          id int primary key,
          watcher varchar(20),
          watchee varcher(20)
          );
          2010-07-20 09:54 | anon

          # re: 一個微博數據庫設計帶來的簡單思考[未登錄]  回復  更多評論   

          用戶表,用戶-崇拜對象表,用戶-粉絲視圖

          需要關注的是后兩者的數據量
          2010-07-20 10:16 | Wade

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          我認為這三個方案的優劣順序為 2>1>3, 3會讓處理邏輯變得非常復雜,其實方案2應該只要一個表就可以了,fans表,因為關注和被關注是互逆的,查不同列就可以了,這樣的關系表最能體現數據庫管理數據的長處。
          2010-07-20 15:21 | HiMagic!

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          很想知道sina圍脖的庫是怎么設計的,有知道的分享一下。
          2010-07-21 10:57 | Robin's Java World

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          @Robin's Java World
          我也很想知道
          2010-07-22 11:44 | kalman03

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          贊同@anon
          2010-07-26 16:15 | watcher

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          不知道為什么這么多人說方案2好
          2011-04-08 13:15 | dohkoos

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          寫錯了,沒看清。
          如同HiMagic!和anon講的,其實方案2只要一張表就可以了
          create users (
          user_id varchar(20) primary key,
          password varchar(160)
          );
          create watches (
          id int primary key,
          watcher varchar(20),
          watchee varcher(20)
          );

          方案3是根本看不懂,不知道Operate_object這個是什么東西
          2011-04-08 13:19 | dohkoos

          # re: 一個微博數據庫設計帶來的簡單思考[未登錄]  回復  更多評論   

          可不可以這樣呢,讓數據適當的冗余下,

          user
          {
          user_id,
          user_pwd,
          ……
          fansid,
          followersid
          }

          relationship --這個是互逆的
          {
          id,
          uid,
          fanid
          }
          2011-06-28 17:32 | shine

          # re: 一個微博數據庫設計帶來的簡單思考[未登錄]  回復  更多評論   

          方案2較好

          一個用戶,不會去關注數以萬計的人。。。實踐證明,有幾千,已經很很大了。

          但一個用戶,可能被數千萬人關注,這個是重點要解決的數據膨脹。這個容易實現水平分割。
          2012-03-01 10:25 | allen

          # re: 一個微博數據庫設計帶來的簡單思考  回復  更多評論   

          @anon
          比較贊成這種方式!第一種數據冗余,在數據量大時,關系變更時操作復雜。第三種方案同樣的邏輯,關系變更時操作復雜!
          2016-02-17 13:50 | ManKane
          主站蜘蛛池模板: 吉木萨尔县| 马山县| 中阳县| 庄浪县| 方正县| 平湖市| 老河口市| 洛川县| 巴彦淖尔市| 钟祥市| 绥芬河市| 福建省| 贺州市| 繁峙县| 大荔县| 长乐市| 汉沽区| 兴宁市| 中方县| 洮南市| 长武县| 泰来县| 宜州市| 寻甸| 柏乡县| 高州市| 曲麻莱县| 石景山区| 德州市| 云梦县| 武宣县| 德江县| 射洪县| 息烽县| 县级市| 兴宁市| 太湖县| 同江市| 哈密市| 商河县| 壶关县|