Key-Value store
Jun. 21st, 2014 04:02 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Я что-то не втыкаю, прошу помощи зала. Я хочу хранить JSON объекты в какой-нибудь простой базе, при этом не хочу руками заводить индексы. Хочу чтобы база сама парсила объекты и если в нем есть какой-то ключ, то по этому ключу заводила бы сама индекс. То есть я скажем пишу туда { name: "Vasya", surname: "Pupkin" }, и она заводит два индекса, добавляю в какие-то объекты birthday: "02/20/1969" - она создает третий индекс. Объектов - ну максимум десятки тысяч, то есть в принципе все можно держать в голове. Хочется без тяжелого рантайма, инсталляций с триллионом prerequisites и прочего девопс-кошмара.
В принципе это наверное можно соорудить вокруг Редиски. Наверняка почти любая RDBMS с этим справится тоже. Но хочется избежать "сооружения" и не хочется таскать за собой постгресс с кучей зависимостей или мускль со своими капризами.
Можно это соорудить вокруг Дивана (Кауча), если написать внешний кауч-процесс, который будет следить за новыми объектами и добавлять индекс при необходимости. Наверное я так и сделаю, если не найду ничего лучше, Кауч хотя бы заметно проще большинства RDBMS по части зависимостей, но все равно надо лепить горбатого вокруг. Зато хорошая репликация достанется бесплатно.
Или я извращенец и никому это не надо?
В принципе это наверное можно соорудить вокруг Редиски. Наверняка почти любая RDBMS с этим справится тоже. Но хочется избежать "сооружения" и не хочется таскать за собой постгресс с кучей зависимостей или мускль со своими капризами.
Можно это соорудить вокруг Дивана (Кауча), если написать внешний кауч-процесс, который будет следить за новыми объектами и добавлять индекс при необходимости. Наверное я так и сделаю, если не найду ничего лучше, Кауч хотя бы заметно проще большинства RDBMS по части зависимостей, но все равно надо лепить горбатого вокруг. Зато хорошая репликация достанется бесплатно.
Или я извращенец и никому это не надо?
no subject
Date: 2014-06-21 11:41 pm (UTC)no subject
Date: 2014-06-22 12:49 am (UTC)Скулайт вполне годится, но вокруг него все равно придется огород городить. Хочется готовенького.
no subject
Date: 2014-06-22 12:56 am (UTC)no subject
Date: 2014-06-22 01:04 am (UTC)no subject
Date: 2014-06-22 12:04 am (UTC)name: "Vasya", surname: "Pupkin"
превратится в 2 записи в индексе:
name_Vasya
surname_Pupkin
no subject
Date: 2014-06-22 12:37 am (UTC)no subject
Date: 2014-06-22 12:53 am (UTC)Если у нас 2 связанные таблицы: objects(id, object) и index_table(key, objectid)
no subject
Date: 2014-06-22 01:02 am (UTC)no subject
Date: 2014-06-22 08:01 am (UTC)no subject
Date: 2014-06-22 12:35 am (UTC)no subject
Date: 2014-06-22 12:45 am (UTC)no subject
Date: 2014-06-22 12:49 am (UTC)no subject
Date: 2014-06-22 01:04 am (UTC)На нём работают например Active Directory, DNS server, Exchange, Windows Search, и ещё куча разного софта и компонент винды.
У записи может быть до 64k колонок, с кучей самых разных индексов по ним.
BTW, я когда-то запилил над ним ORM для .NET (https://esentserialize.codeplex.com/), давно не обновлял конечно, но исходники открыты.
no subject
Date: 2014-06-22 01:10 am (UTC)no subject
Date: 2014-06-22 01:22 am (UTC)Но по моим данным, в мире не-винды ничего сопоставимого по функциональности и производительности вы не найдёте, и за разумное время сами не запилите.
Там производительность сотни тыщ запросов в секунду, масштабируемость на много ядер, много памяти и много терабайт базы (при этом оно и вниз масштабируется, т.е. без нагрузки почти ничего не отжирает), устойчивость к сбоям, транзакционность, и другие достоинства.
no subject
Date: 2014-06-22 01:23 am (UTC)no subject
Date: 2014-06-22 03:44 am (UTC)Только оно не key-value, а хранит именно что JSON объекты:
db.people.insert({ name: 'Vasya', surname: 'Poupkine'})
- это ванильный синтаксис.
формат "строки" - полностью свободный. Придет объект вида
{ name: 'Vasya', surname: 'Poupkine', birthday: '02/20/1969' }
- сохранится тоже
Соответственно, все поля доступны для запроса, и для поиска индексы специально строить не нужно:
db.people.find( { birthday: '02/20/1969' } );
найдёт всех родившихся в этот день (и у кого есть это свойство в коллекции).
Добавить день рождения существующему Васе - тоже не проблема.
Из коробки же по умолчанию всё держит в памяти - то есть, для производительности индексы тоже не очень-то и нужны, при десятках тысяч-то.
no subject
Date: 2014-06-22 05:16 am (UTC)no subject
Date: 2014-06-22 07:46 am (UTC)no subject
Date: 2014-06-22 09:09 am (UTC)no subject
Date: 2014-06-22 08:30 am (UTC)У MongoDB лицензионные ограничения AGPL
no subject
Date: 2014-06-22 09:22 am (UTC)Если ты начал патчить - то да, должен патчи тоже делать бесплатными.
Но просто юзать в коммерческих проектах - без проблем же.
no subject
Date: 2014-06-22 10:22 am (UTC)no subject
Date: 2014-06-22 05:31 pm (UTC)no subject
Date: 2014-06-22 09:35 am (UTC)POST дергает update c upsert, чтобы база сама решала, update или insert
А GET кодируется в JSON и отправляется прямиком в .find().
Ну, или честный REST организовать, там даже что-то под основные языки уже есть.
no subject
Date: 2014-06-22 07:09 pm (UTC)