В нереляционной СУБД (BigTable в AppEngine), как я должен настроить сущности для системы массового обмена сообщениями?

Представьте себе, например, что у меня много пользователей. Каждый раз, когда пользователь что-то сообщает, он / она может отправить это в список других пользователей (аналогично массовой рассылке). Тем не менее, я просто хочу сохранить сообщение один раз, чтобы сэкономить место на диске. Поэтому, когда один из получателей сообщения открывает свой почтовый ящик, он / она должен запросить там это сообщение. Что более эффективно с точки зрения настройки сущностей системы обмена сообщениями (таблиц)? Обратите внимание: в не-RDBMS запросы на присоединение не допускаются. Так что это правдоподобная установка, и как я могу сделать ее более эффективной (1):

Table: Message (keeps one copy of all messages)
| Message_ID | Sender | Title | Body | List of Receivers |

// In this strategy, if I'm a receiver, I would check each message and search through the list of receivers to check and see whether I'm one of the receivers or not.

Или мне следует придерживаться следующей стратегии (2):

Table: Message (keeps one copy of all messages)
| Message_ID | Sender | Title | Body |

Table: Message Receivers (store the same message ID for all receivers)
| Message_ID | Sender | Receiver |

// In this strategy, in runtime, make copies of the same message ID and same Sender and store one row for each receiver.

Какая стратегия кажется более эффективной? т.е. итерация по массиву медленнее, чем просто итерация по СУБД?

Любые комментарии будут высоко оценены.

* Примечание: сообщения могут быть произвольно длинными, поэтому я не хочу хранить несколько копий одного и того же сообщения.

Спасибо.

1 ответ

Ознакомьтесь с докладом Бретта Слаткина " Создание масштабируемых, сложных приложений на App Engine" из Google IO 09.

Он представляет шаблон, известный как "RelationIndex", который похож на ваше первое предложение, но вы перемещаете список в его собственную сущность. Установив в качестве ключевого имени объекта списка ключевое имя сообщения, вы можете сканировать сообщения для пользователя с помощью запроса keys_only, а затем загружать только само сообщение без затрат на десериализацию списка получателей.

Другие вопросы по тегам