LINUX.ORG.RU

Рекомендации по выбору типа данных в SQL-таблицах

 


0

3

А есть какие-нибудь универсальные рекомендации по выбору типа данных в SQL-таблицах для таких значений как имена людей, названия улиц, файловые пути, доменные имена, email адреса, URL адреса, телефонные номера и т.п.? Скажем так лучшие практики оформленные в виде cheat-sheet чтобы всегда были под рукой.

Ответ на: комментарий от ddidwyll

Есть к примеру модели пользователь, продукт и компания, нафига их сортировать по id?

Ну вот тебе простой пример: ты хочешь посмотреть список 10 последних пользователей. Твои действия?

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file
SELECT * FROM auth_user ORDER BY date_added DESC LIMIT 10;

А где гарантия, что записи будут идти всегда строго по возрастанию pk? Даже с автоинкрементом это никто не гарантирует и полагаться на это - стрелять себе в ногу.

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

Рекомендую тогда уж копнуть глубже и выяснить, что на самом деле происходит в PostgreSQL при объявлении SERIAL или IDENTITY. Тем более, что копать несложно и неглубоко.

Как это в PostgreSQL работает я и без копания знаю.

И какое это вообще имеет отношение к обсуждаемому наезду, что «UUID ключи не нужны».

Никакое, потому что это был комментарий про инкрементные столбцы как артефакт MySQL - в том или ином виде они много где есть.

Mr-Donut
() автор топика
Ответ на: комментарий от emorozov

ORDER BY date_added

Я так и знал, что ты напишешь такую вот херню. Алё, дядя, у тебя хайлоад и каждую наносекунду добавляется 100500 пользователей.

Даже с автоинкрементом это никто не гарантирует

Гарантирует, потому что автоинкремент работает через лок.

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

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

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

наносекунду добавляется 100500 пользователей

Ну-ну, и крутится на галактическом кластере. Как обычно :-P

Правда ответ сервера про 10 последних будет, увы, невалидным.

