metaclass: (Default)
[personal profile] metaclass
но не могу отделаться от ощущения, что с эволюцией баз данных нас очень сильно наебали.
Это по поводу этого: http://plumqqz.livejournal.com/323506.html
Меня очень сильно бесит расхождение технологий: с одной стороны, классические СУБД, с другой NoSQL, с третьей - всякие in-memory распределенные базы, с четвертой - всякие аналитические БД с column storage, сжатием данных и перекосом в сторону чтения типа vertica, sybase iq или забиваторской QD. Плюс еще всякие datomic до которой я никак добраться не могу.

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

Date: 2012-10-23 11:21 am (UTC)
From: [identity profile] metaclass.livejournal.com
4 разных, не сводимых друг к другу простой заменой метода. Вижу.

Date: 2012-10-23 11:23 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Ну напишите свой генератор.

Date: 2012-10-23 11:31 am (UTC)
From: [identity profile] metaclass.livejournal.com
1) генерируем ID
2) вставляем запись в таблицу
3) возвращаем ID

Все ли СУБД поддерживают это в одном запросе?
Можно, конечно, сделать тремя запросами с клиента в одной транзакции, только потом стыдно будет на ORM за 1+N запросов псить :)

Date: 2012-10-23 11:36 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Можно, конечно, сделать тремя запросами с клиента в одной транзакции, только потом стыдно будет на ORM за 1+N запросов псить :)
Ну, во-первых, двумя - зачем и куда возвращать уже известный клиенту id лично мне не очень ясно. Во-вторых, это запросы о-очень легкие. В-третьих, незачем генерить ид каждый раз - могут быть проблемы с конкурентностью.

Date: 2012-10-23 11:40 am (UTC)
From: [identity profile] metaclass.livejournal.com
Да, идею понял.

Date: 2012-10-23 06:05 pm (UTC)
From: (Anonymous)
Осталось только научиться генерить такие ID. UUID хороши но блин размер... И правила таких ID? Шел 2012 год, а Степаныч изучал модуль рандом....

Date: 2012-10-23 07:13 pm (UTC)
From: [identity profile] maxdz.livejournal.com
А чем последовательные Id не подходят?

Как сказано оратором выше, одним запросом берётся максимальный Id таблицы (для этого есть специальная аггрегатная функция, которая в ANSI стандарте), а потом в программе генерируется следующий уникальный Id = полученный максимальный Id + 1 и с таким Id делается вожделенный инсерт.

Очень сложно? :)

Date: 2012-10-23 07:15 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Это не работает. Нужно блокировать таблицу целиком на все время выборки и вставки, за что в приличных домах пиздят канделябрами. Ну или поиметь конфликт значений PK.

Date: 2012-10-23 07:17 pm (UTC)
From: [identity profile] maxdz.livejournal.com
Нет никакой выборки. select max(Id) - это запрос, который в индексированной по Id таблице выполняется за миг.

П.С. Ок, атомарности генерации Id и инсерта в таком случае на уровне СУБД не обеспечивается - но атомарность обеспечат инсерты, только через отдельную функцию бизнес-логики и никак иначе.
Edited Date: 2012-10-23 07:22 pm (UTC)

Date: 2012-10-23 07:29 pm (UTC)
From: [identity profile] metaclass.livejournal.com
Ребе, сейчас сюда придут рабы стагнирующего колхоза и северо-мордорские орки и будут вас травить :)

смотрите картину:
клиент 1: select max(id) from table
клиент 2: select max(id) from table
клиент 1: insert into table(id) values(...)
клиент 2: insert into table(id) values(...) -> PK violation

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

далее, select max(id) не работает мгновенно в MVCC архитектуре - ему нужно выяснить, "какую из версий таблицы я вижу". Надо бы проверить это дело в MSSQL и Postgresql, возможно, там что-то заоптимизировано на эту тему.


