Базовый дизайн внутренней базы сообщений - PullRequest
1 голос
/ 27 октября 2011

Я пытаюсь создать базовую систему внутренних сообщений.Единственное «особое» замечание - пользователь может отправить сообщение нескольким получателям, а получатель сообщения может ответить всем (если применимо).Это то, что у меня сейчас есть:

MESSAGE TABLE
- thread_id
- message_id
- subject
- content
- date_sent
- from (FK to user_id)
- to (FK to user_id(s))

READ TABLE
- message_id (FK)
- recipient (FK to user_id, limit one un-read message per thread)
- read (boolean)

Достаточно ли этого дизайна БД для внутренней системы обмена сообщениями, или ему не хватает какого-либо / какого-либо способа ее улучшения?Спасибо.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011
user
    user_id   

message
    thread_id (surrogate id to grant easy access to whole conversation)
    message_id
    parent_message_id (message replied on can be used to show replies in tree-view form. FK to message)
    subject
    contect
    date
    from_id (FK to user)

message_user
    message_id (FK to message)
    user_id (FK to user_id)
    status (readed, deleted, new....)

«Ограничить одно непрочитанное сообщение» должно быть обработано запросом, получающим счетчик thread_id с status = 'new'.

0 голосов
/ 27 октября 2011

Кажется, что между сообщениями и получателями существует отношение многие ко многим. Поэтому я бы выделил это в таблицу соединений; вы также можете поставить флаг «чтение» в эту таблицу соединений.

Это даст вам что-то вроде:

MESSAGE TABLE
- thread_id
- message_id
- subject
- content
- date_sent
- from (FK to user_id)


MESSAGE_RECIPIENT TABLE
- message_id (FK)
- recipient (FK to user_id)
- read (boolean)

Ваше требование показывать только одно непрочитанное сообщение для потока - это проблема с отображением, и я бы не пустил его в базу данных. В вашем коде переднего плана у вас должна быть логика, показывающая меньшее из действительного числа непрочитанных сообщений и 1 при расчете количества непрочитанных сообщений для отображения.

Чтобы найти всех получателей сообщения (чтобы вы могли «ответить всем»), вам необходимо присоединиться к таблице MESSAGE_RECIPIENT следующим образом:

select u.email_address
from   users u, 
       message m, 
       message_recipient mr
where  u.user_id   = mr.recipient
and    mr.message_id = m.message_id
and    m.message_id  = $whateverYourCurrentMessageIDis

(извинения за синтаксис архаичного объединения)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...