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] plumqqz.livejournal.com 2012-07-01 09:36 am (UTC)(link)
Вы бы лучше о совершенстве луноликого думали. Все бы было больше пользы.

[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] w00dy.livejournal.com 2012-07-01 10:25 am (UTC)(link)
Ребе, вы ж в курсе о IQueryable. Если ваш линк провайдер умный, то он построит запрос и выполнит его в базе.

[identity profile] theiced.livejournal.com 2012-07-01 12:13 pm (UTC)(link)
ребе, вы вот тут чота рассуждаете, асид-хуясид. а между тем получили вендорлокин на файрбёрд - ВСЁ, все (фантомные) преимущества ушли сосать хуй.

[identity profile] avnik.livejournal.com 2012-07-01 12:21 pm (UTC)(link)
zodb же!
(serialized objects, btree, кровь, кишки, коровники прилагаются. Запросы на питоне)
Правда скейлится на кластер или rdbms backend'ом или за деньги.

[identity profile] stdray.livejournal.com 2012-07-01 12:49 pm (UTC)(link)
А что за наязчивое желание избавится от RDBMS, я никак не пойму? Кривыми ОРМ или как?

[identity profile] norguhtar.livejournal.com 2012-07-01 01:29 pm (UTC)(link)
Господя и вы туда же. Ну вот где-то год назад одни товарищи делали такую же вариацию. Типа ой это удобнее. В результате получите опять же тот же SQL вид в профиль. Вообще говоря текущая проблема вида используем ORM и т.п. подобное не более чем проблема текущей абстракции. Когда с одной стороны у нас есть объектный язык, а с другой стороны хранилище с декларативным доступом к данным. Попытки сделать объектные базы данных предпринимались еще до появления модного термина NoSQL. Тот же Cache. Только вот есть маленькая проблема. Как только доходили до такой вещи "а как бы нам там ловко получить аналитику?" возникал ад и коровники.

[identity profile] guamoka.livejournal.com 2012-07-01 01:58 pm (UTC)(link)
Мои сугубо личные притензии к SQL - это отсутствие реюза. Точнее, внятной модели осуществления этого- оо, func, template. Вот надо из n таблиц выбрать 100500 вариантов по условиям и жоинам, соответственно, пиши 100500 запросов с 50%+ повторяющегося кода, или занимайся склейкой вручную или через какой ibatis. Причем, шансов, что очередная добавленная в запрос таблица родит такой план, что мама не горюй приближается к 100%.

[identity profile] denisioru.livejournal.com 2012-07-01 03:10 pm (UTC)(link)
На LINQ можно сократить до users.First(p => p.User_ID=User_ID).Name

[identity profile] blackyblack.livejournal.com 2012-07-02 05:24 am (UTC)(link)
Уже выяснили же, что ничего такого нет в природе. И ребе обязался СУБД на хаскеле написать с блэкджеком и мэпредюсом.

[identity profile] smalgin.livejournal.com 2012-07-02 06:16 am (UTC)(link)
Если найдете, поделитесь. Будет интересно сравнить ощущения.

[identity profile] thesz.livejournal.com 2012-07-02 09:37 am (UTC)(link)
>И все равно это же надо выполнять в СУБД, чтобы вся таблица не фетчилась на клиента или апп-сервер.

Товарищи примером показали, что это единственный выход: http://cs-www.cs.yale.edu/homes/dna/papers/calvin-sigmod12.pdf

(смогли добиться производительности рекордсменов TPC на железе, в тысячи раз более дешёвом)