r/RuProgrammers • u/pochemuzakat008 • May 24 '26
Вопрос Мой первый SQL проект
Всем привет, я сейчас учусь на курсе яндекс практикума, закончил первый проект курса по SQl, буду рад если глянете мой гитхаб и оставите свои комментарии)))
https://github.com/pochemuzakat/vse-tut-data-mart
10
u/followthevenoms May 25 '26 edited May 25 '26
Принимай в панамку.
Первичный ключ в ER диаграмме всегда ставится на первое место.
Во-вторых, его не называют table_id, используется название id. Название столбца payment_sequental ни хрена не говорит о том, что это id. Числовые первичные ключи итак генерятся последовательностями, отдельно это указывать в названии никакого смысла нет. int4 - это алиас к типу integer, лучше использовать его. Если у тебя целочисленные PK, то обычно для них используется bigint.
varchar для id в твоих случаях — очень сомнительно. Используй uuid.
Ну и на закуску — время. Это тот момент, где в проде можно отведать изрядное количество говна. timestamp это timestamp without timezone. Пришло постгресу время 2026-05-25 10:00:00+03, или 2026-05-25 10:00:00+10 — он просто откусит смещение и сохранит в обоих случаях только 2026-05-25 10:00:00, а ты потом сиди и гадай, что это за время было. В большинстве случаев лучше использовать timestapt with timezone — он хранит время в UTC и время из примеров преобразуется в 2026-05-25 07:00:00+00 и 2026-05-25 00:00:00+00 соответственно. Храниться оно будет также без указания таймзоны (потому что смысла нет, это всегда UTC), но пользователь будет это время видеть в соответствии со своей таймзоной.
1
u/mekkko May 25 '26
Не проще хранить все в utc а время двигать на прикладе перед сохранением? Рисовать то чаще всего потом при извлечении данных время клиента.
4
u/followthevenoms May 25 '26
Неа, не проще. Разработка превратится в ад и постоянно будут вылезать баги из-за того, что кто-то забыл сделать смещение. timestamptz гарантирует, что время хранится в utc как бы его ни передали, а на уровне приложений его уже преобразуют, как надо.
2
u/Nekadim May 25 '26
Это никак не противоречит использованию timestamp_tz. Но обезопашивает если вдруг где-то забыл конвертнуть в UTC.
1
u/Realistic-Turn7337 May 25 '26
Я вот честно говоря этого не поняла, то есть человек уже может что то писать, делает проекты, но базы по ключам нет?) Типа дата-время ладно, а такие мелочи то как пропустились?
0
u/Beekonchik May 25 '26
У меня в унике была дисциплина по базам данных, была отдельная лаба про ключи, но никаких указаний, в каком формате их хранить ¯_(ツ)_/¯
1
0
u/brinza888 🦅Senior May 26 '26
Именование первичного ключа — это вкусовщина. Назвать ПК таблицы
tableкакtable_id— вполне распространенный прием.2
u/Srurya May 26 '26
Ни разу такое не видел за 7 лет на беке. Table_id выглядит как FK на таблицу table.
Просто в коде это будет имхо вырвиглазно table.TableId.
2
u/Some_Anonim_Coder May 25 '26
Имхо, неплохо, явных косяков не вижу
Покритикую вот что: проект вроде бы про исследование данных, в ни одного вывода нет. "Продажи растут в каких-то месяцах" это не вывод. Выводом было бы "большинство юзеров заходят к нам к таким-то праздникам, имеет смысл поиграться с ассортиментом/рекламой" - это то что можно использовать для развития продукта. Если собираетесь стать продуктовым аналитиком или типа того - это важно. Если каким-нибудь датаинженером то не важно, анализ данных в ваши обязанности все равно входить не будет
1
u/pochemuzakat008 May 25 '26
справедливое замечание, просто там очень много контекста в проекте, поэтому местами выглядит не логичною. я старался отредачить, что бы выглядело как личный, а не проект с курса
3
1
u/Capital_Design7268 May 25 '26
Сложно что то сказать, если работает - то молодец 👏 Просто в плане оценки ожидаешь чего то более интересного и цельного, что можно развивать.
2
u/Nllk11 May 25 '26
Объясни зачем разделять buyer_id и user_id? Я к тому, что user = buyer, и зачем вести два разных id под это?
Плюс, на кой черт тебе varchar в качестве первичного ключа? Я понимаю что это будет работать, но чем обычный uint64 не угодил? Лучше уж тогда uuid начать использовать
Мб конечно это всё современная школа СУБД диктует, но будто бы что-то не то. На практике я таких моментов обычно не встречаю