Зачем NoSQL программистам

Jun 10, 2010 11:58


В последнее время, как видим, пошла мода на NoSQL.
Термин, собака, размыт до черезвычайности, под ним все подразумевают разное, кто во что горазд - кто-то интересуется переработанными RDBMS типа BigTable, кто-то болеет за key-value storage, парни с PostgreSQL вообще пошутили на тему QUEL.

Сконцентрируемся всё-таки на основном значении: системы ( Read more... )

программизм

Leave a comment

vitus_wagner June 10 2010, 11:28:36 UTC
Это из серии "я хочу чтобы у меня все было, и мне за это ничего не было". А так не бывает. SQL хорош тем, что под ним лежит хорошая математика - реляционная алгебра. Эта математика накладывает на возможности представления довольно большие ограничения. Но эти ограничения являются платой за возможность эффективно оптимизировать запросы.

К сожалению, большинство разработчиков, хватающихся сейчас за NoSQL никогда в жизни не слышали слова CODASYL. Поэтому не знают, что история баз данных начиналась с объектно-ориентированных БД, где не было никаких ограничений. Но и искать было крайне затруднительно.

Reply

zhengxi June 10 2010, 14:14:07 UTC
> Но эти ограничения являются платой за возможность эффективно оптимизировать запросы.

Вот взять тот же пример с постами и коментами.
Там ровно наоборот получается - для реаляционного решения нужен индекс по всем коментам, поиск по которому не будет лучше логарифмического (а комментов много, так много, что они и на один сервер могут не поместиться).
При этом post_id используется только для связи поста и коммента.
Есть RDBMS которые это "поймут" и эффективно соптимизируют до O(1), до (неявного, скрытого от автора SQL-запросов) хранения указателей на комменты рядом с постом ?

> К сожалению, большинство разработчиков, хватающихся сейчас за NoSQL никогда в жизни не слышали слова

Еще есть слово IMS, IMS is reportedly IBM's highest revenue software product, and it continues to grow.
Вполне такой NoSQL.

Reply

legolegs June 10 2010, 16:28:40 UTC
>Там ровно наоборот получается - для реаляционного решения нужен индекс по всем коментам, поиск по которому не будет лучше логарифмического (а комментов много, так много, что они и на один сервер могут не поместиться).

Однажды встаёт необходимость в чём-то вроде списка комментов одного юзера - иноэскуэльщикам остаётся сказать "%ляяяяяяяя.....".

Reply

rainman_rocks June 10 2010, 16:37:42 UTC
Вы слыхали фразу Д. Кнута о предварительной оптимизации?

А фразу О. Бендера касательно битья и плача?

Для реляционных БД такая внезапная "необходимость" обернётся точно таким же create index, который точно так же займёт N часов-дней-недель.

Поймите, в РСУБД никакой сверхъестественной магии нет. Там все те же структуры данных и алгоритмы. Вы их точно так же можете воспроизвести и при помощи NoSQL.

Reply

(The comment has been removed)

rainman_rocks June 10 2010, 17:10:53 UTC
Какая функциональность-то? Цикл по записям с занесением списка указателей в ассоцмассив?
Это элементарная задача.

Reply

(The comment has been removed)

rainman_rocks June 10 2010, 18:21:10 UTC
Эмммм... во-первых, s/long/log/, во-вторых, CREATE INDEX выполняется за O(n).

Reply

(The comment has been removed)

rainman_rocks June 11 2010, 06:49:30 UTC
Поиск по нему будет O(1), поскольку список написанных камментов будет храниться в записи каждого пользователя.

Итого, поиск без индекса в SQL/NoSQL - O(n).
Построение индекса в SQL/NoSQL - O(n).
Поиск по индексу в SQL - O(log n), NoSQL - O(1).

Это, собсна и есть тот "прирост производительности"/"масштабируемость", на которые фапают носкульщики.

У NoSQL, конечно, будет гораздо хуже константный сомножитель в первых двух случаях.

Reply

legolegs June 11 2010, 07:47:35 UTC
>Итого, поиск без индекса в SQL - O(n), в NoSQL - O(n) плюс написание и отладка этого поиска.

fixed.

Reply

rainman_rocks June 11 2010, 09:46:35 UTC
Само собой. Зато мы этот поиск можем тонко настроить под свои нужды. А в некоторых SQL-базах, гм, fullscan может серьёёёёзно помешать работе.

Reply

(The comment has been removed)

rainman_rocks June 11 2010, 11:15:22 UTC
Для "более интересной задачи" ответ ровно тот же.
Если у вас нет индекса - это фуллскан, и для RDBMS, и для NoSQL.
Если у вас есть индекс - это O(log n), и для RDBMS, и для NoSQL.

Reply

(The comment has been removed)

rainman_rocks June 11 2010, 11:33:45 UTC
Конечно просядем при записи. Примерно так же, как и RDBMS проседают при записи при наличии множества индексов. Те же способы решения - отложенная запись, eventual consistency.

Носкуль, конечно, более пригоден для тех случаев, когда нужно очень-быстро-прочитать. Такие случаи, мягко говоря, нередки.

Проблем реализовать упорядоченное множество (хоть дерево, хоть тупо скиплист) в NoSQL не вижу никаких. В том же JSON делается элементарно, причём с возможностью тонкого управления шардингом.

Reply


Leave a comment

Up