В нереляционной СУБД (BigTable в AppEngine) как мне настроить объекты для системы массового обмена сообщениями? - PullRequest
2 голосов
/ 04 февраля 2011

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

1 голос
/ 04 февраля 2011

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

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

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