个人消息的表结构

Lar*_*i13 11 mysql database-design table-structure

在私人消息中存储用户之间对话的最佳表结构是什么?每个用户都可以向许多接收者发送个人信息.每条消息都有发送方标志:是否删除消息每条消息都有接收方标志:消息未读,已读或已删除每条消息都可以删除(设置标记'已删除')

PrivateMessages的主页面应如下所示:

例如,User1将Message1发送给User2和User3.在私人消息页面上,我必须显示2条相同的消息:

  1. 将Message1发送给user2
  2. 将Message1发送给user3

下一步 - User2回复Message2,我将在同一页面上看到以下内容:

  1. 从user2收到Message2(在Message1上回复)
  2. 将Message1发送给user3

下一步,我回复message3,我会看到

  1. 将Message3发送给user2
  2. 将Message1发送给user3

等等.

任何人都可以提供表结构吗?我正在使用MySQL 5.5

主要问题.如何只获取每个对话框的最后一条未删除的消息?

UPD.

我需要在当前用户和其他用户之间的主页对话框列表中看到(具有分页,按日期DESC排序).

Gre*_*reg 10

我将首先回答您的主要问题,然后显示我将用于此的表格结构.

要仅获取特定对话框的最后一条未删除消息:

select
    Message.Id
   ,Message.Subject
   ,Message.Content
from Message
join Junc_Message_To on Fk_Message = Message.Id
where Junc_Message_To.Fk_User =  {RECIPIENT_ID}
  and Message.Fk_User__From   =  {SENDER_ID}
  and Junc_Message_To.Deleted is null
order by Junc_Message_To.Sent desc
limit 1
Run Code Online (Sandbox Code Playgroud)

可以使用简单的三表结构.

表1存储用户记录 - 每个用户一条记录.

表2存储消息记录 - 每条消息一条记录,外键与发送消息的用户相关.

表3存储了消息和发送消息的用户之间的相关性.

在此输入图像描述

以下是用于创建上表图的SQL:

create table `User` (
  `Id`            int          not null auto_increment ,
  `Username`      varchar(32)  not null ,
  `Password`      varchar(32)  not null ,
  primary key     (`Id`) ,
  unique index     `Username_UNIQUE` (`Username` ASC) )
engine = InnoDB

create table `Message` (
  `Id`            int          not null auto_increment ,
  `Fk_User__From` int          not null ,
  `Subject`       varchar(256) not null ,
  `Content`       text         not null ,
  primary key   (`Id`) ,
  index          `Fk_Message_User__From` (`Fk_User__From` ASC) ,
  constraint     `Fk_Message_User__From`
    foreign key (`Fk_User__From` )
    references   `User` (`Id` )
    on delete cascade
    on update cascade)
engine = InnoDB

create table `Junc_Message_To` (
`Fk_Message`      int          not null ,
  `Fk_User`       int          not null ,
  `Sent`          datetime     not null ,
  `Read`          datetime     not null ,
  `Deleted`       datetime     not null ,
  PRIMARY KEY    (`Fk_Message`, `Fk_User`) ,
  INDEX           `Fk_Junc_Message_To__Message` (`Fk_Message` ASC) ,
  INDEX           `Fk_Junc_Message_To__User` (`Fk_User` ASC) ,
  constraint      `Fk_Junc_Message_To__Message`
    foreign key  (`Fk_Message` )
    references    `Message` (`Id` )
    on delete cascade
    on update cascade,
  constraint      `Fk_Junc_Message_To__User`
    foreign key  (`Fk_User` )
    references    `User` (`Id` )
    on delete cascade
    on update cascade)
engine = InnoDB
Run Code Online (Sandbox Code Playgroud)