LINUX.ORG.RU

Используете ли вы генерацию первичных ключей таблиц БД с помощью триггеров?

 ,


0

2

Смысл в том, что обычно первичный ключ таблицы делается в виде целого числа, которое увеличивается при вставке строки с данными на единичку. Во многих СУБД есть встроенные генераторы типа AUTOINCREMENT, SERIAL и так далее, однако это привязывает схему к конкретной СУБД плюс возможны сбои при миграциях.

Альтернатива — делать первичный ключ просто как целое число и вешать на таблицу функцию, которая увеличивает это число при вставке строки.

  1. Нет, использую встроенные типы 142 (48%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************************

  2. Не работаю с БД 137 (46%)

    ********************************************************************************************************************************************************************************************************************************************************************************************************************

  3. И так сойдет! 31 (11%)

    *********************************************************************

  4. Уже перешел (напишите как и почему) 5 (2%)

    ***********

  5. Нет, задумываюсь о переходе на триггеры для переносимости кода 3 (1%)

    ******

  6. Нет, задумываюсь о переходе из-за проблем с автогенерацией ключа (напишите, из-за каких) 2 (1%)

    ****

Всего голосов: 320, всего проголосовавших: 295

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

Переносимость кода между СУБД — очень нишевая штука. Непонятно зачем пытаться найти общее подмножество между sqlite3, mysql, postgresql etc и пытаться это очень узкое подмножество использовать, вместо того чтобы использовать фичи конкретной СУБД, раз уж решили требовать наличие СУБД для работы приложения.

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

PolarFox ★★★★★
()
Ответ на: комментарий от firkax

Где там может быть «значительно» то?

Почти во всём. Это СУБД совершенно разного уровня сложности. PostrgreSQL это практически единственный свободный конкурент проприетарному Ораклу.

Я не говорю, что MySQL/MariaDB плох. Он намного проще, для проектов уровня базы не шибко нагруженного сайта самое то. Но найди мне для MySQL аналог PostGIS, например.

hobbit ★★★★★
()
Ответ на: комментарий от firkax

Где там может быть «значительно» то?

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

А в PostgreSQL успешно использовал ещё 10+ лет назад, притом с тех пор они сильно улучшили удобство партицирования.

И таких вещей в Postgres много - начиная с базовых типов данных и операций (MySQL не поддерживает даже беззнаковые целые), заканчивая целой кучей менее очевидных вещей. Я просто не буду сейчас прям полноценное сравнение устраивать, но уверен, что оно будет сильно не в пользу MySQL.

Chiffchaff
()
Последнее исправление: Chiffchaff (всего исправлений: 1)
Ответ на: комментарий от hobbit

найди мне для MySQL аналог PostGIS, например.

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

Почти во всём.

Тема не раскрыта.

firkax ★★★★★
()
Ответ на: комментарий от Chiffchaff

Ну вот я например пытался использовать партицирование в MySQL. Почитал доку, и расплакался, потому что оно настолько убогое там, что смысла ни в одном реальном применении нет.
А в PostgreSQL успешно использовал ещё 10+ лет назад, притом с тех пор они сильно улучшили удобство партицирования.

А зачем оно тебе было нужно? Я тоже 10 лет назад использовал партиционирование, в mysql. Ну, применение у него такое: подкостылить полнотабличные локи myisam чтобы они стали не полнотабличными. Для таблиц с построковыми локами (innodb) вроде не нужно вообще.

MySQL не поддерживает дажеп беззнаковые целые

Ну это враньё, поддерживает, подписываешь unsigned просто.

У меня к mysql другая большая претензия есть: некачественный кодинг. Сталкивался и с (легко повторяемым вручную) битьём таблиц при штатной работе (причём на совершенно тривиальной таблице из int+varchar двух колонок для того чтобы пронумеровать строки и искать их в обе стороны, к счастью уже пофиксили), и с забагованным планировщиком запросов который делал фуллскан вместо использования очевидного ключа - полез в исходник фиксить, нашёл там цепочку из трёх(!) грубых ошибок которые сообща устраивали этот эффект, если б хоть одной не было - всё бы работало норм. Полез в багтрекер посмотреть вдруг кто репортил, обнаружил там кучу репортов в том числе на битьё данных, забил.

Как с этим всем у postgres не знаю, я его исходники не смотрел (если ты тоже не смотрел - не надо сходу говорить что всё ок, я до какого-то момента и про mysql всё это не знал и думал что там внутри всё прекрасно).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от firkax

А зачем оно тебе было нужно?

Конкретно мне нужно было в паре случаев, чтобы отделить активно используемые данные от реже используемых, чтобы снизить объём данных, которые база перелопачивает при запросах (в 99% случаев затрагивающих одну партицию). Разница была очень большой в моём случае.

В MySQL же на партицирование накладываются такие ограничения, что даже в книгах не рекомендуется смотреть в эту сторону: всё равно ничего путного с такими ограничениями не получится.

Ну это враньё, поддерживает, подписываешь unsigned просто.

Увы, я сейчас не вспомню, но несколько лет назад сталкивался с какой-то проблемой, что не смог перенсти код для Postgres из-за неправильной работы кода, рассчитанного на unsigned.

К сожалению, вспомнить детали не смогу, а поиск сейчас полностью загажен ИИ-дерьмом, и ничего толкового на эту тему не находится.

Chiffchaff
()
Ответ на: комментарий от firkax

У меня к mysql другая большая претензия есть: некачественный кодинг.

Ха-ха, classic. Я тоже сталкивался с Internal Error в MySQL на штатных операциях, и тоже находил заведённые баги, которые не фиксятся годами.

Chiffchaff
()
Ответ на: комментарий от firkax

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

peregrine ★★★★★
()
Ответ на: комментарий от ya-betmen

Ну в РФ пожалуй сейчас так и есть, потому как больших высоконагруженных проектов тут осталось полтора инвалида - часть проектов яндекса и кусочек у вк/сбера/рутуба/мейлрушки/одноклассников. А у всех остальных больших высоконагруженных вещей нет (хабр и пикабу не являются высоконагруженными, а какой-нибудь робот перевозчик пиццы от яндекса с ИИ не является большим).

peregrine ★★★★★
()

Хотел ответить, но не обнаружил ответа «Да».

Я работаю с Oracle 10/11/12

и так-то это практически единственный имеющийся вариант.

Генеришь значение либо заранее и используешь его непосредственно при вставке, либо в триггере.

Другого не дано.

oven
()

однако это привязывает схему к конкретной СУБД

Ну так и славно же!

Я когда к своему шефу на работу устраивался, он мне с порога заявил принципиальную позицию: Постгрес, только постгрес и ничего кроме постгреса, например.

Альтернатива — делать первичный ключ просто как целое число и вешать на таблицу функцию, которая увеличивает это число при вставке строки.

А зачем? Какую конкретно проблему/задачу это решает? Тем более не говоря уже о том, что триггеры это СУБД-зависимые сущности, так что аргумент о «непривязке к СУБД» как-то тоже мимо.

YogSagot ★★☆
()
Ответ на: комментарий от LongLiveUbuntu

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

Я видел случаи когда контора тысячу и один год работала с MS SQL, чтобы потом ВНЕЗАПНО выяснить, что лицензия небесплатная и после определенных объемов данных денег стоит немаленьких.

YogSagot ★★☆
()
Ответ на: комментарий от peregrine

Где угодно так. Если не брать в расчет любителей хайлоада, эти любое количество ресурсов засрут.

ya-betmen ★★★★★
()
Ответ на: комментарий от peregrine

не хотят свои данные тебе в облако лить и хотят облако для себя

Пишу docker compose yaml и проблема решена. 30 минут дел.

завёрнутое в электрон

Бандл с ванильным постгресом, который запускается как зависимый фоновый процесс. Какая разница: будет поток скулайта или процесс постгреса?

чтоб они тебе конкурента в вебе не запустили

Забавит когда программисты тужатся защитить код техническими средствами, даже когда не нужно. Когда в руках молоток всё выглядит гвоздем. Это легко решается иском в суд, доказать нарушение лицензии проще простого, денег ещё получить можно.

neumond ★★
()
Ответ на: комментарий от neumond

Угу, что же пиратство не решили никак исками? Ведь и запреты вводят и рутрекер заблокировали давным давно, а всё винда у всех пирацкая стоит. Классно в твоём мире жить наверное, жаль что об реальность он всегда в лепёшку расшибается. И да, технические средства тоже не панацея.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от YogSagot

Новый постгрес говорят его умеет поддерживать нативно, но мы пока не перешли

Да, в 18-м из коробки работает. Но и в старый они довольно легко подключаются.

Rodegast ★★★★★
()
Ответ на: комментарий от peregrine

Ну.. удачи пиратить коммерческий софт и запускать копию saas публично и официально. Прям то же самое, что домашняя винда и рутрекер. А я да, поживу в своём уютном мире :)

