[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Массовая рассылка сообщений
kirik
Доброго времени суток!

В процессе создания внутрисайтовой системы сообщений, а точнее массовой рассылки через нее, возник вопрос -
как будет грамотнее всего реализовать это?

У меня есть 2 идеи, последняя из которых пока самая подходящая.
1 - в БД создается одно сообщение, которое имеет статус "Для всех" и имеет дату, до которой оно считается действующим и показывается в инбоксе. Но тогда пользователи не смогут удалить его из своего инбокса, также нельзя будет его пометить как прочитанное.
2 - в БД создается одно сообщение с текстом, заголовком и статусом "Для всех", и для каждого из пользователей создается "ссылка" на это "родительское" сообщение. Тогда у пользователей будет полная возможность удалить/переместить это сообщение, но тогда возрастет количество записей в БД. При том что на сайте 100к человек, то при каждой массовой рассылке будет прибавлятся +100к записей..

Может есть более интересное решение подобной задачи?

Заранее спасибо за ответы!



Спустя 5 часов, 48 минут, 15 секунд (6.11.2008 - 07:13) Sylex написал(а):
Цитата(kirik @ 6.11.2008, 4:25) [snapback]53674[/snapback]
Доброго времени суток!

В процессе создания внутрисайтовой системы сообщений, а точнее массовой рассылки через нее, возник вопрос -
как будет грамотнее всего реализовать это?

У меня есть 2 идеи, последняя из которых пока самая подходящая.
1 - в БД создается одно сообщение, которое имеет статус "Для всех" и имеет дату, до которой оно считается действующим и показывается в инбоксе. Но тогда пользователи не смогут удалить его из своего инбокса, также нельзя будет его пометить как прочитанное.
2 - в БД создается одно сообщение с текстом, заголовком и статусом "Для всех", и для каждого из пользователей создается "ссылка" на это "родительское" сообщение. Тогда у пользователей будет полная возможность удалить/переместить это сообщение, но тогда возрастет количество записей в БД. При том что на сайте 100к человек, то при каждой массовой рассылке будет прибавлятся +100к записей..

Может есть более интересное решение подобной задачи?

Заранее спасибо за ответы!


1 вариант точно не катит по-моему... Я бы выбрал 2 вариант, а возможно и всем отсылал сообщение...

Скажи, реально на сайте 100к человек???? blink.gif Это че за сайт?

Спустя 1 час, 27 минут, 4 секунды (6.11.2008 - 08:40) kirik написал(а):
сайт - _http://dinersnation.com/

Цитата(Sylex)
Я бы выбрал 2 вариант, а возможно и всем отсылал сообщение...

Если каждому посылать - это база разрастется.. Из расчета 1 сообщение - 1кб, 100к сообщений - под 100 метров уже.. Если в месяц рассылать раза 2-3, это уже будет 300 метров. Думаю не самый хороший вариант =)

А насчет 1-го варианта - так делает ebay. Присылает сообщение, которое ты не можешь сам удалить, но оно имеет "срок годности", и удаляется само.

Спасибо!

Спустя 3 часа, 3 минуты, 56 секунд (6.11.2008 - 11:44) AndryG написал(а):
Разделите письмо на два куска заголовок и тело.
Заголовок отправляте каждому юзеру - он сможет с ним сделать, всё что угодно, а тело письма храните в отдельной таблице.
Периодически запускаете скрипт, который удаляет телА, на которые нет ссылок от "живых" заголовков.

Спустя 18 минут, 25 секунд (6.11.2008 - 12:02) Sylex написал(а):
хм... а если сделать так... у каждого пользователя есть поле

Цитата
readed_base_message_id int(11)


Есть простая таблица сообщений. Туда добавляются сообщения. После того, как юзер попадает в свой инбокс, он видит все сообщения по такому запросу:
SQL
SELECT
m.*
FROM TableMessages m
JOIN Users u WHERE m.id>u.readed_base_message_id


После того, как юзер нажимает удалить, у него просто инкрементируется readed_base_message_id (т.е. становится равно прочитанному id).

Таким образом рассылка сообщений - просто добавление записи в таблицу Сообщения smile.gif. Переодически можно старые записи удалять.

Единственная фича - сообщения можно удалять тока "снизу вверх". Т.е. нужно сделать, чтобы низя было удалить самое последнее сообщение... Иначе удалятся все предыдущие, возможно не прочитанные.

Спустя 2 часа, 5 минут, 52 секунды (6.11.2008 - 14:08) Alchemist написал(а):
Sylex, твой вариант не слишком хорош. Я например очень часто читаю сообщения не по порядку, а при твоем алгоритме если я прочитаю последнее сообщение то все предыдущие пометятся как прочитаные...

kirik, а зачем вообще копировать сообщение ?
Я когда-то делал подобную систему на одном из сайтов. Структура была такая:

messages: { message_id | sender_id | message_text | message_type | ... }
mess_users: { message_id | user_id | status }


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

Если все равно жаба давит добавлять сразу 100к строк (хотя тут размер строки ~10-12 байт ), то можно плясать от обратного - любое публичное сообщение считается видимым и непрочитаным пока не сказано обратное. Соответственно тут строки будут добавляться только для тех юзеров которые прочитают/удалят это сообщение.

Спустя 33 минуты, 30 секунд (6.11.2008 - 14:42) Sylex написал(а):
Цитата(Alchemist @ 6.11.2008, 17:08) [snapback]53700[/snapback]
Sylex, твой вариант не слишком хорош. Я например очень часто читаю сообщения не по порядку, а при твоем алгоритме если я прочитаю последнее сообщение то все предыдущие пометятся как прочитаные...


а если не помечать? )) Только если по-порядку будешь читать... Глючновато, конечно))

Alchemist, согласен с твоим вариантом, тоже о таком подумал. Наверное и является оптимальным. Кол-во записей правда будет также велико, но по-другому никак.

Спустя 5 часов, 7 минут, 7 секунд (6.11.2008 - 19:49) kirik написал(а):
Alchemist, хм.. интересный вариант! Тоесть в случае, когда пользователи общаются, в таблице messages: создается одна запись, а в таблице mess_users: - две, для каждого из юзеров... Тогда еще нужно в таблицу mess_users: добавить поле folder, где будет отмечаться в какой папке (инбокс, аутбокс) лежит сообщение.

Спасибо большое, ребят! =)

Спустя 19 часов, 47 минут, 37 секунд (7.11.2008 - 15:36) Alchemist написал(а):
Не совсем так.

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

При этом кстати не нужно поле folder, т.к. фактически таблица mess_users является inbox'ом, а messages - outbox'ом.

Спустя 3 часа, 16 минут, 28 секунд (7.11.2008 - 18:53) kirik написал(а):
Все, теперь понял =)

Еще раз спасибо!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.