Один из способов может состоять в том, чтобы отделить глобальные сообщения от личных сообщений, как я думаю, вы уже пытались это сделать.
Чтобы эффективно получить статус чтения для глобального сообщения, вам необходимо добавитьтаблица с составным ключом, содержащим вместе global_message_id и user_id.
messages_tbl
- message_id | int(11) | Primary Key / Auto_Increment
- message_type | int(11)
- sender_id | int(11) | FK to sender
- receiver_id | int(11) | FK to receiver
- status | int(1) | 0/1 for Unread / Read
- message | text
- date | datetime
global_message_tbl
- g_message_id | int(11) | Primary Key / Auto_Increment
- g_message_type | int(11)
- sender_id | int(11) | FK to sender
- date | datetime
global_readstatus_tbl
- user_id | int(11) | Primary Key
- g_message_id | int(11) | Primary Key
- date | datetime
В качестве альтернативы объедините messages_tbl
и global_message_tbl
, чтобы каждый пользователь лично отправлял глобальное сообщение в цикле.Это сокращает вашу схему до одной таблицы.
messages_tbl
- message_id | int(11) | Primary Key / Auto_Increment
- sender_id | int(11) | FK to sender
- receiver_id | int(11) | FK to receiver
- status | int(1) | 0/1 for Unread / Read
- message_type | varchar(8) | Personal / Global / Company
- message | text
- date | datetime
- type | varchar(8)
Если вы хотите немного лучше нормализовать вашу таблицу и упростить добавление типов сообщений в будущем, переместите message_type обратно в свой собственныйснова создайте таблицу и сделайте message_type
FK для message_type_id
message_type_tbl
- message_type_id | int(11) | Primary Key / Auto_Increment
- message_type | varchar(8) | Personal / Global / Company
Обновление - таблица образцов (1 таблица)
message_tbl
message_id | message_type | sender_id | receiver_id | status | message | datetime
1 | personal | 2 | 3 | read | foobar | 12/04/11 00:09:00
2 | personal | 2 | 4 | unread | foobar | 12/04/11 00:09:00
3 | personal | 3 | 2 | unread | barfoo | 12/04/11 02:05:00
4 | global | 1 | 2 | unread | gmessage | 13/04/11 17:05:00
5 | global | 1 | 3 | unread | gmessage | 13/04/11 17:05:00
6 | global | 1 | 4 | read | gmessage | 13/04/11 17:05:00
user_tbl
user_id | name
1 | Admin
2 | johnsmith
3 | mjordan
4 | spippen
Выше предполагается, что пользователи 2, 3 и 4 являются обычными пользователями, отправляющими сообщения друг другу, пользователь 1 - это учетная запись администратора, которая будет использоваться для отправки глобальных сообщений.(доставляется непосредственно каждому пользователю индивидуально), позволяя вам видеть ту же информацию, как если бы это было личное сообщение.
Чтобы отправить глобальное сообщение в этом формате, вы просто зациклились бы на таблице пользователей, чтобы получить все идентификаторы.Вы хотите отправить глобальное сообщение, а затем просто INSERT
строк для каждого пользователя в messages_tbl
.
Если вы не ожидаете, что ваши пользователи будут отправлять миллионы сообщений в день, а также регулярноГлобальныйсообщения миллионам пользователей, тогда количество строк не должно быть проблемой.Вы всегда можете удалить старые прочитанные сообщения от пользователей, создав сценарий очистки.