metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2012-10-23 11:27 am

Чувствую, что несу чушь,

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

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

[identity profile] metaclass.livejournal.com 2012-10-23 07:03 pm (UTC)(link)
UPDATE Counters
SET @value = value = value + 1
WHERE counter = @counter
Закапываем. Работает только в MSSQL.

[identity profile] lazy-flyer.livejournal.com 2012-10-23 07:04 pm (UTC)(link)
Я о приземлённом. О продажах, финансах...

[identity profile] metaclass.livejournal.com 2012-10-23 07:08 pm (UTC)(link)
Шапка: 1 запись
Строки: 1-N записей, до 100 условно
Какая-нибудь блокировка товара на складе - еще столько же записей.
История действий пользователей - в зависимости от реализации - от одной до N*количество действий записей
Если этот документ связан с другими - еще записи в таблицах связей.

Если же это реализовать более менее универсальным образом, то в случае EAV - сразу под тысячу записей, но всего в двух-трех таблицах (обкрученных индексами по всем полям, что эффективно увеличивает размер в 2-3 раза).

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

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

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

[identity profile] plumqqz.livejournal.com 2012-10-23 07:13 pm (UTC)(link)
Скажите, а вы хорами имена объектов не шифруете?

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

[identity profile] lazy-flyer.livejournal.com 2012-10-23 07:15 pm (UTC)(link)
Ндя...
В 2004-м году мне удалось достичь размера базы за год в ~600 МБ. При шестизначном номере инвойса...
База - в целом всей системы, вся логистика и финансы. Я бесконечно отстал от жизни.

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

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

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

смотрите картину:
клиент 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 то это вполне ок решение.

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

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

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

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

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

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

[identity profile] zamotivator.livejournal.com 2012-10-23 07:59 pm (UTC)(link)
> Но специализированные решения для хранения разряженных многомерных массивов более производительны.

О, а можно поподробней о таких решениях?
Я как раз такое пилю right now - SciDB

[identity profile] zamotivator.livejournal.com 2012-10-23 08:01 pm (UTC)(link)
Microsoft?

[identity profile] zamotivator.livejournal.com 2012-10-23 08:02 pm (UTC)(link)
Скажите, а зачем вам менять базы как перчатки?

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

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

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

[identity profile] berezovsky.livejournal.com 2012-10-23 08:13 pm (UTC)(link)
Если я правильно представляю, в случае, когда вставка не сработает, ключи должны возвращаться на родину.
Для этого одна транзакция должна быть вложена в другую, что должно быть отражено в стандарте.
Или я перемудрил?

[identity profile] nicka-startcev.livejournal.com 2012-10-23 08:18 pm (UTC)(link)
чтоб при обнаружении какого-нибудь критического дерьма в сочетании, например, оракал-1.2.3.х86+ие7.40 + вин6.22 тупо быстро и безболезненно сменить оракал-1.2.3.х86 на какой-нибудь MySKL-666.740-амд64.

или, чтоб при разрастании проекта из наколенного сайта на 3 юзера до мегапроекта типа ЖЖ тупо сменить тупую базу на расширеную и не ловить отходняки еще полгода.

или чтоб после смерти оракала не нанимать стопицот работников на перепроектирование всего с нуля и года дозатыкания дыр.

В общем, для безболезненной миграции при изменении условий.

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

[identity profile] plumqqz.livejournal.com 2012-10-23 08:20 pm (UTC)(link)
Конечно перемудрили. Зачем их возвращать? Хвала Всевышнему - когда он создавал числа, он создал их достаточно.

[identity profile] plumqqz.livejournal.com 2012-10-23 08:21 pm (UTC)(link)
Работаете? Ну-ну.

[identity profile] zamotivator.livejournal.com 2012-10-23 08:22 pm (UTC)(link)
Сколько мифов в одном комментарии

[identity profile] kranov.livejournal.com 2012-10-23 08:41 pm (UTC)(link)
так смысла нет про вертику говорить, 48гиг озу стоит $500, а вот если 10-ки терабайт, и результат через нужен минуту

[identity profile] theiced.livejournal.com 2012-10-23 10:02 pm (UTC)(link)
так в маськовских лавках тоже же хуйню платят. если выкинуть разницу на аренду жилья - один херъ получается.

Page 4 of 5