neumond ★★
()
Ответ на: комментарий от neumond

Ты это флибусте рассказывай и рутрекеру, если они не только контент но и код на котором сайт работает украдут, ну или СУБД оракловскую сопрут. Я конечно понимаю слова страшные и загадочные для тех кто про такие ресурсы никогда не слышал в силу того что вырос он до интернета уже после их блокировки, но ресурсы эти пока что живее всех живых. Уверен даже что чебурнет никак на их работу не повлияет (а в пределах чебурнета возникнет аналог тот или иной). Спрос и предложение всё равно всегда порешают.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 4)
Ответ на: комментарий от Aceler

Я, конечно, базовик ненастоящий. Можно пример проблемы с автоинкрементом?

Внешние таблицы в PostgreSQL не умеют автоинкремент. Приходится костылить через триггеры.

Igor_FF
()
Последнее исправление: Igor_FF (всего исправлений: 1)

…переходе на триггеры для переносимости кода

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

TEX ★★★
()
Ответ на: комментарий от mumpster

В interbase сто лет назад уже были генераторы (практически те же sequence) и триггеры, в которых брали значение из генератора и вставляли куда надо. Работает прекрасно, надежно, до сих пор. Такая же фигня и в Firebird и RedDatabase - наследниках Interbase. Начиная с Firebird 3.0 добавились и автоинкрементные поля, но глядя на них, абсолютно не вижу никаких плюсов, по сравнению с классическим генератор + триггер.

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

