metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-07-01 12:21 pm
Entry tags:

Если не RDBMS, то что?

http://metaclass.livejournal.com/706440.html?thread=13096072#t13096072
Можно ли делать опердени не на RDBMS, не возвращаясь на уровень 70х годов, с иерархическими базами и прочими обработками на клиенте по курсорам?

Вариант "есть транзакции с ACID и есть оптимизированное по индексам выполнение filter/map/fold/reduce внутри базы" меня в принципе устроит. За исключением того, что SQL более лаконичен, вроде бы, если не делать внутри языка DSL аналогичный ему.


Например: select User_Name from Users where User_ID=?User_ID превращается во что-то вроде
let UserName UserID =
Users |> filter (fun u -> u.User_ID=UserID) |> map (fun u->u.User_Name) |> tryFirst

На LINQ же будет что-то вроде: from u in Users where u.User_ID=User_ID select u.User_Name

И все равно это же надо выполнять в СУБД, чтобы вся таблица не фетчилась на клиента или апп-сервер.

[identity profile] si14.livejournal.com 2012-07-01 09:59 am (UTC)(link)
Мне видится так:
-если это мелкое прототипное говнишко без сложных запросов, то монга только в путь. Можно даже утешать себя, что она «будет скейлиться».
-если нужны сложные запросы и данных меньше десятков (может быть сотен, но тут уже нужно напрягаться) гигабайт, то RDBMS это прелестно. Серьёзно, какой смысл изобретать велосипед? SQL отличный язык, работает всё быстро, все грабли, которые можно было, уже давно пройдены (по крайней мере если это постгря/мс/оракл, а не какой-нибудь файрбёрд, да).
-если данных уже сильно больше (сотни гигабайт) и много записи (потому что все приличные RDBMS умеют делать кластер с одним записывающим и пачкой отвечающих на чтение), то только тогда стоит думать обо всяких хадупах сотоварищи, потому что запросы писать будет ощутимо сложнее и поддерживать всё это тоже.
Ну и есть две маргинальные технологии не для всех случаев, использующие eventual consistency:
-CouchDB. Вкратце: хранятся иерархические документы а-ля JSON; на все ноды можно писать, со всех нод можно читать; во всех запросах на модификацию должна присутствовать старая версия документа, по ней сервер делает дельту и прицепляет к ней время; каждая нода делает паблиш всех таких дельт на все остальные ноды, из-за этого, с одной стороны, сильно уменьшается промежуток, в который можно прочитать «старые данные», а с другой нагрузка на ноды растёт линейно с количеством нод, поэтому кластеризация служит только для повышения надёжности, а не для улучшения скорости. Поэтому это крутая штука, которая реально «магически» работает со случаями вроде «у нас инстанс кауча на телефоне полностью автономный, делаем любые вообще модификации, подключаемся к сети и всё автоматически консистентно сливается, все конфликты разруливаются по принципу "кто последний тот и прав"». Проблема только в том, что это всё не рассчитано на сотни гигабайт данных и большие нагрузки, а сложные запросы можно делать только мапредьюсом на JS, что не очень круто и не очень быстро.
-Riak. Eventual consistency в дистиллированной форме; по сути это просто движок для CRDT (Commutative Replicated Data Types — типы данных, которые всегда можно слить между собой, независимо от порядка модификации. Например, set без операции удаления или логи — сколько бы нод отдельно друг от друга не писало, всегда можно слить между собой). При этом из коробки балансировка нод, балансировка между консистентностью записи, консистентностью чтения и latency, механизм для автоматического нахождения конфликтов (vector clocks). Хорошо масштабируется в смысле увеличения производительности от количества нод (впрочем, с помощью механизма балансировки консистентности можно сделать аналог кауча с гарантированной консистентностью — например, можно сделать операцию чтения не завершающейся до тех пор, пока все ноды не получат свою копию данных). Не очень хорошо со сложными запросами (снова MapReduce на JS). Есть из коробки индексирование по произвольным полям, но работает не очень. Соль же в том, что если данные являются CRDT (key-value c last writer wins, кстати, является CRDT), то всё будет работать очень круто и магически.

[identity profile] metaclass.livejournal.com 2012-07-01 10:10 am (UTC)(link)
Риак выглядит привлекательно.

[identity profile] dr-hyder.livejournal.com 2012-07-01 12:18 pm (UTC)(link)
АутистыЫЫЫ! (http://metaclass.livejournal.com/678493.html?thread=11757917&)

[identity profile] freiksenet.livejournal.com 2012-07-01 03:51 pm (UTC)(link)
У вас опердень для 100 бухгалтеров, нахуя вам риак? Юзайте sql и не выёбывайтесь.

[identity profile] metaclass.livejournal.com 2012-07-01 04:19 pm (UTC)(link)
Ну в опердень я его точно не потащу. А проектов у меня заметно более одного)

[identity profile] freiksenet.livejournal.com 2012-07-01 04:30 pm (UTC)(link)
Настолько высоконагруженных что нужен риак и мускуль/постгрес не справляются?

[identity profile] nivanych.livejournal.com 2012-07-01 04:40 pm (UTC)(link)
Крокодила на вас не хватает!

[identity profile] freiksenet.livejournal.com 2012-07-01 04:45 pm (UTC)(link)
Он ораклист?

[identity profile] nivanych.livejournal.com 2012-07-02 05:20 am (UTC)(link)
Не в том дело. А в том, что подразумевается, что именно риак способен обеспечить высокую нагрузку.
А это очень спорное высказывание, требующее массу уточнений, начиная с кусков, для которых достаточно eventual consistency, заканчивая необходимыми структурами и выборками.
По сравнению с, нормальные SQL'ины делают многие и сложные выборки весьма и весьма неплохо. И не нужно задумываться о реализации такой структуры, которая бы такие выборки делала быстро. И если потребуется ещё какая выборка, то тоже особенно думать не нужно. И тем более, переделывать.

[identity profile] metaclass.livejournal.com 2012-07-01 05:17 pm (UTC)(link)
Высоконагруженные в планах.
Впрочем, меня больше интересует вопрос, как у них репликация теоретически устроена.

[identity profile] dr-hyder.livejournal.com 2012-07-01 12:21 pm (UTC)(link)
Нэт, кауч развалится быстрее к хуям, ответственно заявляю. Riak - будет работаць и не жужжать.

[identity profile] si14.livejournal.com 2012-07-01 06:10 pm (UTC)(link)
Быстрее чем что?

[identity profile] dr-hyder.livejournal.com 2012-07-01 06:13 pm (UTC)(link)
Ну в нашем случае быстрее чем его успели толком нагрузить.

[identity profile] andrew kondratovich (from livejournal.com) 2012-08-03 09:36 pm (UTC)(link)
Риак был был конфеткой, если бы нормальные индексы запилили.