Ранее мы использовали Riak для создания чего-то подобного, используя Ripple клиента Ruby, который предоставляет интерфейс AciveModel.Тем не менее, я действительно должен советовать против этого (как и другие).Используя тяжелый ORM поверх хранилища ключей / значений, вы действительно теряете его главное преимущество - скорость.
Сейчас мы движемся к тому, чтобы пропустить Ripple и поговорить напрямую с Riak для многих вещей, которые заботятся о скорости (мы также переходим на Erlang и используем интерфейс PBC, а не HTTP, но это уже другая история: D), вот как мы это делаем:
В наших объектах мы храним документ JSONв формате, совместимом с Ripple.Хотя у нас есть требование этого, так как мы все еще используем Ripple для некоторых вещей, если бы я делал это снова без Ripple, я все равно, вероятно, использовал бы этот формат.
Использовать ссылки Riak, чтобы присоединитьсяобъекты вместе, не храните внешние ключи в самом документе.Имейте в виду, что количество ссылок, которые вы можете хранить на объекте, ограничено, поэтому не сходите с ума от них (например, храните ссылку на каждый комментарий к объекту пользователя).
Ripple (и Riak) не поддерживает индексы, поэтому нам пришлось накатить собственное решение.В качестве примера мы храним пользовательский объект со случайно сгенерированным ключом 'fen2nf4j9fecd' в корзине 'users'.Мы также храним объект с ключом 'tom' в корзине 'users_index_by_username' со ссылкой Riak на объект в корзине 'users'.Таким образом, мы можем легко найти, у какого пользователя есть имя пользователя 'tom'.
Вы также можете захотеть использовать ключевую фильтрацию .Я еще не играл с ним, однако я видел показатели производительности, которые выглядят довольно хорошо.Вы должны быть осторожны с Riak, чтобы не перечислять ключи корзины, так как в связи с тем, как она реализована, Riak ищет все ключи, а не только ключи этой корзины.
Riak - настоящий зверь, однако, как только выобдумайте это, вам понравится.Это упрощает репликацию и «просто работает».