Триггер + генератор - гораздо более гибкая конструкция.

fraks_nsk
()
Последнее исправление: fraks_nsk (всего исправлений: 2)

Касаемо PostgreSQL. Там и так автоинкремент - это по сути счётчик (sequence), который увеличивается при вставке. Никаких триггеров не надо, СУБД всё делает сама. Недавно ещё появился UUIDv7. Там вообще никаких счётчиков не надо, он генерируется на основе текущего времени, так что по своей сути увеличивается со временем.

Feonis ★★★
()
Последнее исправление: Feonis (всего исправлений: 1)

Когда-то давно использовал встроенные типы, сейчас не работаю с БД.

А вешание на таблицу функции не привязывает к конкретной СУБД?

blex ★★★★★
()

Используете ли вы генерацию первичных ключей таблиц БД с помощью триггеров?

Чёта на умном

kas501 ★★★★
()
Ответ на: комментарий от peregrine

всё винда у всех пирацкая стоит. Классно в твоём мире жить наверное, жаль что об реальность он всегда в лепёшку расшибается.

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

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

Chiffchaff
()
Последнее исправление: Chiffchaff (всего исправлений: 1)
Ответ на: комментарий от peregrine

Ты это флибусте рассказывай и рутрекеру, если они не только контент но и код на котором сайт работает украдут

Раскрой понятие «украдут».

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от peregrine