В принципе, достаточно красивый вариант предложил крокодил - брать из таблицы секвенсов каждому потоку-клиенту пул ID и затем его расходовать. Если не нужен монотонный рост ID то это вполне ок решение.

Date: 2012-10-23 07:33 pm (UTC)
From: [identity profile] maxdz.livejournal.com
Я написал в P.S. - инсерты должны выполняться только через отдельную функцию, а не напрямую. Это может быть хранимая процедура (но такое не есть хорошо), а может быть функция бизнес-логики.

Когда несколько клиентов имеют возможность делать апдейты/инсерты в БД, напрямую (минуя бизнес-логику, с единообразной организацией/валидацией апдейта/инсерта) - это, в любом случае, нехорошо.

Date: 2012-10-23 07:47 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
в пределе это может тормозить, и надо пользоваться средствами конкретной БД

Date: 2012-10-23 07:51 pm (UTC)
From: [identity profile] maxdz.livejournal.com
Чтобы не тормозило - есть т.н. "аппликэйшн сервера". Но при этом, вынесение всей непосредственной работы с БД на уровень бизнес-логики из клиентов, даёт массу преимуществ, которые с SQL запросами в коде клиентов никак не реализуются.

Да и разница в быстродействии не так уж велика, если вообще (и нивелируется недостатками такой "2-уровневой" архитектуры).

П.С. Единственный легитимный вариант, когда SQL запросы имеют право быть в коде клиента - если клиент работает с выделенной/персональной базой данных, в экслюзивном режиме.
Edited Date: 2012-10-23 07:55 pm (UTC)

Date: 2012-10-23 08:04 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
Чтобы не тормозило, все производители БД должны объединиться в один и сделать одну нормальную БД. При этом не пользоваться преимуществами монополии и не давать повода клепать новые идиотские БД. По мере того как это будет происходить, усилия будут направляться на улучшение единственной БД, а не размножение новых. Но сейчас действует принцип закулисы "разделяй и властвуй", что и приводит к чувству фрустрации по отношению к эволюции баз.

Date: 2012-10-23 08:09 pm (UTC)
From: [identity profile] maxdz.livejournal.com
Гы-гы. Идеальных/универсальных решений не бывает. Кому-то хочется от БД одного, кому-то иного. Да и конкуренция вынуждает производителей быть в тонусе и делать всё лучшие решения, вместо говна.

Так что, незачем требовать таких глупостей, как единая БД от всех и для всех. :)
Edited Date: 2012-10-23 08:10 pm (UTC)

Date: 2012-10-23 08:18 pm (UTC)
From: [identity profile] berezovsky.livejournal.com
философия новой эры же :-(

Date: 2012-10-24 06:55 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Ребе, сейчас сюда придут рабы стагнирующего колхоза и северо-мордорские орки и будут вас травить :)
Никто максега травить не будет, не наговаривайте. Грех это. Но вот выражение "Нет никакой выборки. select max(Id) - это запрос, который в индексированной по Id таблице выполняется за миг." мне понравилось - за незамутненность и характерность.

Date: 2012-10-25 10:54 am (UTC)
From: [identity profile] maxdz.livejournal.com
>мне понравилось - за незамутненность и характерность

Ок, не за миг - за одну миллисекунду. Так устроит?

Date: 2012-10-25 11:00 am (UTC)
From: [identity profile] plumqqz.livejournal.com
Были бы вы женщиной - я бы ответил "боже, какая же вы хорошенькая! бросайте это дело к чертовой матери!"
Так как вы не женщина, насколько я понимаю, то высказывание про хорошенькую нужно опустить.

Date: 2012-10-25 11:12 am (UTC)
From: [identity profile] maxdz.livejournal.com
ото и не пустословь, "эксперт"...

Profile

metaclass: (Default)
metaclass

April 2017

S M T W T F S
      1
2345678
9101112 131415
16171819202122
23242526272829
30      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 7th, 2025 12:40 am
Powered by Dreamwidth Studios