天天看點

如何做一個類似QQ說說體系的表結構(一)

如何做一個類似QQ說說體系的表結構

分析
  1. 首先使用者是一個單獨表,包括使用者基本資訊。
  2. 對于說說表,可以包括一些基本的資訊,包括說說文字、發表日期、發表地點、浏覽次數、點贊數等。但是,說說中的圖檔不能放在該表中,因為可能有多張圖檔,無法确定圖檔張數
  3. 應該另外建一張圖檔表,該表就是說說裡面的圖檔。以說說主鍵為外鍵。
  4. 對于評論表,首先有一個id,還要有一個判斷是評論說說還是評論評論(=_=)的字段。還有,一個判斷該評論所屬的 id(我評論了哪條評論),該id(外鍵)以自己的id(主鍵)作為外鍵(重點),由此找到評論了哪條評論。
建表
  1. user(使用者表,例如QQ賬号):uid,uname,uimg(頭像)。
  2. tops(說說表):tid、tcontent(文字内容)、tdatetime(發表日期)、tplace(發表地點)、tvie ws(浏覽次數)、tzan(點贊數)、uid
  3. imgs(說說裡面的圖檔,可能有多張圖檔,另外建構表):iid、iurl(圖檔連結)、tid
  4. comments(評論表):cid、ccontent(評論内容)、cstate(評論低級:是不是評論發說說人,還是評論評論的人)、cid、tid、uid
建表語句
建表語句最後附源碼中
           