Правильно. Здесь у населения и технических средств для доступа в Интернет нет. Я лично пишу со стиральной доски (это такое такое изобретение, чтобы стирать, когда нет стиральной машины). Потому, какой хайлоад. Голубиную почту используем вместо мессенджеров. Вместо телефонов - картонные стаканчики на ниточке. Всё так, всё погибло!

Chiffchaff
()

Использую триггер, в котором NULL-значение заменяю на прочитанное из sequence или полученное из функции uuidv7(). Почему не специальные типы, не DEFAULT-значение и не современный синтаксис «GENERATE BY DEFAULT AS IDENTITY»: потому что эти конструкции работают, только если в INSERT отсутствует упоминание столбца. Если же он есть в INSERT, и ему явно передано NULL-значение, то здесь присвоить default-значение поможет только триггер.

VladimirP ★★★★
()
Ответ на: комментарий от hobbit

извлекать их из последовательностей (sequence)

… и получить траблы с foreign table :-)

AlexM ★★★★★
()
Ответ на: комментарий от fraks_nsk

не хочу спорить, но в любом случае генераторы - нестандартное решение, по sql стандарту были sequence. потому ещё и мускул в стандарт не вписывался.

mumpster ★★★★★
()
Ответ на: комментарий от Chiffchaff

ну я покупал родне бук без венды, с каким-то забавным изводом линукса, который даже свой вайфай не видел. прчиина была банальна - нужно было конкретное поколение i7, а с вендой их уже разобрали. дальнейший сценарий развития событий ты наверное и сам понял.))))

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

я кстати в году в 2003 покупал плату чайнтеч преимум и там в комплекте шёл какой-то линукс, азианукс что ли. всё работало, но чо не зашёл.

mumpster ★★★★★
()
Ответ на: комментарий от mumpster

Да, я видел ноутбуки, продающиеся с Linux или FreeDOS, но даже если такие встречаются, то их совсем немного.

Кроме того, большинство пользователей всё равно потом покупают лицензию, если используют Windows. Полно продаётся каких-то странных лицензий за копейки. Я не знаю, насколько оно легально, но видимо легально и видимо пользуется спросом.

Вот клянусь, что я уже очень давно не видел пиратскую Windows, да и вообще какой-либо пиратский софт. Даже после 2022, все ударились в куколдизм, и заводят карточки в Казахстане, чтобы оплатить весь софт. Компании также открывают дочек в Грузиях и Казахстанах, чтобы покупать корпоративные лицензии на весь софт. Хотя, казалось бы, тебе прямо сказали, что ты недочеловек и недостоин, ан нет - несут кровно заработанное заплатить белому господину всё равно.

Chiffchaff
()
Ответ на: комментарий от Igor_FF

Внешние таблицы в PostgreSQL не умеют автоинкремент

Внешние это какие? FOREIGN TABLE которые из другой БД присабачены?

YogSagot ★★☆
()
Ответ на: комментарий от VladimirP

Если же он есть в INSERT, и ему явно передано NULL-значение,

А зачем? Не проще ли убрать ПК поле из инсерта? (проще)

YogSagot ★★☆
()
Ответ на: комментарий от Chiffchaff

я к тому, что на тот бук явно никакую «лицензию» никто потом не покупал

ну а про куколдизм - люди просто не хотят проблем. или не хотят разбираться с альтернативным KMS.

mumpster ★★★★★
()
Ответ на: комментарий от Chiffchaff

А что уже по нынешним меркам лор большой или хайлоад? А может движок браузера яндекс писать начал? Отстал я от деградантов однако.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 1)
Ответ на: комментарий от Chiffchaff

Из всей моей родни и знакомых карточки в забугорном банке у 3 человек. Один никогда не имел гражданства РФ и живёт за границей (иностранец), другой ездит каждый месяц за бугор по работе, третий имеет двойное гражданство. Все остальные 100500 знакомых и родственников имеют только российские карты. Твоя реальность какая-то инагентская, тебе так не кажется?

peregrine ★★★★★
()
Ответ на: комментарий от YogSagot

