数据库的表结构设计

问卷的角色

腾讯问卷系统实战 - 图1
一份问卷从创建到结束发生了什么:

  • 管理员创建问卷(创建表并插入问题)
  • 用户查看问卷(查询表)
  • 用户填写表(插入问答)
  • 管理员查询问卷结果(查询表)

    表格的设计

    知道了问卷整个生命周期后,看一下问卷系统需要几张表:
    首先需要一张问卷表,问卷表中记录了问卷的内容。
    由于问卷是多人回答的,每个人的答案不会改变问卷本身的内容,所以问卷表和答卷表信息是相对独立的,因此我们需要一张答卷表。
    除了这张表,还需要一张常规的用户表。

    user表(用户表)

    image.png
    image.png

    questionnaire表(问卷表)

    image.png

    replay(回复表)

    image.png ```sql DROP Table if EXISTS user;

CREATE TABLE user ( id VARCHAR (40)NOT NULL, login_name VARCHAR (20) NOT NULL, password VARCHAR(50) NOT NULL, mobile VARCHAR(20) NOT NULL, email VARCHAR(50) , name VARCHAR(50) NOT NULL, gender VARCHAR(10) NOT NULL, gmt_created datetime , gmt_modified datetime , PRIMARY KEY ( id ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP Table if EXISTS questionnaire;

CREATE TABLE questionnaire ( id VARCHAR (40)NOT NULL, title VARCHAR (40) NOT NULL, description TEXT NOT NULL, status VARCHAR(20) NOT NULL, content TEXT NOT NULL, author VARCHAR(40) NOT NULL, gmt_created datetime , gmt_modified datetime , PRIMARY KEY ( id ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;

DROP Table if EXISTS reply;

CREATE TABLE reply ( id VARCHAR (40)NOT NULL, ques_id VARCHAR (40) NOT NULL, ques_index int(20) NOT NULL, user_id VARCHAR(40) NOT NULL, content TEXT NOT NULL, gmt_created datetime , gmt_modified datetime , PRIMARY KEY ( id ) )ENGINE=InnoDB DEFAULT CHARSET=utf8;

  1. 查询在user表,但是没有在replay表和questionnaire表中的人。
  2. ```sql
  3. SELECT
  4. *
  5. FROM
  6. user
  7. LEFT JOIN reply on user.id = reply.user_id
  8. LEFT JOIN questionnaire on user.id = questionnaire.author
  9. WHERE
  10. reply.user_id IS NULL AND questionnaire.author IS NULL;