ddidwyll ★★★★
()
Последнее исправление: ddidwyll (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Гарантирует, потому что автоинкремент работает через лок.

Какие же вы PHPшники, пафосные неучи…

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

emorozov
()
Ответ на: комментарий от no-such-file

Тебе может быть показалось что я считаю последовательные id ненужными, но это не так. Я считаю что чаще они не нужны и хочу удостовериться прав я или нет, пока ты меня не убедил.

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

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

ЛОЛ, какие ж вы питонисты тупые. Дырки не имеют значения по той же причине почему они не имеют значения для дат.

попали новые пользователи хотя бы вручную

А если твои date_added изменены вручную? Что если на Марсе полнолуние? Будь хоть раз профессионалом: признай что был не прав и скажи спасибо что научили. А то так и помрёшь формошлёпом.

no-such-file ★★★★★
()
Ответ на: комментарий от ddidwyll

Так себе те кейсы под «обычно» подпадают

Не, ну для школьного сайта ты можешь что угодно навалять. А так вообще за ORDER BY date_added в нормальных местах увольняют. Тебя и того кто тебя на работу взял.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от ddidwyll

А ты думаешь, что есть только хайлоад и школьный сайт?

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

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Алё, дядя, у тебя хайлоад и каждую наносекунду добавляется 100500 пользователей.

Гарантирует, потому что автоинкремент работает через лок.

Лок, хайлоад, 100500 rpns. Чот орнул прям.

UPD Ага, там ещё и банк!

filosofia
()
Последнее исправление: filosofia (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Допустим с ключом от 1 до 100 (условно) - данные из пункта А, а от 101 до 300 - из пункта Б

Для таких вещей обычно делают nested set.

Кстати, я вспомнил откуда это у меня в голове. Я так делал. Правда там и БД была не реляционная, и синхронизация данных через дискету с курьером ФАПСИ.

Toxo2 ★★★★
()
Ответ на: комментарий от no-such-file

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

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

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

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

Банк, не банк это дело десятое. Потом после таких вот «индусов» боинги падают. Потому что «ну это же никогда не случится». Даже как-то странно что приходится такие вещи объяснять.

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

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Просто потому что так звёзды сошлись и две записи добавлены в одно и тоже время

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

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

Что если логика не допускает двух записей в одно время, кого увольнять тогда?

Что значит не допускает? У тебя два события произошли в одно время. Что ты собираешься делать? Выбросить одно? Чуть-чуть подождать и молиться чтобы в эту наносекудну ничего не прилетело ещё? Хватит уже мучать жопу и защищать некорректное решение путём нагораживания костылей на костыли.

если порядок двух записей в одну микросекунду не важен

Он всегда важен. Без этого ты не сможешь перебирать записи по страницам. Что если тебе нужно не первые 10, а вторые 10? Если порядок не установлен, то и в первой и во второй странице БД тебе может отдать одну и туже запись, и т.о. одну запись при переборе ты пропустишь.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Да блин, ты серьёзно?

Есть актор, у него очередь задач, задача выполняется несколько минут, по факту выполнения записывается лог. Последние записи того лога на клиент отдаются c тем самым order_by: :created_at.

Вопрос: какие звёзды должны вызвать ошибку?

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

задача выполняется несколько минут

Какая разница сколько времени выполняется задача? Важно что задачи могут «записываться в лог» одновременно.

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

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

no-such-file ★★★★★
()
Ответ на: комментарий от ddidwyll

Нет же, не могут, это ОЧЕРЕДЬ

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

Что ты такое пишешь, что у тебя такой узкий кругозор

Вообще-то у тебя. Ты похоже слаще морковки ничего не пробовал. Но страдаешь от Даннинга-Крюгера по-полной.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Я тебе привожу реальный пример из того над чем сейчас работаю.

Внезапно у очереди может быть (и обычно бывает в реальных системах) несколько воркеров

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

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

Вообще-то у тебя

Прочитай ещё раз всю ветку, я ни разу не сказал что твоя версия неправильна, я пытаюсь донести до тебя, что есть варианты.

Даннинг-Крюгер

;-)

Ты не ответил, каким образом order_by: :created_at может в данном примере вызвать ошибку?

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

Из своей практики скажу что не нужно делать, но с чем пришлось столкнуться:

Хранить дату как текст и хранить ее в unix формате или хранить ее в разных форматах в разных таблицах, для этого всего есть просто timestamp with time zone.

Путать boolean и text, банально, но случалось, и проблем от этого потом достаточно.

Делать gunzip, gzip перед тем как грузить данные (обратная совместимость она такая да!)

Писать хитрые портянки со сложением, умножением, переписыванием значений ON CONFLICT, чтобы не делать лишний SELECT, - оно того не стоит. О великий PostgreSQL без UPSERT

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

Я не знаю, я сто лет не использую MySQL. У MySQL бывали специфические фичи, которых нет у MSSql/Oracle/Postgres (типа агрегата first/last), и не было обычных для MSSql/Oracle/Postgres фич. Такое начинает подбешивать, а учитывая, что даже массовый шаред хостинг даёт базу постгреса за копейки, я на MySQL забил.

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

А да еще, раз уже начал, только что вспомнил.

Не стоит писать длинные OUTER JOIN’ы или вообще если у тебя уже не лезит в латинский алфавит для названия это всего добра, а то потом будешь искать что такое aq например, ну и так далее, ну или сразу выбирай более точные название, ведь никто не знает как оно разрастется в будущем. Да и вообще, конечно чем короче, проще и понятнее, тем лучше когда ты будешь потом это читать.

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

Ну, если скорость не критична, можно функцию написать. Можно триггеры...

В моей области (BI) основной insert - это bulk из csv с локом таблицы, поэтому как-то не парит :)

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

и в дырки не попали новые пользователи хотя бы вручную?

А у вас на проде часто так бывает, что новых пользователей добавляют в БД вручную? Или они просто сами, как вши, заводятся?

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

А у вас на проде часто так бывает, что новых пользователей добавляют в БД вручную? Или они просто сами, как вши, заводятся?

Зависит от области. Где-то, в финансах и около того например, необходим KYC/KYB, иногда на уровне законов. В таких случаях перевод пользователя в прод базу можно рассматривать как ручную или полу-ручную операцию, а за каждую вошь тебя поблагодарит аудитор.

filosofia
()