Боевая серия Java Spike System ~ общее введение в бизнес-процессы и проектирование базы данных

база данных

Резюме:

Этот пост в блоге является третьим из серии "Реальная боевая система Java Seckill". Этот пост в блоге в основном представляет общий бизнес-процесс системы seckill, проектирует базу данных в соответствии с соответствующим бизнес-процессом и, наконец, использует обратный инжиниринг Mybatis для создания соответствующий класс сущности Entity, интерфейс Mapper для работы с Sql и файл конфигурации Mapper.xml для написания динамического Sql.

содержание:

Что касается общего бизнес-процесса системы seckill, я полагаю, что умные друзья уже будут знать общую идею, когда прочитают второй пост в блоге! Потому что в предоставленной ссылке для загрузки базы данных исходного кода Debug представил друзьям общий бизнес-процесс системы seckill, а также показал его друзьям в виде видео! Ссылка для скачивания базы данных исходного кода выглядит следующим образом:git ee.com/steady jack/…В этом сообщении блога Debug по-прежнему уделит немного места, чтобы представить его!


На следующем рисунке показан общий бизнес-процесс системы seckill:


Из этой бизнес-схемы видно, что основная логика обработки:

(1) Сначала определите, раскупил ли текущий пользователь продукт, если нет, это означает, что пользователь не раскупил продукт и может перейти к следующей логике обработки.

(2) Определите оставшееся количество продукта, которое можно забрать, т. е. достаточно ли запасов (т. е. больше ли оно 0), и если да, введите следующую логику обработки.

(3) Вычтите инвентарь и обновите инвентарь, соответствующий записи панической покупки в базе данных (обычно операция вычитания), и определите, была ли операция базы данных по обновлению инвентаря успешной.Если это так, создайте заказ, который пользователь успешно убит за считанные секунды и асинхронно отправлять SMS-сообщения или уведомления по электронной почте, чтобы уведомить пользователей

(4) Если какой-либо шаг вышеприведенной логики работы не соответствует условиям, весь процесс seckill будет завершен напрямую, то есть seckill завершится ошибкой!


На следующем рисунке показана основная логика обработки, когда серверная часть обрабатывает «запрос Seckill».



Объединив эти два бизнес-процесса, давайте войдем в ссылку проектирования базы данных «Системы Seckill», которая в основном включает следующие таблицы: элемент таблицы информации о продукте, информационная таблица item_kill to be kill, таблица записей item_kill_success второго убийства и таблица пользовательской информации user. ; конечно, на самом большом веб-сайте таблица базы данных, которую он содержит, намного больше! Эта система на данный момент сжимает несколько основных таблиц!

Модель дизайна базы данных «Spike System» показана ниже:


Затем реверс-инжиниринг Mybatis используется для создания класса сущностей Entity, соответствующего этим таблицам базы данных, интерфейса Mapper для работы с Sql и файла конфигурации Mapper.xml для написания динамического Sql. Как показано ниже:



Ниже размещен один из классов сущностей и соответствующий интерфейс Mapper и код Mapper.xml.Для остальных можно перейти по ссылке:git ee.com/steady jack/…Перейти к загрузке, чтобы проверить это! Первый — это исходный код класса сущностей ItemKill:

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class ItemKill {
    private Integer id;
    private Integer itemId;
    private Integer total;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date endTime;
    private Byte isActive;
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    private Date createTime;
    private String itemName;
    //采用服务器时间控制是否可以进行抢购
    private Integer canKill;
}


Затем исходный код интерфейса ItemKillMapper:

import com.debug.kill.model.entity.ItemKill;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ItemKillMapper {
    List<ItemKill> selectAll();
    ItemKill selectById(@Param("id") Integer id);
    int updateKillItem(@Param("killId") Integer killId);
    ItemKill selectByIdV2(@Param("id") Integer id);
    int updateKillItemV2(@Param("killId") Integer killId);
}


И, наконец, исходный код конфигурационного файла ItemKillMapper.xml:

<!--查询待秒杀的活动商品列表-->
  <select id="selectAll" resultType="com.debug.kill.model.entity.ItemKill">
    SELECT
      a.*,
      b.name AS itemName,
      (
        CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0)
          THEN 1
        ELSE 0
        END
      )      AS canKill
    FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id
    WHERE a.is_active = 1
  </select>
  <!--获取秒杀详情-->
  <select id="selectById" resultType="com.debug.kill.model.entity.ItemKill">
    SELECT
      a.*,
      b.name AS itemName,
      (
        CASE WHEN (now() BETWEEN a.start_time AND a.end_time AND a.total > 0)
          THEN 1
        ELSE 0
        END
      )      AS canKill
    FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id
    WHERE a.is_active = 1 AND a.id= #{id}
  </select>
 
  <!--抢购商品,剩余数量减一-->
  <update id="updateKillItem">
    UPDATE item_kill
    SET total = total - 1
    WHERE
        id = #{killId}
  </update>
 
  <!--获取秒杀详情V2-->
  <select id="selectByIdV2" resultType="com.debug.kill.model.entity.ItemKill">
    SELECT
      a.*,
      b.name AS itemName,
      (CASE WHEN (now() BETWEEN a.start_time AND a.end_time)
        THEN 1
       ELSE 0
       END)  AS canKill
    FROM item_kill AS a LEFT JOIN item AS b ON b.id = a.item_id
    WHERE a.is_active = 1 AND a.id =#{id} AND a.total>0
  </select>
 
  <!--抢购商品,剩余数量减一-->
  <update id="updateKillItemV2">
    UPDATE item_kill
    SET total = total - 1
    WHERE id = #{killId} AND total>0
  </update>
</mapper>

Стоит отметить, что соответствующие методы вышеперечисленных классов сущностей интерфейсов ItemKill и ItemKillMapper и их соответствующие динамические значения Sql можно игнорировать на данный момент и сосредоточить внимание на введении, когда соответствующая бизнес-практика будет представлена ​​позже.  

До сих пор здесь были представлены общий бизнес-процесс «Системы Seckill», основная логика обработки внутреннего интерфейса и приложение обратного проектирования Mybatis. В следующем разделе будет введена фактическая боевая ссылка кода!


Пополнить:

1. В настоящее время общая конструкция и кодирование этой системы seckill завершены.Полный адрес базы данных исходного кода можно скачать здесь:git ee.com/steady jack/… Помните Вилку и Звезду!!!