Rails 3, когда уже слишком поздно переключаться на NoSQL? (кейс: создание системы последователей) - PullRequest
1 голос
/ 12 декабря 2010

У меня есть таблица для user и другая таблица для follower.Таблица подписчиков представляет собой список user_id с и follower_id с.Кажется, довольно прямо.

Я планировал использовать mysql для производства, и мне кажется, что в будущем это действительно укусит меня за $$

Должен ли я перейти на MongoDB?Это слишком поздно?

Я никогда не имел дела с NoSQL, и мне интересно, как обойти проблему объединений.Мне не нужно было бы прилагать немного усилий для решения этой проблемы, если бы я не отделял своих пользователей от их профилей.Я предполагаю, что activerecord использует объединения в выражении, таком как @name = User.profile.full_name

1 Ответ

0 голосов
/ 06 января 2011

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

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

MongoDB - очень интересный эксперимент, но до сих пор он не заработал свои полосы. Если это что-то похожее на другие благородные проекты NoSQL, такие как Cassandra, ему все равно потребуются годы работы, чтобы быть по-настоящему «веб-масштабируемым».

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

SELECT followers.id, followers.name FROM user_followers
  LEFT JOIN users AS followers ON followers.id=user_followers.follower_id
  WHERE user_followers.user_id=?

Вы правы, предполагая, что JOIN здесь вызовет проблемы в будущем. Что вы упускаете из виду, так это то, что вы можете легко удалить объединение, используя тот же скромный прием, который необходим для масштабирования приложения: денормализация важной информации.

Что если вы копируете имя подписчика в таблицу user_followers каждый раз, когда добавляете в него запись:

SELECT follower_id, follower_name FROM user_followers
  WHERE user_id=?

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

Простое массовое обновление может быть таким же простым, как:

UPDATE users,user_followers
  SET user_followers.follower_name=users.name
  WHERE user_followers.follower_id=users.id

Если пользователи не могут изменить свои имена, вам даже не нужно беспокоиться. Иногда ограничения могут помочь вам в этом отношении.

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