2014-01-23 3 views
0

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

В настоящее время у меня он настроен с одной таблицей messages, которая хранит сообщения и другую таблицу recipients, которая хранит запись для каждого получателя за сообщение.

Например, если у меня есть сообщение с идентификатором 1, который посылается три пользователей alex, bill, chris, то recipients таблица будет выглядеть следующим образом:

recipients_id | message_id | username 
1    | 1   | alex 
2    | 1   | bill 
3    | 1   | chris 

message_id является первичным ключом messages и username это поле в таблице users (я на самом деле использую INT PK, но просто использую строку для вопроса).

Теперь просто представьте, что вместо трех пользователей сообщение отправляется нескольким сотням или даже нескольким тысячам пользователей. Это все еще жизнеспособно? Я знаю, что таблицы MySQL могут обрабатывать миллионы записей, но мне просто интересно, является ли это наиболее эффективным методом.

+0

Почему ** имя пользователь ** колонку? Лучше всего использовать только два столбца, message_id из таблицы сообщений и recipient_id из таблицы пользователей, а также временную метку отправленного сообщения. – datelligence

+0

Поле имени пользователя, как я объяснял (или скорее подразумевал) в вопросе, просто для иллюстративных целей. Я также опускаю эти тривиальные поля, такие как созданные и измененные временные метки. Если у меня нет auto-incrementing PK для таблицы получателей, должен ли идентификатор пользователя быть идентифицирующим? – Bobe

+0

О да, я забыл. Причина, по которой я не просто использую message_id и user_id в качестве составного ключа, состоит в том, что пользователи фактически находятся в двух разных таблицах (два типа пользователей) и поэтому будут дублироваться user_ids. – Bobe

ответ

1

Да, это правильный метод реализации отношений «многие ко многим» в SQL.

Единственная альтернатива - список, разделенный запятой. Но тогда вы ограничены размером столбца. И соединение с этим типом ценности сложно и неэффективно.

1

Вы на правильном пути, и да, я бы использовал user_id, а не имя пользователя в таблице получателей. MySQL, безусловно, способен обрабатывать сотни тысяч записей, подобных этому, ограниченным только объемом ОЗУ на вашем сервере MySQL.

Затем, чтобы получить список сообщений, посылаемых к конкретному пользователю (например, идентификатор пользователя 2), вы можете использовать простой присоединиться запрос типа:

SELECT * FROM recipients LEFT JOIN messages ON messages.id = recipients.message_id WHERE recipients.userid = 2 

Или, чтобы получить список получателей для конкретного сообщения (например, идентификатор сообщения 3);

SELECT * FROM recipients LEFT JOIN users ON user.id = recipients.user_id WHERE recipients.message_id = 3 

Надеется, что это помогает :)

Смежные вопросы