Чувствую, что несу чушь,
но не могу отделаться от ощущения, что с эволюцией баз данных нас очень сильно наебали.
Это по поводу этого: http://plumqqz.livejournal.com/323506.html
Меня очень сильно бесит расхождение технологий: с одной стороны, классические СУБД, с другой NoSQL, с третьей - всякие in-memory распределенные базы, с четвертой - всякие аналитические БД с column storage, сжатием данных и перекосом в сторону чтения типа vertica, sybase iq или забиваторской QD. Плюс еще всякие datomic до которой я никак добраться не могу.
Все это, очевидно, между собой мало совместимо, решает разные задачи, требует каких-то дурных миграцией данных между собой и превращает работу с большим количеством данных в тыкву, потому что вместо одного толкового решения существует десяток решений разной степени безумности, требующих интеграции.
Это по поводу этого: http://plumqqz.livejournal.com/323506.html
Меня очень сильно бесит расхождение технологий: с одной стороны, классические СУБД, с другой NoSQL, с третьей - всякие in-memory распределенные базы, с четвертой - всякие аналитические БД с column storage, сжатием данных и перекосом в сторону чтения типа vertica, sybase iq или забиваторской QD. Плюс еще всякие datomic до которой я никак добраться не могу.
Все это, очевидно, между собой мало совместимо, решает разные задачи, требует каких-то дурных миграцией данных между собой и превращает работу с большим количеством данных в тыкву, потому что вместо одного толкового решения существует десяток решений разной степени безумности, требующих интеграции.
no subject
no subject
no subject
PS Написать собственный генератор айдюков, коли приспичило, как я смотрю, задача тоже непосильная.
no subject
про генератор -- по силам, конечно, но речь была про стандарт. Конечно, мне никуда не впёрлось перетаскивать программу с одной субд на другую, поэтому мне неактуально, но стандарт однако не даёт способа узнать последний вставленный id.
no subject
Если вставляется то, что не является уникальным, то нахера оно вообще вставляется? Типа дублирование - ну вроде как для надежности? Как написал какой-то руководитель, "пришлите мне четыре прозрачных однопиксельных гифа".
про генератор -- по силам, конечно, но речь была про стандарт.
Я, собственно, про стандарт и пишу - т.е. написать собственными силами, используя стандартный sql-92, генератор айдюков не по силам. Ок, ясно.
no subject
no subject
Итак, делаем таблицо "хенератор" о двух полях - имя и валуй. Клиент, который хочет получить пачку айдюков для последующей вставки сначала отправляет запрос
begin transaction;
а потом
select * from "хенератор" where "имя"='thetable' for update;
а потом отмечает себе, что от (валуй+1 до валуй+дельта] - это его айдюки и он их может использовать, после чего говорит
update "хенератор" set "валуй"="валуй"+:дельта where "имя"='thetable';
а потом еще и
commit;
Так клиент может получить вдоволь айдюков, а я - поделиться нынешним тайным знанием.
no subject
в стандарте такое есть?
no subject
Не совсем понятно, что вы имеете в виду под термином "атомарная транзакция" - вообще-то транзакция по определению атомарная. Еще более атомарная?
в стандарте такое есть?
Что "такое"? Вышенаписанное вполне соответствует SQL92; а что там есть именно такой код - это я сомневаюсь.
(no subject)
(Anonymous) - 2012-10-23 18:02 (UTC) - Expand(no subject)
(no subject)
(no subject)
no subject
В JDBC есть функция для получения сгенеренных идентификаторов, должно работать для любой базы.
no subject
Если вы соьираетесть вставлять в таких количествах, что у вас могут возникнуть проблемы с блокировками с этим кодом, то у вас сильно раньше возникнет куча других.
JDBC. тоже не св.духом пользуется, если что.
no subject
SET @value = value = value + 1
WHERE counter = @counter
Закапываем. Работает только в MSSQL.
no subject
(Anonymous) 2012-10-23 06:00 pm (UTC)(link)no subject
no subject
SELECT SCOPE_IDENTITY() - mssql
LAST_INSERT_ID() - mysql
IDENTITY_VAL_LOCAL() - db2
no subject
no subject
no subject
no subject
2) вставляем запись в таблицу
3) возвращаем ID
Все ли СУБД поддерживают это в одном запросе?
Можно, конечно, сделать тремя запросами с клиента в одной транзакции, только потом стыдно будет на ORM за 1+N запросов псить :)
no subject
Ну, во-первых, двумя - зачем и куда возвращать уже известный клиенту id лично мне не очень ясно. Во-вторых, это запросы о-очень легкие. В-третьих, незачем генерить ид каждый раз - могут быть проблемы с конкурентностью.
no subject
no subject
(Anonymous) 2012-10-23 06:05 pm (UTC)(link)no subject
Как сказано оратором выше, одним запросом берётся максимальный Id таблицы (для этого есть специальная аггрегатная функция, которая в ANSI стандарте), а потом в программе генерируется следующий уникальный Id = полученный максимальный Id + 1 и с таким Id делается вожделенный инсерт.
Очень сложно? :)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
(no subject)
no subject
(Anonymous) 2012-10-23 06:02 pm (UTC)(link)