架构实战营模块八作业

/ 架构实战营 / 没有评论 / 202浏览

【作业内容】设计消息队列存储消息数据的 MySQL 表格 【作业要求】

  1. 包括表名、字段、索引;
  2. 用文字描述设计思路和理由,例如:为什么设计某个索引?
  3. 一页 PPT 即可。

【设计】

一、消息记录表

DROP TABLE IF EXISTS `mq_record_xx`;
CREATE TABLE `mq_record_xx` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `msg_id` varchar(36) DEFAULT NULL COMMENT '消息 id,唯一键',
  `producer_id` varchar(36) DEFAULT NULL COMMENT '生产者 id',
  `content` varchar(4096) DEFAULT NULL COMMENT '消息内容',
  `create_time` datetime DEFAULT NULL COMMENT '消息创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `msg_id`,
  INDEX [index1] (username(36), content(4096))  
) ENGINE=InnoDB AUTO_INCREMENT=0;

常用 sql:

select content from mq_record_xx where msgId = ?

二、消息队列表

DROP TABLE IF EXISTS `mq_topic_xx`;
CREATE TABLE `mq_topic_xx` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增 id',
  `msg_id` varchar(36) DEFAULT NULL COMMENT '消息 id,唯一键',
  `producer_id` varchar(36) DEFAULT NULL COMMENT '生产者 id',
  `consumer_id` varchar(36) DEFAULT NULL COMMENT '消费者 id',
  `create_time` datetime DEFAULT NULL COMMENT '消息创建时间',
  `status` tinyint(1) NOT NULL DEAULT 0 COMMENT '状态,0 是未消费,1 是消费',
  `consume_time` datetime DEFAULT NULL COMMENT '消费时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `msg_id`,
  CONSTRAINT fk_msg_id FOREIGN KEY(msg_id) REFERENCES mq_record_xx(msg_id),
  INDEX [index1] (consumer_id(36), status(1))  
) ENGINE=InnoDB AUTO_INCREMENT=0;

常用 sql:消费者获取下一条未被读取的消息

select * from mq_topic_xxx where consumer_id = A and status  = 0 order by id asc limit 1