天天看点

如何做一个类似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

继续阅读