如何做一個類似QQ說說體系的表結構(一)
插入語句
  1. 插入user表

    INSERT INTO USER

    VALUES

    (1, ‘張三’, ‘我是張三的頭像位址’),

    (2, ‘李四’, ‘我是李四的頭像位址’),

    (3, ‘王五’, ‘我是王五的頭像位址’),

    (4, ‘趙六’, ‘我是趙六的頭像位址’);

  2. 插入tops表

    INSERT INTO tops

    VALUES

    (

    1,

    ‘今天蘇州的天氣真差’,

    ‘2016-06-15’,

    ‘蘇州’,

    3,

    5,

    1

    ),

    (

    2,

    ‘尼瑪,又輸了。’,

    ‘2016-07-13’,

    ‘鄭州’,

    3,

    5,

    2

    ),

    (

    3,

    ‘煙花三月下揚州’,

    ‘2016-03-03’,

    ‘揚州’,

    3,

    5,

    3

    ),

    (

    4,

    ‘我們一起去周莊吧’,

    ‘2016-04-06’,

    ‘上海’,

    3,

    5,

    3

    );

  3. 插入圖檔表

    INSERT INTO imgs

    VALUES

    (

    1,

    ‘我是說說1的圖檔資源-1’,

    1

    ),

    (

    2,

    ‘我是說說1的圖檔資源-2’,

    1

    ),

    (

    3,

    ‘我是内容1的圖檔資源-3’,

    1

    ),

    (

    4,

    ‘我是内容1的圖檔資源-4’,

    1

    );

    INSERT INTO imgs

    VALUES

    (

    4,

    ‘我是内容2的圖檔資源-1’,

    2

    ),

    (

    5,

    ‘我是内容2的圖檔資源-2’,

    2

    );

  4. 插入評論表
    #預設值設定:
    #cstate:0 評論說說;1:評論評論
    #cid_id:0 評論說說 其它值:是什麼id就評論那個id的評論
    
    #使用者id為3的人評論說說編号為1的内容
    INSERT comments VALUES(1,'瞎扯,有鄭州的天氣差嗎?我還沒見過!',0,null,1,3);
    
    #插入一條評論說說1 的評論
    INSERT comments VALUES(2,'我也感覺蘇州的天氣可差勁',0,null,1,4);
    
    #使用者id為2的人評論說說标号為1的評論的編号為1的評論。日了,醉了、
    INSERT comments VALUES(3,'鄭州的天氣差?有北京的差嗎?瞎扯!',1,1,1,2);
    
    #插入一條評論說說1 的評論
    INSERT comments VALUES(4,'蘇州的天氣差嗎?!',0,null,1,3);
    
    #使用者id為4的人評論說說标号為1的評論的編号為2的評論。
    INSERT comments VALUES(5,'呵呵。北京天氣那麼差,都特麼一個一個的跑去魔都?!',1,3,1,4);
    
    #使用者id為2的人評論說說編号為3的内容
    INSERT comments VALUES(6,'下揚州幹嘛?',0,null,3,2);
               
  5. 任務

    請查出說說編号1的 擁有者id、擁有者名字、說說内容、【評論人id、評論人姓名、評論内容】—-所有子評論。

  6. 嘗試用查詢語句得到5的答案

    第一步:查出說說編号1的 擁有者id、擁有者名字、說說内容

    select user.uid, user.uname,tops.tcontent from user,tops where tops.uid=user.uid and cid=1;
               
    第二步:查詢出直接評論說說的所有評論,包括:評論人名字,評論内容,評論的說說的内容,說說的擁有者id(不是評論評論的内容)
    select user.uname,comments.ccontent,tops.tcontent,tops.uid from user,comments,tops where comments.uid=user.uid and comments.tid=tops.tid and comments.cstate=0 and tops.tid=1;
               
    第三步:查詢出評論評論的内容,包括:評論人名字,評論内容,評論的評論的内容,評論的評論的評論人名字,評論的說說的内容,說說的擁有者
    【select (select  user.uname,comments.ccontent from comments where    )user.uname,comments.ccontent,
         tops.tcontent,tops.uid 
    from user,comments,tops where comments.uid=user.uid and comments.tid=tops.tid and comments.cstate=1 and tops.tid=1;
    
    cid ccontent cid_id tid uid】X   該步難以實作。考慮用java代碼實作。該部分通過jdbc實作 
               
  7. java的代碼實作的主要步驟:擷取根據說說id每個表在java 中對應的對象,然後周遊,當然,周遊過程中有很多處理。
  8. 沒有解決的問題:如果有人插入到評論中兩個人的對話,不會按照實際中說說評論的順序,而是按照原來兩人對話的順序排序。多餘的字段:評論表中cstste,因為在java中可以根據cid_id判斷是不是評論說說還是評論評論,是以該字段顯得多餘。
  9. 資料庫源碼

    /*

    Navicat MySQL Data Transfer

    Source Server         : 123
    Source Server Version : 50027
    Source Host           : localhost:3306
    Source Database       : shuo
    
    Target Server Type    : MYSQL
    Target Server Version : 50027
    File Encoding         : 65001
    
    Date: 2016-03-19 12:10:47
    */
    
    SET FOREIGN_KEY_CHECKS=0;
    
    -- ----------------------------
    -- Table structure for `comments`
    -- ----------------------------
    DROP TABLE IF EXISTS `comments`;
    CREATE TABLE `comments` (
      `cid` int(11) NOT NULL auto_increment,
      `ccontent` text,
      `cstate` int(11) default NULL,
      `cid_id` int(11) default NULL,
      `tid` int(11) NOT NULL,
      `uid` int(11) NOT NULL,
      PRIMARY KEY  (`cid`),
      KEY `tid` (`tid`),
      KEY `uid` (`uid`),
      KEY `fk_1` (`cid_id`),
      CONSTRAINT `comments_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `tops` (`tid`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `comments_ibfk_2` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT `fk_1` FOREIGN KEY (`cid_id`) REFERENCES `comments` (`cid`) ON DELETE CASCADE ON UPDATE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of comments
    -- ----------------------------
    INSERT INTO `comments` VALUES ('1', '瞎扯,有鄭州的天氣差嗎?我還沒見過!', '0', null, '1', '3');
    INSERT INTO `comments` VALUES ('2', '我也感覺蘇州的天氣可差勁', '0', null, '1', '4');
    INSERT INTO `comments` VALUES ('3', '鄭州的天氣差?有北京的差嗎?瞎扯!', '1', '1', '1', '2');
    INSERT INTO `comments` VALUES ('4', '蘇州的天氣差嗎?!', '0', null, '1', '3');
    INSERT INTO `comments` VALUES ('5', '呵呵。北京天氣那麼差,都特麼一個一個的跑去魔都?!', '1', '3', '1', '4');
    INSERT INTO `comments` VALUES ('6', '下揚州幹嘛?', '0', null, '3', '2');
    
    -- ----------------------------
    -- Table structure for `imgs`
    -- ----------------------------
    DROP TABLE IF EXISTS `imgs`;
    CREATE TABLE `imgs` (
      `iid` int(11) NOT NULL auto_increment,
      `iurl` varchar(200) default NULL,
      `tid` int(11) NOT NULL,
      PRIMARY KEY  (`iid`),
      KEY `tid` (`tid`),
      CONSTRAINT `imgs_ibfk_1` FOREIGN KEY (`tid`) REFERENCES `tops` (`tid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of imgs
    -- ----------------------------
    INSERT INTO `imgs` VALUES ('1', '我是說說1的圖檔資源-1', '1');
    INSERT INTO `imgs` VALUES ('2', '我是說說1的圖檔資源-2', '1');
    INSERT INTO `imgs` VALUES ('3', '我是内容1的圖檔資源-3', '1');
    INSERT INTO `imgs` VALUES ('4', '我是内容1的圖檔資源-4', '1');
    INSERT INTO `imgs` VALUES ('5', '我是内容2的圖檔資源-1', '2');
    INSERT INTO `imgs` VALUES ('6', '我是内容2的圖檔資源-2', '2');
    
    -- ----------------------------
    -- Table structure for `tops`
    -- ----------------------------
    DROP TABLE IF EXISTS `tops`;
    CREATE TABLE `tops` (
      `tid` int(11) NOT NULL auto_increment,
      `tcontent` text,
      `tdatetime` varchar(20) default NULL,
      `tplace` varchar(20) default NULL,
      `tviews` int(11) default NULL,
      `tzan` int(11) default NULL,
      `uid` int(11) NOT NULL,
      PRIMARY KEY  (`tid`),
      KEY `uid` (`uid`),
      CONSTRAINT `tops_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of tops
    -- ----------------------------
    INSERT INTO `tops` VALUES ('1', '今天蘇州的天氣真差', '2016-06-15', '蘇州', '3', '5', '1');
    INSERT INTO `tops` VALUES ('2', '尼瑪,又輸了。', '2016-07-13', '鄭州', '3', '5', '2');
    INSERT INTO `tops` VALUES ('3', '煙花三月下揚州', '2016-03-03', '揚州', '3', '5', '3');
    INSERT INTO `tops` VALUES ('4', '我們一起去周莊吧', '2016-04-06', '上海', '3', '5', '3');
    
    -- ----------------------------
    -- Table structure for `user`
    -- ----------------------------
    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `uid` int(11) NOT NULL auto_increment,
      `uname` varchar(20) default NULL,
      `uimg` varchar(100) default NULL,
      PRIMARY KEY  (`uid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    -- ----------------------------
    -- Records of user
    -- ----------------------------
    INSERT INTO `user` VALUES ('1', '張三', '我是張三的頭像位址');
    INSERT INTO `user` VALUES ('2', '李四', '我是李四的頭像位址');
    INSERT INTO `user` VALUES ('3', '王五', '我是王五的頭像位址');
    INSERT INTO `user` VALUES ('4', '趙六', '我是趙六的頭像位址');
               
  10. java操作帶資料庫源碼

    http://download.csdn.net/detail/wgyscsf/9466400

繼續閱讀