Это зависит от разных факторов. Разные бывают приложения, ORMы, инструменты ETL. Где-то это можно; где-то нельзя, если приложение слишком интеллектуально анализирует структуру таблицы и автоматом формирует INSERT, подставляя все столбцы. БД не должно зависеть от приложения (неграмотно, когда более нижний уровень зависит от более верхнего), поэтому я предпочитаю спроектировать универсальный вариант, защищённый от особенностей приложения.

VladimirP ★★★★
()
Последнее исправление: VladimirP (всего исправлений: 1)
Ответ на: комментарий от peregrine

Какая неприятность, с голоду помрет правообладатель, в глазах у него потемнеет.

Как по мне, России давно пора отказаться от Венецианской конвенции по защите авторского права - она полностью потеряла сейчас смысл и только тормозит прогресс.

LongLiveUbuntu ★★★★★
() автор топика
Ответ на: комментарий от VladimirP

если приложение слишком интеллектуально анализирует структуру таблицы и автоматом формирует INSERT, подставляя все столбцы

Значит оно не очень интеллектуально анализирует структуру таблицы, допуская настолько очевидную ерунду

БД не должно зависеть от приложения (неграмотно, когда более нижний уровень зависит от более верхнего)

БД по определению зависит от приложения, напрямую зависит причем. Я ни разу не встречал чтобы БД не рулилось собственно приложением по своему усмотрению, универсальных БД «под разные приложения» это какой-то нонсенс.

YogSagot ★★☆
()
Ответ на: комментарий от LongLiveUbuntu

Согласен что её надо переделывать, а патентное право вообще сильно-сильно менять. Но пока мне как автору тоже кушать хочется. Я бы и рад донаты по 5 баксов в месяц собирать, но вот беда, за бугром многие готовы столько платить тем же писателям, произведения которых им нравятся, а у нас как-то непринято. Вот и выходит что российский писатель кушать хочет и писать хочет. Но т.к. донатят мало, то ему работать надо где-то ещё (а значит как писателю ему расти некогда). А вторая крайность - кто решил чисто писать, то писать надо много (чтоб окупалось), как следствие качество страдает и мы видим что-то вроде этого. Вместо нормальной литературы (и ведь читают, т.к. читать больше нечего, нормальной литературы почти не делают из коммерческих соображений). И даже не автор виноват, а просто нельзя физически за год писать больше двух качественных книг такого объёма, а обычно одной, работая фултайм. Так что это либо литнегры, либо нейронка, либо неудержимая графомания. Вон, давай Ирму позовём, чтоб она о своём, о наболевшем рассказала. Irma

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 3)
Ответ на: комментарий от hobbit

А ещё в постгрес встроена матстатистика - не надо ничего изобретать, вызывай всё из оконных функций.

Shadow ★★★★★
()
Ответ на: комментарий от peregrine

Сейчас идет масштабное производство сериалов именно из-за этого, их можно больше продать массово по длительности.

goingUp ★★★★★
()
Ответ на: комментарий от peregrine

и мы видим что-то вроде этого.

Рыдал.

Хотя, каюсь, я сам другому автору за 3 книги цикла денюжку заплатил, он там выдерживал какой-никакой уровень. На бесплатной части 4 книги мой интерес закончился. Но 48 томов… Дюма рыдает в углу.

hobbit ★★★★★
()
Ответ на: комментарий от Chiffchaff

MySQL не поддерживает беззнаковые целые

ЕМНИП, в Java тоже нет беззнаковых типов, причём объявлено, что это не баг, а фича, чтобы бедные разработчики не путались, вот.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Да вроде как меня поправили, что в MySQL беззнаковые типы есть. Но я 100% помню, что проблемы с их использованием у меня были. Но т.к. это было года 4 назад, то я уже не смогу вспонмить, какие именно. Это было в рабочем проекте компании, в которой я больше не работаю. Потому воспроизвести эту ситуацию будет довольно сложно, учитывая, что я смутно помню детали.

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

Chiffchaff
()
Последнее исправление: Chiffchaff (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.