Эквивалент ORM для распределенного хранилища ключей / значений? - PullRequest
5 голосов
/ 11 апреля 2011

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

Может кто-нибудь указать мне на примеры других людей, делающих это? Я в основном ищу дизайнерские идеи, хотя, если мне удастся найти что-то, что мне понравится, я могу просто использовать это вместо того, чтобы писать свои собственные. Я, вероятно, собираюсь внедрить мой в Perl поверх Riak, но эти решения не являются окончательными.

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

Ранее мы использовали 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 - настоящий зверь, однако, как только выобдумайте это, вам понравится.Это упрощает репликацию и «просто работает».

1 голос
/ 11 апреля 2011

Вам не нужно много, если таковые имеются, слоя для этого.

Это хранилище ключей / значений, Пит, используйте любой механизм сериализации, существующий на вашем языке, для преобразования в типизированный объект и из него в конечный объект.Что еще можно сделать?

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

...