Удивительное и невероятное о первичных ключах PostgreSQL: serial, bigserial, UUID v4, ULID, UUID v6

Поделиться
HTML-код
  • Опубликовано: 21 сен 2024

Комментарии • 294

  • @Vjidowkdkcpapqkfjfw
    @Vjidowkdkcpapqkfjfw Год назад +65

    Я так понял, после прочтения книжки по постгрес Алексей открыл для себя что-то новое и интересное и решил поделиться этим с остальными) спасибо большое!

    • @sio80orel
      @sio80orel Год назад +12

      хоть кто-то читает эти унылые книжки)

    • @MrLotrus
      @MrLotrus Год назад +3

      Алексей дал значительно больше чем там есть

    • @codingfox
      @codingfox Год назад +1

      @@sio80orel унылые можно не читать) про книжку о postgres я бы такого не сказал

  • @Erwin_Anderson
    @Erwin_Anderson Год назад +36

    Топ контент, так нехватает чего то выше джуновского уровня, а не треша какой ЯП изучать новичкам.

    • @АндрейСветлоков-з2ш
      @АндрейСветлоков-з2ш Год назад

      Просто вам не часто такое попадается. Ищите и найдёте

    • @_4ado
      @_4ado Год назад +1

      ​@@АндрейСветлоков-з2ш ну не надо басней, 49.5% контента для людей уровнем выше джунов это конференции, ещё 49.5% это видосы с неподражаемым индийским акцентом по скидке за 480 рублей и 1% это видосы вроде этого

    • @Erwin_Anderson
      @Erwin_Anderson Год назад +2

      @@АндрейСветлоков-з2ш Мб посоветуешь что то?)

    • @имяфамилия-т3ж1ц
      @имяфамилия-т3ж1ц Год назад +1

      ​@@Erwin_Anderson совет один, сиди на попе ровно

  • @ВячеславЦурик
    @ВячеславЦурик Год назад +4

    Спасибо, полезно! Мозг прям возрадовался приятной и понятной подаче материала! 👍

  • @shamanskiy
    @shamanskiy Год назад +7

    Алексей! Доброго времени. Внедрю пожелание лайфхака. Следующее видео делайте в соседней комнате. Мы-же тоже дзырим ваши замечательные апартаменты. Пыточную из прошлых видео изучили, теперь понятно место откуда вещали прошлые видосы.
    Похоже что дальняя коричневая дверь стоит на вентиляции микроклимата. Фигасе. Спасибо за идею. За окна понятно, но двери - это свежо!😂
    Отличный контент. Ну сказать что-нибудь надо, вот и сказал. Вот...

  • @mihailbury240
    @mihailbury240 2 месяца назад

    Суперский формат! Много полезной информации, наглядно, с примерами, увлекательно. Спасибо автору!

  • @alexalekseichuk5737
    @alexalekseichuk5737 Год назад +4

    Если phone_num PK, то чел. уже не сможет его поменять. PK -- это не только UNIQUE NOT NULL, но ещё и read-only. Всё же не нужно юзать phone_num в качестве PK. Это сущность/запись клиент-человек. Даже здравый смысл подсказывает нам, что нельзя его отождествлять/идентифицировать/привязывать к номеру телефона.

    • @knarg4682
      @knarg4682 2 месяца назад

      смысл-то подсказывает, а напомните мне, как в Вебмани регистрация происходит?

  • @user-jl9in3hh1s
    @user-jl9in3hh1s Год назад +6

    Сначала накачал с трекеров терабайты обучащих курсов от инфоцыган теперь позатер их и смотрю ваши ролики. КПД намного выше. Большое спасибо.

  • @gnompirogov9259
    @gnompirogov9259 Год назад +2

    Спасибо за Primary key. интересные мысли, рассуждения

  • @maxx27i
    @maxx27i Год назад +1

    Спасибо! Интересно было послушать по UUID и всё с ними связанное. Понравилось, что осветили плюсы и минусы каждого подхода/типа. 👍

  • @morok-com
    @morok-com Год назад +3

    Я только недавно начал изучать PostgreSQL, но некоторые моменты из видео заставили более внимательно относиться к структуре БД.

  • @СергейВикторович-й1ц

    Первичные ключи в маленьких табличках часто бывают внешними ключами в больших. И вот там можно много сэкономить.

  • @vladislavmikhailov
    @vladislavmikhailov Год назад +2

    Ржу нимагу! "Но вот на практике нифига, нифига!" ))
    Классно делаешь ролики, много информации и весело! Продолжай в том же духе! :D

  • @NormalniyChelovek
    @NormalniyChelovek 8 месяцев назад +1

    Отлично рассказан материал, коммент для активности.

  • @АннаЛазаренко-ы9з
    @АннаЛазаренко-ы9з Год назад +3

    Большое спасибо. Очень полезная информация

  • @ЮрийКлименко-к3щ
    @ЮрийКлименко-к3щ Год назад +3

    "Индекс - это отсортированная структура данных" - это справедливо для b-tree, но есть ведь индекс, основанный на хэш-мапе

  • @ВладимирБарков-п6ц

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

    • @andreybogdanov3
      @andreybogdanov3 Год назад +2

      on update cascade 😉

    • @vryaboshapko
      @vryaboshapko Год назад +2

      Вцелом согласен, но тут стоит ещё заметить, что номер телефона, номер паспорта, мыло, номер аськи - это всё примеры неудачного естественного ключа, как раз потому, что они могут меняться. Примеры более удачных ключей - это налоговые номера (ИНН, TIN, NIF и др.) и номера социального стразования (СНИЛС, SSN и др.), так как они назначаются один раз и на всю жизнь.

    • @ВладимирБарков-п6ц
      @ВладимирБарков-п6ц Год назад

      @@andreybogdanov3 спасибо, я что то забыл про такую возможность

    • @ВладимирБарков-п6ц
      @ВладимирБарков-п6ц Год назад +5

      ​@@vryaboshapko в таких ключах есть ещё одна проблема. Это опечатки, а ключ уникальный. И вот оператор вводит, например СНИЛС или номер серию паспорта, если это составной естественный ключ. И делает там опечатку в одной цифре. А в другую организацию приходит человек именно с таким номером, например паспорта. И в той организации ввести его данные не могут и разобраться без помощи разработчиков тоже не могут, потому что опечатку сделала другая организация. В итоге в базе данные не правильные и ввести правильные нельзя. В общем использовать естественные ключи можно, но как по мне с таким количеством нюансов - ну его...

    • @vryaboshapko
      @vryaboshapko Год назад +3

      @@ВладимирБарков-п6ц для этого в СНИЛС и ИНН зашита проверка целостности. Грубо говоря, если хитро сложить первые цифры, получится последняя (точные алгоритмы публичны и легко гуглятся). Такая же, кстати, есть для номеров баноковских карт, но это не относится к теме естественных ключей). Плюс есть публичные базы данных, по которым можно провалидировать, например, что номер соответствует ФИО или дате рождения. А номер паспорта точно нельзя использовать как естественный ключ (даже как часть составного) по той же причине, что и номер телефона: он меняется. Это уникальный номер документа, а не человека.

  • @vryaboshapko
    @vryaboshapko Год назад +4

    Частный случай префиксных ключей - это номера паспортов и других подобных документов. Они содержат серию и номер. Серия назначена по территориальному принципу, а номер - это просто счётчик. То есть, каждому актору, имеющему право генерировать первичный ключ, присваиватеся свой префикс, а он внутри себя следит за простым счётчиком. Причём, счётчик персистится с помощью write ahead log: каждый новый паспорт заносится в журнал, и ему присваивается номер на единичку больше от предыдущего занесённого. Ничто не ново под Луной, как говорится)

  • @jjsampo
    @jjsampo Год назад

    Спасибо! Как раз сейчас тема MySQL в ПТУ прохожу. Ну и вообще курс, ваш, очень помогает.

  • @ГафаровЭдуард
    @ГафаровЭдуард Год назад +1

    Классный первичный ключ - сотовый телефон
    Только у пользователя может быть несколько телефонов, ну и телефон можно потерять.
    На мой взгляд - Естественные ключи использовать крайне ненадежно.
    Вы должны быть уверены, что естественный ключ уникален в рамках проекта, концов которой не видно. (Подразумевается что вы работаете в проекте, а не пришлый наемник для решения одной задачи)
    Префиксы в начале - это реинкарнация Венгерской нотации от MS 😃

    • @t0digital
      @t0digital  Год назад

      Один телефон может быть главным, остальные будут сохранены дополнительно (если нужно их сохранять). Тут больший вопрос по смене телефона, если он PK, то надо будет менять потенциально много записей в разных таблицах, что может быть тяжело. Поэтому пример с телефоном может быть не лучший, да, но мне важнее было показать суть.

  • @sevashpun
    @sevashpun Год назад

    👍Спасибо большое за видео. Для себя узнал несколько полезных штучек! Алексей, ты крут!✌😁

  • @enetWatch
    @enetWatch Год назад

    Это просто охуительно, бесконечно великолепно! Спасибо за просветление

  • @AlexandrZverev
    @AlexandrZverev Год назад

    Доступный и подробный разбор вариантов первичных ключей, спасибо за информацию! Наверное нет смысла спорить о применении в первичных ключах int или даже smallint, потому что если такая надобность будет, то разработчик это увидит и применит. А кто-то посчитает что необходимости применения 2-х или 4-х байтового числового первичного ключа не случается никогда.

    • @vryaboshapko
      @vryaboshapko Год назад +1

      Я знаю примерно три случая, когда можно использовать small int в качестве первичного ключа, и во всех трёх случаях есть решение в виде естественного аналога: это списки валют, стран и языков. На все три есть ISO с буквенными кодами, и такие коды будут сильно удобнее, потому что их после минимальной тренировки может читать человек. Не то, чтобы я утверждаю, что small int категорически не нужен, просто вспонилось несколько частных случаев.

  • @ivanmatew568
    @ivanmatew568 Год назад

    Спасибо! Очень полезно! Думал, что давно всё знаю по этой теме.

  • @fl1lame
    @fl1lame Год назад

    Сел покушать, а тут и годный контент подъехал. Сразу лайк!

  • @vladimireliseev7602
    @vladimireliseev7602 Год назад

    Спасибо за видео!
    У меня тоже была как проблема с инкрементом sequence, когда я прям на горячем проде с 150k rpc в секунду добавил строку вручную с явным указанием id.
    И как посыпались ошибки! Ух... Хорошо быстро поправил sequence номер.

  • @ИванГолышев-с6д
    @ИванГолышев-с6д Год назад

    Спасибо, тебе за такой ролик, узнал для себя много нового. Делай дальше, у тебя это круто получается

  • @vmajura
    @vmajura Год назад

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

  • @bezborodovanton
    @bezborodovanton Год назад

    Большое спасибо за вашу работу. Отличное видео, очень полезный материал!

  • @wskeal86
    @wskeal86 Год назад +1

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

    • @vladislavstepanov7591
      @vladislavstepanov7591 Год назад

      Разве рассинхрон в несколько миллисекунд это проблема?

    • @wskeal86
      @wskeal86 Год назад

      @@vladislavstepanov7591 фишка ULID в том, что один ULID больше другого, если он сгенерировался позже на 1мс, чем первый. Но если на разных тачках есть рассинхрон, то польза от ULID'a нивелируется и проще использовать UUID v4

  • @alexeyradchenko9967
    @alexeyradchenko9967 Год назад +1

    По примеру с естественным ключом в виде номера телефона: - очень удобно, особенно когда пользователь хочет поменять номер телефона. Т.е. что проще, посмотреть по номеру телефона id и далее делать все тоже самое по id или при смене телефона иметь ад по сохранению целостности данных? Проблема в том, что зачастую многие естественные ключи не являются абсолютно константными и это создает гораздо большую проблему, чем та польза, о которой говориться. P.S. да, я читал статью про IDотов, к сожалению не могу придумать каламбур про Естественно-отов =)

  • @tiktoker797
    @tiktoker797 Год назад

    Очень полезная информация. Буду использовать в своем дипломе)

  • @user-lv3hn6uz4e
    @user-lv3hn6uz4e Год назад +6

    23:00 как ни странно иногда вставка уидов может быть быстрее чем вставка в условный bigint. Особенно если база уже большая и не новая, по той же как раз причине, что вы и описали.
    При очень интенсивной вставке, если вставка идёт одновременно из множества сессий, то возможны проблемы за конкурентный доступ последней страницы в которую данные льются, а при уидах вставка происходит в рандомные страницы в разных местах индекса и сессии друг другу не мешают)

    • @alexeyvoronin4651
      @alexeyvoronin4651 Год назад

      Вопрос не в вставке, а в последующем использовании. Чем тяжелее ключ, тем тяжелее join .

    • @MichioSempai
      @MichioSempai Год назад

      При интенсивной вставке в таблицу где pk - uuid, будет происходить очень частая и тяжёлая перестройка индекса, из-за этого как раз и может происходить существенная просадка по производительности.

  • @knarg4682
    @knarg4682 2 месяца назад

    Алексей, просьба от благодарных радиослушателей. SQLite, либо хотя бы с точки зрения самой базы, либо, если можно, в виде работы с питоновским модулем sqlite3. Проекты проектами, но на этой штуке крутится процентов 80 всего интернета и примерно три четверти всех приложений. Я колупаюсь уже второй месяц, так и не нашёл заявленный режим "многопоточность" по умолчанию, до сих пор корячу через исключения. Плюс pragma их фирменная. Можно, конечно, и самому догрызть, но объяснение от опытного человека намного эффективнее.

  • @alexgorodecky1661
    @alexgorodecky1661 Год назад

    Очень качественный материал 👍 спасибо

  • @rumartru
    @rumartru Год назад

    Спасибо, было познавательно! Отличное видео.

  • @fleapse
    @fleapse 6 месяцев назад

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

    • @knarg4682
      @knarg4682 2 месяца назад

      спасибо, но, скорее всего, когда я буду понимать смысл слов "пагинация" и "оффсет" в контексте SQL, то мне это видео уже не понадобится. И наоборот.

  • @ФедорПантюшин
    @ФедорПантюшин Год назад

    Спасибо за контент! А я даже не думал что такие способы есть. На мой взгляд id должен быть наподобии штрих-кода, но чтоб информация там была зашифрована для стороннего пользователя.

  • @Aticinsane
    @Aticinsane Год назад

    Очень полезно! Спасибо!

  • @michaeldeoz
    @michaeldeoz Год назад +1

    Пример с телефоном очень показательный. Есть у нас история действий пользователей с неким номером телефона. Казалось бы удобно. Но люди бывают что меняют номера телефонов. и если пользователь сменит свой телефон он лишиться всей своей истории.

  • @maxzhenzhera
    @maxzhenzhera Год назад

    Спасибо, очень информативно!)

  • @RexerNotes
    @RexerNotes Год назад +1

    Мысль про ключи естественные ок, но пример с номером телефона плох(опасен). Клиент может захотеть сменить номер телефона и вот тут придётся менять ваш PK, что выльется в проблемы и боль миграций.

  • @basil0607
    @basil0607 6 месяцев назад

    12:50 - при этом надо понимать, что естественный первичный ключ для справочника тех же пользователей - это та еще мина замедленного действия (помимо потребности хранить длиннющий UID или 11 знаков номера телефона во всех связанных таблицах, где могут быть сотни миллионов записей). Из того же примера в видео: вот пользователь деактивировал сим-карту и мобильный оператор продал этот номер спустя время новому физ.лицу :) Логика сломается уже на этапе регистрации в приложении где-то на бэкенде при обращении к базе. Про момент защиты персональных данных уже в ролике озвучено - тут сразу получается не вариант с естественным первичным ключом

  • @funkytapir
    @funkytapir Год назад

    Спасибо большое! Было очень интересно и познавательно, хоть я и мобильный разработчик)

  • @ivantokariuk8725
    @ivantokariuk8725 Год назад +2

    Круто :)

  • @zloysanta3391
    @zloysanta3391 Год назад +1

    По поводу always generate. А что если нам требуется восстановить таблицу из бэкапа и при этом в ней есть пропуски(удаленные записи)?

  • @enetWatch
    @enetWatch Год назад +3

    Очень неплохо бы разобрать тему uuid6 в сторону ускорения до uuid7 и 8

  • @pep421
    @pep421 Год назад

    Спасибо, много нового узнал.

  • @vyacheslavzakharov9600
    @vyacheslavzakharov9600 7 месяцев назад

    До этого видео относился к UUID как к безумной глупости. Побежал добавлять это дело к себе в петпроект

  • @fixedlearner
    @fixedlearner Год назад

    Про использование identity column было очень интересно. Не был в курсе подобной опции. Впрочем, при грамотном использовании serial не доставит никаких проблем. Достаточно целиком отдать генерацию id на откуп базы данных

  • @vktrl736
    @vktrl736 Год назад

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

  • @kl45gp
    @kl45gp Год назад +2

    4:08 а потом пользователь захочет сменить почту) и полетел наш первичный ключ во всех связных таблцах. Первичный ключ лучше всегда делать искусственным.

    • @programisli
      @programisli Год назад

      Конечно это просто пример, хотя не вижу проблем с заменой email, это же не автоинкремент и поле изменять можно. Будут проблемы с обновлением связей - да, но решаемо. Никогда не говори всегда. Возможно email был не самым лучшим примером, но вот например у тебя есть таблица стран и у стран есть Abbreviation - Name со значениями RU - Россия, US - США. Не нужен тут искусственный ключ, если первичный ключ на Abbreviation будет уникальным, и гарантирует уникальность Abreviation.

    • @kl45gp
      @kl45gp Год назад

      @@programisliтак вот чтобы потом не думать как исправлять, надо тупо делать искусственный ключ. По этой же причине надо не думать и делать сразу микросервисную архетиктуру, потому что сделав монолит через года можно сильно пожалеть.Сколько таких случае когда куда не глянь а все монолит свой пилят на сервисы? Всетоки есть практики - железны, которые уже написаны кровью

    • @kl45gp
      @kl45gp Год назад +1

      @@programisli а потом в один прекрасный момент у страны всеже поменяется Abbreviation-Name) Или изменится вид с двух значного на трехзначный.

    • @t0digital
      @t0digital  Год назад

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

    • @kl45gp
      @kl45gp Год назад +1

      @@t0digital все решается, только нафига перебирать все таблицы и заменять связи? Когда есть скажем так профессиональные подходы, я имею ввиду некое решение сбалансированное которые не подведет никогда как показывает практика. И чего кривляться когда оно надежное? Это как многие вещи в разработке стали стандартами дефакто, например докер. Чтобы ты не делал всегда все делай в контейнерах - простой рецепт решающий все будущие проблемы. Или микросервисы - никогда не делай монолиты иначе рано или поздно обожжешься на масштабируемости.

  • @АндрейСветлоков-з2ш

    Спасибо за информацию

  • @АртурЗарипов-ю9п

    Благодарю!

  • @gerzzog88
    @gerzzog88 Год назад +1

    Прикольное худи Lacoste. Подскажи, модель или серийник)

  • @revoluxe
    @revoluxe Год назад

    Это я люблю, спасибо!

  • @АндрейУшаков-у9л
    @АндрейУшаков-у9л Год назад +3

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

    • @programisli
      @programisli Год назад +4

      UUID это не строки, а 128 бит и нужно сравнивать 128 бит, что достаточно быстро. Но int будет занимать меньше месте на диске и если это внешний ключ то по числу поиск будет чуть более эффективнее, потому что меньше нужно держать в памяти или читать с диска. Просто индекс будет компактнее

    • @cristianglodeanu2329
      @cristianglodeanu2329 Год назад

      @@programisli пхах, какраз когда прочитал 128 бит, в видосе на 20:13 прозвучало "весит 128 бит"

    • @vryaboshapko
      @vryaboshapko Год назад

      128 бит - это 16 байт. То есть, сравнение двух UUID-ов занимает столько же времени, сколько сравнение двух строк из 16 символов (если речь не про юникод, конечно). Но стандартоне текстовое представление UUID-а (123e4567-e89b-12d3-a456-426614174000) - это 36 байт, то есть, сравнение двух строковых представлений UUID-ов занимает больше времени, чем сравнение двух честных UUID-ов. Кроме того, UUID в памяти может быть представлен не как набор байт, а, например, как два лонга (64-битные целые), и тогда сравнене будет ещё быстрее, потому что современные 64-битные процессоры могу сравнивать 64-битные целые за один такт.

    • @stripeberry
      @stripeberry Год назад +1

      По скорости инкримент будет в десятки раз быстрее, поэтому делают два ключа, id и uuid, один для внутренних релейшенов, другой для внешки

    • @ivanselyt
      @ivanselyt Год назад

      ​@@stripeberry вы имеете ввиду первичный ключ это bigInt, а для uuid создаем индекс, примерно так ?
      CREATE TABLE your_table_name (
      id SERIAL PRIMARY KEY,
      uuid UUID NOT NULL,
      -- Здесь добавьте остальные поля вашей таблицы
      -- Если нужно добавить внешние ключи или связи, то можете добавить их здесь
      );
      -- Создание индекса для ускорения поиска по uuid
      CREATE INDEX idx_uuid ON your_table_name(uuid);

  • @dilmurod9539
    @dilmurod9539 Год назад

    Просто для заметки:
    Если x = "Иногда" и y = "Всегда" то
    y = K * x, при условии К - частота случае "Иногда" и она стремиться к бесконечности )))))

  • @VadimPrudivus
    @VadimPrudivus Год назад

    Спасибо, послушал с интересом. Единственно не согласен с настойчивой рекомендацией использовать bigint в качестве ПК. Обычного int хватает в 99%, если только вы не собираетесь автоматизировать весь мир. В любом случае нужно понимать на какие объемы проектируется система, и принимать проектные решения исходя из этого.
    Еще раз спасибо, хорошая подача материала!

    • @vladislavstepanov7591
      @vladislavstepanov7591 Год назад

      Накладные ресурсы которые уйдут на bigint не сравнятся с болью перелапачивать бд и менять типы с int на bigint

  • @Coreduo
    @Coreduo Год назад

    Сразу лайк!

  • @pavel_dev
    @pavel_dev Год назад

    Классные видосы для гиков у тебя. Я подписан

  • @EdwardNorthwind
    @EdwardNorthwind Год назад

    UUID v6 выглядит перспективно, но я бы вообще пошел дальше и использовал nanoTime, а для формирования рандомной части оставил последние 11 байт (12 символов).

  • @МихаилПастушков-з5м

    спасибо!

  • @LuckyDen2012
    @LuckyDen2012 Год назад +1

    Про телефон посмеялся :)) кто то еще делает по ним первичные ключи ? :)
    Сделали, а потом юзер перестал оплачивать телефон, компания телефон отбирает, и передает ДРУГОМУ :))) "здрасте приехали" :)

  • @mkhnuser
    @mkhnuser Год назад

    Хороший материал, которого всегда не хватает. Кстати, а какую вы тему используете для psql? Вижу, что у вас есть автодополнения и подсветка.

  • @Александр-р5й9щ
    @Александр-р5й9щ 10 месяцев назад

    Полезное видео, спасибо! А где можно найти параметр, отвечающий за такую зеленую подсветку кода?

    • @t0digital
      @t0digital  10 месяцев назад

      Спасибо! Это pgcli

  • @semibiotic
    @semibiotic Год назад +1

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

    • @t0digital
      @t0digital  Год назад

      Таблица стран. Обоснуете, почему название страны нельзя сделать первичным ключом и почему это плохо повлияет на производительность?

    • @semibiotic
      @semibiotic Год назад

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

    • @semibiotic
      @semibiotic Год назад

      ​​​​@@t0digital Кроме того. Страна может сменить название и из-за такого дизайна БД, нам придется менять все ключи в таблицах.
      Страна также может распасться и объединиться с другой (upd: что, впрочем, в любом случае потребует коррекции более чем одной таблицы).

    • @t0digital
      @t0digital  Год назад

      @@semibiotic размер строки не обязательно больше размера UUID'а, например

    • @t0digital
      @t0digital  Год назад

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

  • @andreybagulnikov5404
    @andreybagulnikov5404 Год назад

    Капец ты гений какой то)

  • @jamjam3337
    @jamjam3337 Год назад

    👏

  • @avorion-ru
    @avorion-ru Год назад

    Приветствую! Спасибо за видос, очень актуально и полезно. Интересно ваше мнение по вопросу: где удобнее всего и эффективнее разрабатывать схему БД? В кансоле сразу, или может в pgAdmin, а может по старинке на листочке схему рисовать?)

    • @t0digital
      @t0digital  Год назад +3

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

  • @Evervess179
    @Evervess179 Год назад

    крутая картинка. кач хорош

  • @kl45gp
    @kl45gp Год назад

    с таким крупным шрифтом ты очень быстро сломаешь себе глаза! 12 должен быть максимальный.

    • @t0digital
      @t0digital  Год назад

      Шрифт для видео увеличиваю, чтобы было видно всем

  • @tirnik707
    @tirnik707 Год назад

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

    • @t0digital
      @t0digital  Год назад

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

    • @tirnik707
      @tirnik707 Год назад

      @@t0digital Имею ввиду, что бывают случаи, когда генерация айди не эффективна на уровне базы. Например кейс когда нужен высокий перфоманс и применяется вставка батчем.

  • @helisergey
    @helisergey Год назад

    А есть видео где рассказывается про настройку терминала? Что бы так же дополнение запросов было? Или же это именно дополнение из консоли постгресс ?

  • @ВикторАлександрович-д5г

    Круто!
    А про индексы планируется видео?

  • @user-ku4iu3ed9n
    @user-ku4iu3ed9n Год назад +1

    360*1500= 540к, неплохо))

    • @t0digital
      @t0digital  Год назад +2

      налоги, комиссии, съемка, монтаж, команда с зарплатами и 31 день работы в месяц - неплохо

  • @maksimkuznetsov2132
    @maksimkuznetsov2132 Год назад

    Знаю такой прикол, когда мы делаем UID-ы самостоятельно, которые получаются из витовых склеек из других полей. Не знаю правда зачем.

  • @herman_guilliman
    @herman_guilliman Год назад

    Хочу чтобы в кадре была красная кружка с лого "D!"

  • @Iva666ka
    @Iva666ka Год назад

    Как можно проверить, что uuid_v6 (ulid, objectId) в качестве primary_key работает быстрее на больших объемах данных, чем uuid v4? Какой тест тут лучше применить?
    Для записи приходит в голову что-то типа "генерируем 10ккк uuidV4, затем в другой таблице 10ккк uuidV6, сравниваем время". А для чтения это как лучше проверить?

  • @artetl
    @artetl Год назад

    Как разработчик DWH я не могу согласиться со многими тезисами и заявлениями. Когда вы говорите о подходах и «структуре/архитектуре бд», следует в первую очередь ссылаться на нормализацию и нормальные формы. Если углубиться, то станет очевидным вывод о том, что натуральные ключи имеют право на жизнь, но исключительно в прикладном смысле.

    • @t0digital
      @t0digital  Год назад

      «Натуральные ключи имеют право на жизнь, но исключительно в прикладном смысле.»
      О чем речь?

    • @artetl
      @artetl Год назад

      @@t0digital натуральный ключ это сущность из реального мира, отражаемая в СУрБД. Сущности, отражаемые в СУрБД должны иметь первичный ключ внутри самой бд (это называется суррогатный ключ, и лучше если он сквозной), а данные должны находиться в соответствующей нормальной форме. Иначе, доработка, масштабирование, аналитика будут очень осложнены. А вот таблицы с некоторыми «фактами», например таблицы с транзакциями, лучше конечно снабжать ключами типа UUID, GUID, etc. Добавляя унифицированный суррогатный ключ клиента, как субъекта операции.
      Так вам будет норм даже с десятком миллиардов записей в таблице с транзакциями.

    • @t0digital
      @t0digital  Год назад

      @@artetl «натуральный ключ это сущность, отражаемая в СУРБД»
      То есть сущность, отражаемая в СУРБД это натуральный ключ. Таблица, которая хранит данные по сущности заказов, это натуральный ключ. Понятно:)

    • @artetl
      @artetl Год назад

      @@t0digital на натуральные ключи принято навешивать суррогатные ключи, которые будут первичными ключами для идентификации, например, клиента. Иными словами так.

    • @artetl
      @artetl Год назад

      Это на тот случай, если, например, на одном номере телефона у вас есть клиенты: юридическое и физическое лицо.

  • @viktor_borodin
    @viktor_borodin 6 месяцев назад

    Иметь или быть* если я правильно понял, то какая книга имелась ввиду

  • @PrefixKrema
    @PrefixKrema Год назад

    А почему у вас PSQL такой красывый?
    На первой минуте. Или это для маков эксклюзив?

  • @bu-video
    @bu-video 7 месяцев назад

    Проблема использования номера телефона в качестве первичного ключа не столько в безопасности, сколько в потенциальных проблемах в случае смены телефона

    • @t0digital
      @t0digital  7 месяцев назад +1

      Есть такое

  • @ysomad
    @ysomad Год назад

    21:01 - чтобы ориентироваться по времени как вариант можно использовать uuid v7

  • @ТимурСафаров-в1ч

    get_random_uuid был добавлен в PostgreSQL 13

  • @enetWatch
    @enetWatch Год назад

    А что если префиксную часть сделать модифицируемой по длине? Тогда мы сможем выбирать приоритет на скорость записи или скорость чтения из БД соответственно по скорости формирования и чтения индекса

  • @Sergey-jq5kz
    @Sergey-jq5kz Год назад

    а если использовать "generated always as identity" то не будет проблем при импорте? Например если одна запись удалена просто заново сгенерировать не вариант.

  • @pavel6981
    @pavel6981 Год назад

    Сделай видево как быстро считать количество всех результатов выборки, с учетом фильтров, в постгресе

  • @absfree123
    @absfree123 Год назад

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

    • @t0digital
      @t0digital  Год назад

      Да. По моему телефону я могу логиниться в сервисах, которыми пользовался прошлый владелец. Это тоже теория или реальность?

    • @absfree123
      @absfree123 Год назад

      @@t0digital это печальная реальность. Я так в некоторых сервисах вижу чужие старые данные.
      И не могу пользоваться логином, если вдруг сменил свой номер

    • @t0digital
      @t0digital  Год назад +1

      Ну какая есть:)
      Конечно, если использовать телефон в качестве PK, то надо осознавать потенциальные минусы такого подхода

  • @anatoly-k
    @anatoly-k 4 месяца назад

    Впервые слышу термин "искусственный" в отношении первичного ключа. Устоявшимся является "суррогатный", нет?

    • @t0digital
      @t0digital  4 месяца назад

      возможно, да

  • @Deletedeletedelete
    @Deletedeletedelete Год назад

    Как в постгре работают индексы под капотом уже был видос? :)

  • @maksimkuznetsov2132
    @maksimkuznetsov2132 Год назад

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

  • @telyuk.a
    @telyuk.a Год назад

    Алексей, подскажите пожалуйста, насколько будет эффективен индекс для поля, ну допустим varchar(300)?

    • @t0digital
      @t0digital  Год назад +1

      Да просто потестируйте сами. Сгенерите данных, сколько у вас будет в табличке, сделайте analyze, чтобы обновилась статистика, и сравните выборку без индекса и с индексом. Индекс - не гарантия эффективного выполнения запроса, он даже не обязательно будет использоваться в конкретном запросе, это как планировщик решит.

  • @Seniorius
    @Seniorius Год назад +1

    Расскажи про timescaledb

  • @kirill9927
    @kirill9927 11 месяцев назад

    С serial id есть проблема при миграции с сохранение id объектов.
    Плюс апишника хотять что бы id был uint64 :D

  • @ntvisigoth
    @ntvisigoth Год назад

    Алексей, а как ты настроил code-completion при работе с psql в терминале?

  • @JDM239
    @JDM239 Год назад

    Естественные ключи - это прям байтище на комментарии )))
    Вот в тот мне примере, что мешает ТП дать не номер телефона, а ИД пользователя?:)
    Или сначала выбрать ИД в переменную, а потом его во всех запросах, а не джойнить?
    В 99.9% случаев естественные ключи не нужны

  • @bedazzlebedazzle1327
    @bedazzlebedazzle1327 Год назад

    Номер телефона как первичный ключ или логин категорически делать нельзя, как бы это ни было "удобно" для запросов. Человек потерял телефон, и? Будем обновлять кучу таблиц, меняя значение ключа на новый номер? Или дадим пользователю зарегать новый аккаунт? Тут вообще дыра в безопасности: серез некоторое время старый номер мобильный оператор выдаст какому-то другому человеку, тот может попробовать зарегистрироваться на ресурсе, очень удивится, что логин занят, тыкнет в линк "восстановить пароль", и получит доступ к личному кабинету старого владельца, где может находиться информаумя, которую он не имеет права видеть.

    • @t0digital
      @t0digital  Год назад

      Много сервисов сейчас пускает по телефону и смс. Озон и др. Это говорит о том, что поле телефона там а) уникально б) обязательно к заполнению. Значит, является потенциальным ключом.

    • @bedazzlebedazzle1327
      @bedazzlebedazzle1327 Год назад

      @@t0digital так что насчёт смены номера клиентом, если это ключ? потом по всей базе менять?

  • @СергейРодин-ю3ъ
    @СергейРодин-ю3ъ Год назад

    05:57 а зачем использовать для этого именно композитный первичный ключ-то?
    Первичный ключ - он для идентификации. Для избежания дублирования просто создаёшь индекс уникальности по нужным колонкам. Это то, что делает первичный ключ, кстати.

    • @alexgorodecky1661
      @alexgorodecky1661 Год назад

      Это порождает избыточность. Удобство искусственных первичных ключей зависит, в первую очередь, от запросов. Пример: settings - настройки с учётом года. Входить в эту таблицу мы всегда будем через , и ссылок из других таблиц на settings часто тоже нет. Итог - в данном случае лучше составной естественный ключ

    • @СергейРодин-ю3ъ
      @СергейРодин-ю3ъ Год назад

      @@alexgorodecky1661 Я о другом. Выбирайте вариант, который Вам нужен. Но конкретно задача избавления от дублирования решается уникальным индексом, для неё не нужно накрывать колонки первичным ключом.

  • @profile_pub190
    @profile_pub190 Год назад

    Блин хорошая тема, но что за пример с номером телефона, такая дичь даже озвучиваться не должна как возможная. Там сразу столько проблем, рекомендую статью на хабре про заблуждения программистов о номерах телефона. К той статье ещё бы добавить в заблуждения: "думать что у пользователя из X страны номер телефона тоже из страны X. Уже приходилось видеть регистрацию где номер телефона захардкожен с +7. Ну и с ключом на базе телефона рано или поздно вам нужно будет внести нового пользователя у которого снова повторяющийся телефон. Не усложняйте жизнь себе и людям которые будут поддерживать системы

  • @sergeynothing9324
    @sergeynothing9324 Год назад

    А потом человек меняет номер телефона и мы.... весело придумываем решение ))))