› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
gxz
V2EX  ›  MySQL

网站消息表设计问题

  •  1
     
  •   gxz · Apr 20, 2020 · 3402 views
    This topic created in 2355 days ago, the information mentioned may be changed or developed.

    业务需要在消息中心处以不同消息模板展示给用户,比如有帖子被评论、评论被回复、被 @等等。

    需要显示:

    Ganxiaozhe 回复了你在 XXX 的评论 [查看]

    问题:如何设计消息数据表比较优雅(最优数据读写以及查询的方案)

    目前数据表设计如下

    user_basic 用户数据表部分:
    | 字段      | 类型         |
    | :-------- | ------------ |
    | id        | int(11)      |
    | status    | tinyint(4)   |
    | name      | varchar(16)  |
    | email     | varchar(256) |
    | password  | text         |
    | avatar    | varchar(255) |
    
    comment 评论数据表:
    | 字段    | 类型         |
    | :------ | :----------- |
    | id      | int(11)      |
    | sort    | varchar(32)  |
    | attr    | varchar(255) |
    | type    | tinyint(4)   |
    | uid     | int(11)      |
    | comment | text         |
    | time    | datetime     |
    | ppid    | int(11)      |
    | pid     | int(11)      |
    | puid    | int(11)      |
    
    user_msg 消息数据表:
    | 字段      | 类型       |
    | :-------- | :--------- |
    | ID        | int(11)    |
    | TYPE      | tinyint(4) |
    | STATUS    | tinyint(4) |
    | UID       | int(11)    |
    | CRT_ID    | int(11)    |
    | CTR_DT    | int(11)    |
    | SOURCE_ID | int(11)    |
    

    目前实现为 PHP 后端取得 MySQL 数据后,以数组对象传给前端(一次取 20 条最新消息)。依靠 user_msg 中的 TYPE 判断使用哪个模板类型,若为评论(1),那么则通过 CRT_ID 向 user_basic 取得用户名和头像。再根据 SOURCE_ID 向 comment 取得具体页面及内容。

    问题是这样需要递归多次请求,以及如果后面需追加模板也比较繁琐,比如问答的:

    Ganxiaozhe 回答了你提出的问题 XXX [查看]

    在之前的业务我是直接将信息写在了数据库里,但感觉有点占空间,所以这次准备采用模板的方法。不知道这样是否是实现的最佳方案,非常期待大家的回答,还请不吝赐教!

    1 replies  •  2020-04-22 19:54:23 +08:00
    gxz
        1
    gxz  
    OP
       Apr 22, 2020
    在我一目十行之下看了一些 MySQL 性能的书籍之后,问题暂时解决惹。
    现在消息显示根据不同模板( TYPE 值)方式如:
    > XXX 回复了你的评论
    > (评论前 90 字内容)
    > [查看]

    XXX 根据 `CRT_UID` 在 `user_basic` 中取得用户名和头像,
    回复了你的评论 根据 `TYPE` 得到,
    (评论前 90 字内容)为 `SRE_DETAIL` 字段
    查看操作根据需要通过 `SRE_ID` 在指定表中取得数据。( TYPE )

    msg 表如下:
    ```
    | 名字 | 类型 | 注释 |
    | :--------- | :----------- | :------- |
    | ID | int(11) | |
    | TYPE | tinyint(4) | |
    | STATUS | tinyint(4) | |
    | UID | int(11) | 接收者 |
    | SRE_ID | int(11) | 来源 ID |
    | SRE_DETAIL | varchar(255) | 来源标题 |
    | CRT_UID | int(11) | 创建人 |
    | CRT_DT | datetime | 创建时间 |
    ```
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2333 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 08:03 · PVG 16:03 · LAX 01:03 · JFK 04:03
    ♥ Do have faith in what you're doing.