Skip to content

Instantly share code, notes, and snippets.

@v-kolesnikov
Last active May 31, 2021 11:10
Show Gist options
  • Save v-kolesnikov/25395059f46c9d5fb44e to your computer and use it in GitHub Desktop.
Save v-kolesnikov/25395059f46c9d5fb44e to your computer and use it in GitHub Desktop.
почему дефолты в БД зло, Continuos Delivery
kirill.mokevnin [8:19 PM]
тут в соседнем чате спросили почему дефолты в базе зло, но по скольку это касается не только руби, предлагаю обсудить
kirill.mokevnin [8:19 PM]
тут
kirill.mokevnin [8:20 PM]
Кто согласен не согласен?
ivanlemeshev [8:21 PM]
не знаю) а почему зло то?)
kirill.mokevnin [8:21 PM]
а почему добро?)
ivanlemeshev [8:22 PM]
не думал об этом) не вижу ни добра ни зла))
kirill.mokevnin [8:23 PM]
хорошо, тут есть кто их активно юзает и предпочитает делать так. Почему?
ivanlemeshev [8:25 PM]
ну как минимум для дат юзаю, удобно вроде как)
kirill.mokevnin [8:26 PM]
типа поставить created at?
ivanlemeshev [8:26 PM]
да
v.kolesnikov [8:26 PM]
@kirill.mokevnin: с удовольствием, а что имеется ввиду под дефолтами? Дефолтные значения полей в базе?
kirill.mokevnin [8:26 PM]
да
kirill.mokevnin [8:26 PM]
а какую дату ставит база?)
moofkit [8:27 PM]
серверную
kirill.mokevnin [8:27 PM]
а хотя это я не в кассу, все ок с этим
ivanlemeshev [8:27 PM]
ну таймстемп по часовому поясу бд, обычно utc
sprihodko [8:27 PM]
Не скажу, что активно, но все же. Иногда бывает удобно задать стандартное значение для поля: например у нового пользователя 0 денег на счету, или 0 очков и т п Или задать изначальную роль пользователя. Иначе как это удобно делать? Коллбеки не очень хочется использовать
evrial [8:27 PM]
шо здесь
kirill.mokevnin [8:28 PM]
"колбеки" это случайная сложность
kirill.mokevnin [8:28 PM]
а не проблематика
sprihodko [8:30 PM]
Не сталкивался с тем, что задание стандартных значений в базе это зло. Поэтому если есть удобный инструмент - почему бы его не использовать)
aderyabin [8:34 PM]
Я ими пользуюсь.
kirill.mokevnin [8:34 PM]
но при этом не натыкался на проблемы?
aderyabin [8:35 PM]
Мне кажется изначально вопрос касается не только дефолтов, а например, еще и Foreign Key в pg как пример. Если это рельсовое приложение, то мне было бы не очень приятно что PG возьмет и что-то удалит. Но с другой стороны если PG меня подстрахует это тоже не плохо.
aderyabin [8:35 PM]
я бы не сказал что будет правильный ответ *да* или *нет*
evrial [8:35 PM]
в MySQL вообще всё плохо с дефолтами
evrial [8:35 PM]
вот кто знает что NULL != NULL ?
kirill.mokevnin [8:37 PM]
есть очень много аспектов у этой проблемы чисто технические и не только.
kirill.mokevnin [8:40 PM]
Если говорить чисто по технике, кто знает насколько тяжелая операция в постгресе добавить или удалить колонку?
kirill.mokevnin [8:41 PM]
в mysql это тяжелая операция, переколбашиваются кишки
ivanlemeshev [8:41 PM]
ничего не знаю об этом :baby:
evrial [8:42 PM]
в pg ничего не стоит
kirill.mokevnin [8:42 PM]
в pg O(1) грубо говоря
evrial [8:42 PM]
а mysql я советую избегать как огня, берите mariaDB, 100% бинарно совместимый
kirill.mokevnin [8:42 PM]
меняются просто металанные
aderyabin [8:42 PM]
а дефолтное значение ставится?
aderyabin [8:42 PM]
при добавлении?
evrial [8:43 PM]
как захочешь
jastkand [8:43 PM]
Смотря какое дефолтное значение и для чего. Если это параметр типа: sudo:boolean или какой-нибудь counter_cache в любом его представлении, то да. Если же это, например роль пользователя, или состояние стейтмашины, то нет
kirill.mokevnin [8:43 PM]
во! а что будет если добавить колонку с дефолтом?
aderyabin [8:43 PM]
Мы один раз генерировали уникальные хеши для автоматического входа на 20 млн пользователей (edited)
aderyabin [8:43 PM]
это было больно
evrial [8:43 PM]
в pg ничего
kirill.mokevnin [8:43 PM]
в пг будет боль
kirill.mokevnin [8:44 PM]
везде будет
kirill.mokevnin [8:44 PM]
если у вас ксть записи
kirill.mokevnin [8:44 PM]
он попрет их обновлять
w00t [8:44 PM]
@aderyabin базу дропнули?)
jastkand [8:44 PM]
Если записей много
aderyabin [8:44 PM]
ага, положили групон на месяц и пошли бухать
kirill.mokevnin [8:44 PM]
у вани евтуховича есть статья на эту тему вроде
aderyabin [8:45 PM]
ну он и писал по следам групона)
jastkand [8:45 PM]
:)
evrial [8:45 PM]
O(n)
w00t [8:45 PM]
эх редко такое бывает)
evrial [8:45 PM]
тут магически O(1) не сделаешь
evrial [8:46 PM]
потому что там может быть функция от полей
aderyabin [8:46 PM]
ну вот и был вопрос какой дефаулт
kirill.mokevnin [8:46 PM]
погоди) будет и про то и то
aderyabin [8:46 PM]
вычисляемый
aderyabin [8:46 PM]
или фиксированный.
kirill.mokevnin [8:47 PM]
это не важно при добавлении нового поля с дефолтом
kirill.mokevnin [8:47 PM]
будет общее обновление
kirill.mokevnin [8:48 PM]
теперь давайте возьмем самый самый верхний уровень, как обеспечить возможность zero downtime deploy
kirill.mokevnin [8:48 PM]
какое правило существует для баз данных в серьезных проектах?
plugin73 [8:48 PM]
append only
kirill.mokevnin [8:48 PM]
саша не пали контору)
plugin73 [8:48 PM]
простите, удаляюсь
plugin73 [8:49 PM]
:simple_smile:
kirill.mokevnin [8:49 PM]
правило на уровне ddl
kirill.mokevnin [8:52 PM]
?) я все по полочкам расскажу минут через 30 как доеду. Пока только наводящие вопросы могу задавать
kirill.mokevnin [8:53 PM]
по поводу zdd понятно? это когда мы не останавливаем приложение
kirill.mokevnin [8:53 PM]
по крайней мере снаружи так кажется
kirill.mokevnin [8:53 PM]
яндекс фейсбук твиттер слак
kirill.mokevnin [8:53 PM]
они никогда не показывают вам таблицу "мы на обслуживании"
kirill.mokevnin [8:56 PM]
так кажется я всех распугал -)
про zdd понятно
kirill.mokevnin [9:00 PM]
как это реализовать?
v.kolesnikov [9:00 PM]
@kirill.mokevnin: ) да нет, просто все замерли у ног мудреца и ждут истины :grinning:
:+1:2
kirill.mokevnin [9:00 PM]
воу воу полегче)
tuscen [9:00 PM]
В том то и дело, мне не понятно как это реализовать )
kirill.mokevnin [9:00 PM]
тут есть много людей уто все знает прекрасно
kirill.mokevnin [9:01 PM]
да?)
kirill.mokevnin [9:01 PM]
ок, пока подумайте это реально крутая тема и я скоро напишу
kirill.mokevnin [9:01 PM]
это все еще про дефолты кстати
kirill.mokevnin [9:02 PM]
и вы не поверите но функиональные подходы и тут
plugin73 [9:04 PM]
@tuscen: а конкретно что не понятно? :simple_smile:
tuscen [9:06 PM]
@plugin73: Ох, даже сказать ничего конкретного не могу. Не совсем в каком направлении копать. Даже скажу так: все данные подсказки не получается вместе соединить. (edited)
moofkit [9:11 PM]
@tuscen: "тут в соседнем чате спросили почему дефолты в базе зло, но по скольку это касается не только руби, предлагаю обсудить"
этот вопрос мы пытаемся выяснить. зло или нет.
и первый довод против был, из-за того что при добавлении нового столбца с дефолтным значением, база будет обновлятся для всех существующих записей. и пользователи это заметят
tuscen [9:14 PM]
@moofkit: Да, это я прочел. То есть для достижения zdd не нужно исопльзовать дефолтные значения в базе?
kirill.mokevnin [9:18 PM]
я на месте
evrial [9:18 PM]
вариант - юзать репликацию и накатывать изменения на вторую
kirill.mokevnin [9:18 PM]
да добавление новой колонки с дефолтом не прет в серьезных ситуациях, обычно делают создание без дефолта
kirill.mokevnin [9:19 PM]
а потом вешают дефолт и накатывают дефолт обычными запросами
evrial [9:19 PM]
если правда репликация не откатит свежие данные пока будет идти )
kirill.mokevnin [9:20 PM]
но на самом деле тут все еще хуже, дело не только в том что это долгая и тяжелая операция
kirill.mokevnin [9:20 PM]
а в том что у вас возникают серьезные блокировки на таблице
kirill.mokevnin [9:20 PM]
дедлоки и lock wait timeout привет
kirill.mokevnin [9:21 PM]
дальше следующая более серьезная история
kirill.mokevnin [9:21 PM]
обновление без остановки
kirill.mokevnin [9:22 PM]
для того чтобы начать двигаться в эту сторону, нужно понять сначала не “как оно работает” а “как оно не может работать"
kirill.mokevnin [9:22 PM]
можете ли вы волшебным образом сделать подмену что после определенного момента у всех строго после f5 загрузится новая версия?
kirill.mokevnin [9:23 PM]
нет конечно, хотя бы потому что апдейт базы до нового состояния (обратите внимание на это слово)
kirill.mokevnin [9:23 PM]
занимает время
kirill.mokevnin [9:23 PM]
иногда миграции идут днями
kirill.mokevnin [9:23 PM]
иногда неделями
kirill.mokevnin [9:23 PM]
даже 10 минут достаточно для простоя
kirill.mokevnin [9:23 PM]
в этот момент у вас все неконсистентно, и если кто то будет делать запросы к приложению
kirill.mokevnin [9:23 PM]
то вы можете легко получить рассинхрон или у людей тупо ничего не заработает
kirill.mokevnin [9:23 PM]
потому что код старый а база новая
kirill.mokevnin [9:24 PM]
кто нибудь уже видит закономерность?
kirill.mokevnin [9:24 PM]
если кто не знаком со словом миграции это просто запросы которые изменяют структуру базы данных или перелопачивают данные
kirill.mokevnin [9:25 PM]
которые выполняются часто про выкатке кода (но на самом деле тут ключ тоже)
kirill.mokevnin [9:25 PM]
Парни, просьба иногда синкаться, а то у меня страх что я сам с собой разговариваю
kirill.mokevnin [9:25 PM]
:smile:
sergey.ponomarev [9:25 PM]
не не
sergey.ponomarev [9:25 PM]
мы тут)
tuscen [9:26 PM]
Внимаем )
aderyabin [9:26 PM]
@kirill.mokevnin: этот вопрос задаем на собеседовании. ЧТо делать если надо что-то добавить на много записей
kirill.mokevnin [9:26 PM]
во, платите мне деньги чтобы я молчал!
:smile:
kirill.mokevnin [9:27 PM]
до сих пор все понятно? Если нет давайте разберем
kirill.mokevnin [9:27 PM]
просто щас будет глубже
sergey.ponomarev [9:28 PM]
@kirill.mokevnin: вроде пока все проблемы озвученные так или иначе решаются за несколько шагов
kirill.mokevnin [9:28 PM]
каких?
kirill.mokevnin [9:28 PM]
в этом то и суть, как обновляться без остановки
sergey.ponomarev [9:29 PM]
ну допустим проблема с изменением данных в одной колонке
sergey.ponomarev [9:29 PM]
не важно что хотим - мутировать данные или переименовать колонку
arrowcircle [9:29 PM]
Переименовывать просто так нельзя
kirill.mokevnin [9:29 PM]
ок, давайте будем говорить про переименование это более канонический пример
sergey.ponomarev [9:30 PM]
тут надо использовать возможность не миграции но новой колонки
sergey.ponomarev [9:30 PM]
те шаги простые
sergey.ponomarev [9:30 PM]
допустим у нас есть уже механизм zero time deploy
kirill.mokevnin [9:30 PM]
так собственно переименовывать не будем или будем?
sergey.ponomarev [9:30 PM]
не будем (edited)
kirill.mokevnin [9:30 PM]
на самом деле это главный вопрос
sergey.ponomarev [9:30 PM]
:smiley:
kirill.mokevnin [9:30 PM]
во!
kirill.mokevnin [9:30 PM]
так что собственно нужно делать в базах
kirill.mokevnin [9:30 PM]
чтобы обеспечивать zdd
tuscen [9:30 PM]
Только добавлять?
tuscen [9:31 PM]
Сохраняя обратную совместимость
kirill.mokevnin [9:31 PM]
главный закон “база может расти только в ширь"
kirill.mokevnin [9:31 PM]
да, обратная совместимость
arrowcircle [9:31 PM]
@kirill.mokevnin: с ренеймом пример будет хороший
kirill.mokevnin [9:31 PM]
да в принципе уже все сказал), ваша база должна быть функциональная
sergey.ponomarev [9:31 PM]
ааа)
kirill.mokevnin [9:31 PM]
никакого изменения состояния ddl (это data definition language)
kirill.mokevnin [9:31 PM]
альтеры
sergey.ponomarev [9:32 PM]
функциональный подход здесь ты имеешь иммутабельность ddl?
kirill.mokevnin [9:32 PM]
у фейсбука есть клевая статья как они колонку в мускул добавляют на таблицу
kirill.mokevnin [9:32 PM]
кто нибудь знает?
kirill.mokevnin [9:32 PM]
да конечно, вы не имеете права изменять ничего
alexander.a [9:32 PM]
Добавляем новую колонку, пишем в обе, читаем пока из старой паралельно мигрируем старые данные, когда все смигрируем колонку можно удалить
kirill.mokevnin [9:32 PM]
названия таблиц столбов
kirill.mokevnin [9:32 PM]
неее)
kirill.mokevnin [9:32 PM]
не добавляем
kirill.mokevnin [9:32 PM]
в mysql при серьезных нагрузках делают новую таблицу!
kirill.mokevnin [9:32 PM]
ибо вы нахер залочите все пока колонка добавляется
sergey.ponomarev [9:33 PM]
а данные перенести каким-то COPY?
kirill.mokevnin [9:33 PM]
да хоть запросами, дальше можно написать триггеры синхронизации
kirill.mokevnin [9:33 PM]
но на самом деле это тупо проблема мускула
sergey.ponomarev [9:33 PM]
или триггеры?
sergey.ponomarev [9:33 PM]
ааа
kirill.mokevnin [9:33 PM]
я не к тому что так делать
надо
kirill.mokevnin [9:33 PM]
короче главное что надо вынести отсюда, никаких переименований
kirill.mokevnin [9:33 PM]
никаких удалений колонок
kirill.mokevnin [9:34 PM]
только добавления
kirill.mokevnin [9:34 PM]
теперь внимание вопрос)
kirill.mokevnin [9:34 PM]
могут ли существовать дефолты в колонках в такой схеме?
alexander.a [9:36 PM]
нет получается, в новую колонку что то будет записано при миграции данных
kirill.mokevnin [9:36 PM]
могут, но вы сами себе приключения создадите на голову, вместо того чтобы тупо обновить код, вам придется делать новую колонку с новым дефолтом и синкать их.
kirill.mokevnin [9:37 PM]
потому что нельзя менять старое состояние таблицы
kirill.mokevnin [9:37 PM]
определения таблицы (edited)
kirill.mokevnin [9:37 PM]
давайте до конца добъем и я дальше отвечу на возможно возникший вопрос “у меня такого нет, нафига"
kirill.mokevnin [9:37 PM]
что является при всем при этом наиболее важным в процессе такого деплоя?
kirill.mokevnin [9:38 PM]
а у на да, тут еще встает такой момент что база в таких проектах отвязана от кода и программистов
kirill.mokevnin [9:38 PM]
она контролируется dba которые по запросу делают запросы (такая вот тафталогия)
plugin73 [9:38 PM]
ну не всегда же :simple_smile: у нас не отвязана
kirill.mokevnin [9:38 PM]
но это если все прямо очень серьезно, у нас не отвязана да
kirill.mokevnin [9:39 PM]
но у нас именно такой подход, хотя настоящий zdd мы не используем, но по другой причине, я объясню позже
kirill.mokevnin [9:39 PM]
Так вот самое главное это откат
kirill.mokevnin [9:39 PM]
моментальный
kirill.mokevnin [9:39 PM]
никаких rollback транзакций
kirill.mokevnin [9:40 PM]
вы просто гасите старый код и поднимаете новый (но еще есть случай когда меняются очереди или вообще инфраструктура, тут все тоже самое но на уровне серверов, вы должны поднимать новую инфраструктуру а старую держать на случай отката)
kirill.mokevnin [9:40 PM]
и того получается схема аля google chrome os
kirill.mokevnin [9:40 PM]
знаете как там апдейты работают?
kirill.mokevnin [9:40 PM]
в эрланге так же кстати
kirill.mokevnin [9:40 PM]
именно поэтому эрланг позволяет без остановки аппликухи обновиться целиком даже если внутри стейт
alexander.a [9:41 PM]
В старую таблицу получается все равное пишем на случай отката?
tuscen [9:41 PM]
Нет, chrome os ни разу не использовал
kirill.mokevnin [9:41 PM]
тут на самом деле от ситуации зависит, но в идеале да, вы должны обеспечивать синхронизацию ручками
kirill.mokevnin [9:41 PM]
никто этого за вас не сделает
kirill.mokevnin [9:41 PM]
и невозможно автоматизировать
kirill.mokevnin [9:41 PM]
мы еще кстати даже не обсуждали шардинг
kirill.mokevnin [9:42 PM]
когда у вас одна база размазана по серверам
kirill.mokevnin [9:42 PM]
у вас там нет физической возможности одновременно производить изменения сразу на всю таблицу
kirill.mokevnin [9:42 PM]
то есть в таких ситуациях по другому жить просто не возможно
kirill.mokevnin [9:42 PM]
это уже не выбор, а жизнь
arrowcircle [9:42 PM]
@kirill.mokevnin: старый и новый код должны работать и со старым и с новым состоянием базы
trigger [9:43 PM]
joined #general
kirill.mokevnin [9:43 PM]
но тут уже с поправкой на логику, иногда удается что то упростить
kirill.mokevnin [9:43 PM]
но новая база обязана быть совместима со старой это закон
kirill.mokevnin [9:43 PM]
без альтернатив
kirill.mokevnin [9:43 PM]
не в плане синхронизации, а в плане названий таблиц колонок
kirill.mokevnin [9:43 PM]
их типов
kirill.mokevnin [9:43 PM]
и тому подобное
kirill.mokevnin [9:43 PM]
ddl в общем
kirill.mokevnin [9:44 PM]
и чтобы завершить картину, на фронтенде при этом есть балансеры
kirill.mokevnin [9:44 PM]
как делают, отключают от балансеров часть бекендов
kirill.mokevnin [9:44 PM]
поднимают там новую версию апы
kirill.mokevnin [9:44 PM]
подключают к балансеру
kirill.mokevnin [9:44 PM]
дальше у нас какое то время работают две версии
kirill.mokevnin [9:44 PM]
потом отключают другую половину
kirill.mokevnin [9:44 PM]
и повторяют
kirill.mokevnin [9:45 PM]
это грубо говоря, на самом деле обычно хитрее сложнее и у каждого свое
kirill.mokevnin [9:45 PM]
в хекслете, например, стейджинга как такового нет
kirill.mokevnin [9:45 PM]
мы деплоим сразу на прод всегда
kirill.mokevnin [9:45 PM]
но!
kirill.mokevnin [9:45 PM]
сначала мы деплоим на спец сервера, которые доступны только внутри нашей компании
kirill.mokevnin [9:45 PM]
получается что у нас одновременно всегда работает старая и новая версия кода
kirill.mokevnin [9:45 PM]
просто новую только мы видим
kirill.mokevnin [9:45 PM]
но база та же
sergey.ponomarev [9:45 PM]
и чем это отличается от стейджинга?
kirill.mokevnin [9:46 PM]
“база та же"
kirill.mokevnin [9:46 PM]
это настоящий код
kirill.mokevnin [9:46 PM]
ой, настоящий прод
kirill.mokevnin [9:46 PM]
он юзает все сервисы прода
kirill.mokevnin [9:46 PM]
просто именно вебапликейшен доступен только внутри
kirill.mokevnin [9:46 PM]
так же работает гитхаб
kirill.mokevnin [9:47 PM]
огромный дополнительный плюс в том что такая инфраструктура требует от вас поднятия совместимости на всех уровнях
kirill.mokevnin [9:47 PM]
то есть если меняется что то внутри инфраструктуры, новые очереди, другие конфиги nginx и много чего еще, то такая система вас заставит обеспечить ролбек
kirill.mokevnin [9:47 PM]
а в случае отдельного стейджинга, вам надо ручками повторить все на проде и там легко затупить и уж тем более не откатиться без простоя
sergey.ponomarev [9:48 PM]
честно говоря это всё очень здорово, но бизнес редко за это готов платить
kirill.mokevnin [9:48 PM]
есть очень распостраненный миф под названием “если что то лучше то значит это сложнее"
:+1:1
kirill.mokevnin [9:49 PM]
@plugin73: скажи, текущая схема сложнее старой со стейджом?
aelaa [9:49 PM]
по-моему с точки зрения бизнеса тут вообще ничего не изменилось
kirill.mokevnin [9:49 PM]
Бизнес за это не просто готов платить, для любой более менее серьезной компании у которой простой приносит много денег
kirill.mokevnin [9:49 PM]
это жизненно важно
kirill.mokevnin [9:50 PM]
возьмите любой проект известный в россии
kirill.mokevnin [9:50 PM]
вы видели хоть раз чтобы они стопались?
sergey.ponomarev [9:50 PM]
да)
kirill.mokevnin [9:50 PM]
и появлялась надпись на весь экран “мы обновляемся"
kirill.mokevnin [9:50 PM]
ну скажите ведь это редко
kirill.mokevnin [9:50 PM]
и у серьезных ребят такого не бывает, типа яндекс фейсбук
kirill.mokevnin [9:50 PM]
букинг ком кстати
kirill.mokevnin [9:50 PM]
для них это вообще адовые деньги
kirill.mokevnin [9:50 PM]
гитхаб
kirill.mokevnin [9:50 PM]
а деплоят они десятки раз в день
kirill.mokevnin [9:50 PM]
независимо
kirill.mokevnin [9:50 PM]
в букинге 750 разработчиков
kirill.mokevnin [9:50 PM]
к слову
sergey.ponomarev [9:51 PM]
каждый может задеплоить?
kirill.mokevnin [9:51 PM]
они это и делают
kirill.mokevnin [9:51 PM]
при этом откатываются так же часто
kirill.mokevnin [9:51 PM]
но это часть плана
kirill.mokevnin [9:51 PM]
а не косяк
sergey.ponomarev [9:51 PM]
думается там всё таки куча сервисов
plugin73 [9:51 PM]
Да не сложно, но не привычно - на стейдже тыкалось все, а тут нельзя ничего менять)
kirill.mokevnin [9:51 PM]
важно что это другой вижн, а не просто частичная смена техпроцесса
kirill.mokevnin [9:53 PM]
окей, давайте этот вопрос про бизнес может отдельно потом обсудим, я надеюсь что чисто с технической точки зрения стало понятнее
kirill.mokevnin [9:53 PM]
ребят, еще немного есть времени поотвечать на вопросы, может что то дополнительно подсказать
kirill.mokevnin [9:53 PM]
м?
kirill.mokevnin [9:54 PM]
а по поводу переименования колонок, на европейской конфе был смешной случай
sergey.ponomarev [9:54 PM]
можешь саммори по дискуссии в пару предложений?
:+1:2
jastkand [9:54 PM]
Нужно обязательно отметить, что это нужно только тогда, когда простои неприемлемы. В более простых случаях городить огород из расширения вширь не стоит.
kirill.mokevnin [9:54 PM]
там ребята из какой то мега порно сети рассказывали прикол, у них сначала были одни лесбиянки и они назвали соответственно таблицу, потом появились геи и они добавили туда поле sex
kirill.mokevnin [9:54 PM]
ибо нельзя переименовывать
kirill.mokevnin [9:54 PM]
вот так и живут
alexeyfrank [9:55 PM]
кстати порносети отличный пример хайлоада :smile:
kirill.mokevnin [9:56 PM]
саммари: “пишите код во имя добра” :simple_smile:
kirill.mokevnin [9:56 PM]
главное что теперь вы знаете и можете принимать более осмысленные и взвешенные решения
kirill.mokevnin [9:56 PM]
когда что и как
kirill.mokevnin [9:56 PM]
а вот если не знать, тогда можно такого ахтунга накрутить
plugin73 [9:56 PM]
саммари - не называйте таблицу лесбиянки.
:laughing:2
kirill.mokevnin [9:58 PM]
ну и еще одно, тут хорошо видно что проблема опять в стейте
teddyp1cker [9:58 PM]
хм а в каких субд лок на всю таблицу вешается при добавлении значения в столбец с ограничениями ?
alexander.a [9:58 PM]
Такая ситуация, есть продукт который используется несколькими заказчиками. Стоит на их серверах. Время от времени кто то из заказчиков хочет какую либо фичу, причем другому заказчику она не очень то и нужна. Как в такой ситуации лучше организовать процесс разработки, чтобы небыло кучи версий для каждого заказчика и в коде небыло огромного количества проверок включена фича или нет.
kirill.mokevnin [9:58 PM]
я не думаю что лок на всю таблицу, я думаю что там постраничный лок, но честно давно уже не копал
teddyp1cker [9:58 PM]
разве не должен быть лок на запись ?
kirill.mokevnin [9:59 PM]
в таких случаях нет, вообще там все хитро
kirill.mokevnin [9:59 PM]
часто лочится не только сама строчка
kirill.mokevnin [9:59 PM]
но я реально сейчас отстал от жизни и подзабыл, врать не буду, главное что все не так просто у вас еще могут быть индексы их тоже надо обновлять
kirill.mokevnin [9:59 PM]
там можно зацепить серьезно
teddyp1cker [9:59 PM]
просто работал с таблицами в оракле 11+ на 10+ миллионов записей и не видел никаких жутких локов
teddyp1cker [10:00 PM]
с дефолтовыми значениями
kirill.mokevnin [10:00 PM]
ну это не 100 200 миллионов и тут же от интенсивности зависит
kirill.mokevnin [10:00 PM]
10 миллионов это ни о чем
kirill.mokevnin [10:00 PM]
особенно если таблица не горячая
teddyp1cker [10:01 PM]
ну там она хитрая - всмысле у нее очень нудобная статистика которая ломала немножко cbo
sergey.ponomarev [10:01 PM]
@alexander.a: правильно организованная модульность и их динамическая подгрузка
kirill.mokevnin [10:02 PM]
о кстати
kirill.mokevnin [10:02 PM]
вот многие девелоперы жалуются особенно в рельсах
kirill.mokevnin [10:03 PM]
когда делают разные фичи в разных бранчах и в них же переименовывают таблицы удаляют колонки, особенно когда рефакторинг
kirill.mokevnin [10:03 PM]
а потом жалуются что “блин невозможно переключиться проверить"
kirill.mokevnin [10:03 PM]
“этов се ломает"
kirill.mokevnin [10:03 PM]
проблема не в том как процесс организовать, это так же как ооп, создали проблему и вокруг навешиваем костыли для решения
kirill.mokevnin [10:03 PM]
а в том что надо убрать фундаментальную причину
kirill.mokevnin [10:03 PM]
изменяемость базы
kirill.mokevnin [10:03 PM]
соотвественно эта техника полезна в больших командах сама по себе
teddyp1cker [10:04 PM]
названия колонок это явно конфигурация же
kirill.mokevnin [10:04 PM]
плюс дает доп плюшки
sergey.ponomarev [10:04 PM]
а касательной рельсов в итоге какой рецепт?)
teddyp1cker [10:04 PM]
странно что в разных ветках для одной (?) базы она разная
kirill.mokevnin [10:04 PM]
а какая разница о чем идет речь?
kirill.mokevnin [10:04 PM]
ну так рефакторинг
kirill.mokevnin [10:04 PM]
кто нибудь удаляет способ работы с чем нибудь
kirill.mokevnin [10:04 PM]
или меняет связь один к одному на один ко многим
kirill.mokevnin [10:04 PM]
раньше у пользователя была одна компания теперь можно много
kirill.mokevnin [10:04 PM]
это же сплошь и рядом каждый день
kirill.mokevnin [10:05 PM]
если у вас интеснивная разработка
kirill.mokevnin [10:05 PM]
особенно стартап
kirill.mokevnin [10:05 PM]
тут один рецепт, добавляйте свое старое не трогайте
kirill.mokevnin [10:05 PM]
если вы так не хотите, то проблема никуда не денется, вы ее просто на другой уровень передвините
sergey.ponomarev [10:06 PM]
ну там другая проблема даже с добавлением
sergey.ponomarev [10:06 PM]
это создаёт проблемы со схемой даже при таком подходе при переключении между ветками (edited)
sergey.ponomarev [10:06 PM]
и кроме reset-migrate-seed
kirill.mokevnin [10:06 PM]
я могу сказать только вот что, мы работаем по такой схеме давно и очень успешно
sergey.ponomarev [10:06 PM]
пока не вижу ничего красивее
kirill.mokevnin [10:06 PM]
и назад не пойдем
kirill.mokevnin [10:07 PM]
и при этом решаем просто кучу проблем на всех уровнях
kirill.mokevnin [10:07 PM]
начиная от разработки, заканчивая деплоями откатами и всем остальным
kirill.mokevnin [10:07 PM]
а дальше вопрос привычки, для нас это настолько просто и естественно, что мы будем это использовать даже в простых случаях (но может не тривиальных)
kirill.mokevnin [10:08 PM]
так же как и с тестами, мы пишем код через тесты всегда и везде
namreg [10:08 PM]
если каждый будет добавлять свое, не будет ли в итоге каша?
kirill.mokevnin [10:09 PM]
вопрос не в добавлять
kirill.mokevnin [10:09 PM]
а в удалять
kirill.mokevnin [10:09 PM]
надо просто не удалять старое
kirill.mokevnin [10:09 PM]
вы при любом раскладе будете добавлять
kirill.mokevnin [10:09 PM]
кроме перименования колонки, но это реально редкий и ненужный кейс чаще всего
kirill.mokevnin [10:09 PM]
была связь один к одному стала один ко многим
kirill.mokevnin [10:09 PM]
вы все равно добавите таблицу
kirill.mokevnin [10:10 PM]
просто не удаляйте внешний ключ company_id из таблички users
kirill.mokevnin [10:10 PM]
вот и совместимость
kirill.mokevnin [10:10 PM]
вы за ноль усилий получаете возможность девелопить без боли
kirill.mokevnin [10:10 PM]
и менеджерить деплой
namreg [10:12 PM]
а не будет путаницы для нового человека, который придет в проект?) он будет видеть, что есть company_id и отдельная таблица..
kirill.mokevnin [10:14 PM]
ну если для вас это окажется важнее всего того о чем я выше час писал, то пожалуйста)
plugin73 [10:15 PM]
все legacy довольно быстро видно, особых проблем ни разу не создавало :simple_smile:
а ну я еще не сказал же
kirill.mokevnin [10:18 PM]
все слышали такое модно словое непрерывная поставка
kirill.mokevnin [10:18 PM]
continuous delivery
kirill.mokevnin [10:18 PM]
вот мы сейчас об этом говорили
kirill.mokevnin [10:18 PM]
как организовать это
kirill.mokevnin [10:18 PM]
https://en.wikipedia.org/wiki/Continuous_delivery
а про дефолты вот что еще можно добавить, дефолтные значения это часть бизнес логики, а не часть структуры базы данных, они меняются вместе с кодом и зависят только от кода (не забываем что база растет только в ширь), и если вы используете дефолты то создаете себе проблемы на ровном месте
если у вас меняется только дефолт, то вместо простого обновления кода вам надо обновлять схему базы данных
kirill.mokevnin [10:36 PM]
со всеми возможными вытекающими
kirill.mokevnin [10:37 PM]
еще кстати по поводу обновления, лок у многих будет на всю базу из за транзакций
kirill.mokevnin [10:37 PM]
забыл совсем
kirill.mokevnin [10:37 PM]
ой всю таблицу
teddyp1cker [10:37 PM]
при добавлении нового столбца с дефолтным значением, база будет обновлятся для всех существующих записей <-- за это вот просто глах зацепился
kirill.mokevnin [10:37 PM]
ну так будет же
kirill.mokevnin [10:37 PM]
то есть это не на пустом месте, реально есть workarounds вокруг этого
kirill.mokevnin [10:38 PM]
как добавлять без лишних локов
kirill.mokevnin [10:38 PM]
возможно оракал супермега умный и делает все это сам красиво (как с удалением например)
kirill.mokevnin [10:38 PM]
но в постгресе и мускуле это не так
kirill.mokevnin [10:38 PM]
но в целом это другая проблематика
teddyp1cker [10:38 PM]
ну там точно есть оптимизации для случая когда нам надо добавить столбец с дефолтовыми значениями
teddyp1cker [10:39 PM]
и то как всегда null - особый случай)
kirill.mokevnin [10:39 PM]
вполне возможно
teddyp1cker [10:39 PM]
anyway можно тему закрыть :wink:
kirill.mokevnin [10:39 PM]
нулы кстати зло тоже :smile:, они никогда в индекс не добавляются
kirill.mokevnin [10:39 PM]
если у вас строковое представление, то лучше туда пустую строку записывать
kirill.mokevnin [10:39 PM]
чем нул
kirill.mokevnin [10:39 PM]
это так tips
на самом деле это же просто инструмент
kirill.mokevnin [10:43 PM]
если у вас есть база
kirill.mokevnin [10:43 PM]
вы понимаете что такое локи (а это прерогатива баз данных), что такое btree
kirill.mokevnin [10:43 PM]
и другие клевые штуки
kirill.mokevnin [10:43 PM]
то узнаете все что нужно в процессе работы
kirill.mokevnin [10:43 PM]
если у вас нет фундамента то увы
kirill.mokevnin [10:43 PM]
это может оказаться чрезвычайно сложным
kirill.mokevnin [10:44 PM]
уровни транзакций acid
kirill.mokevnin [10:44 PM]
это конечно надо знать
kirill.mokevnin [10:44 PM]
вот я уже какую неделю тут пытаюсь донести до всех главную мысль программирования (в моей интерпретации), что вся сложность вокруг стейта
teddyp1cker [10:44 PM]
а знание заковыристых и не очень (ну скажем почему в NOT IN не юзаются индексы на текстовые поля) штук ?
kirill.mokevnin [10:44 PM]
чего бы мы не касались
kirill.mokevnin [10:45 PM]
знание этой штуки позволяет смотреть на проблемы в корень
kirill.mokevnin [10:45 PM]
и понимать способы решения
kirill.mokevnin [10:45 PM]
не важно код это или база
kirill.mokevnin [10:45 PM]
без этого невозможно придумать докер придумать reactjs и другие клевые штуки
kirill.mokevnin [10:45 PM]
даже zero downtime deploy
kirill.mokevnin [10:46 PM]
а всякая специфика типа того что вы выше написали, ну это просто техника которая нарабатывается в процессе работы
kirill.mokevnin [10:46 PM]
хотя некоторые на собеседованиях спрашивают подобные вопросы, особенно в php, типа какие аргументы принимает вот эта стандартная функция?
kirill.mokevnin [10:46 PM]10:46
это тоже самое
kirill.mokevnin [10:46 PM]
я бы бежал от таких
teddyp1cker [10:47 PM]
ок, понял
kirill.mokevnin [10:47 PM]
вот все кто тут читает и участвует, у вас, ребят, работа от которой вы тащитесь она вам дает возможность роста и все в таком духе?
teddyp1cker [10:49 PM]
скорее нет чем да (последний проект)
teddyp1cker [10:49 PM]
ибо вот это вот все выше пришлось очень быстро впитать :wink:
alexander.a [10:49 PM]
кушать тоже надо что-то)
teddyp1cker [10:50 PM]
поэтому и спросил - а оно кому-то надо кроме ibs и кучи контор у которых оракл это большой черный ящик который варит им большую часть бизнес логики ?
kirill.mokevnin [10:51 PM]
надо, есть такие люди - dba
teddyp1cker [10:51 PM]
вот в мире где mongodb это хайп
teddyp1cker [10:52 PM]
они еще есть :?
kirill.mokevnin [10:57 PM]
я однажды участвовал в стартапе где вся логика была на процедурах в базе данных
teddyp1cker [10:58 PM]
о боже)
kirill.mokevnin [10:58 PM]
а ахритектором там был челвоек которого все php разработчики россии должны знать)
kirill.mokevnin [10:58 PM]
в лицо
kirill.mokevnin [10:58 PM]
дима котеров
kirill.mokevnin [10:58 PM]
который написал мой круг, денвер и книгу php5 в подлиннике, по которой учились почти все)
teddyp1cker [11:01 PM]
о значит все таки опыт пригодится
teddyp1cker [11:01 PM]
насчет утверждения - "если вы не знаете точно зачем вам нужна реляционная бд в вашем проекте - берите nosql-решение"
kirill.mokevnin [11:02 PM]
ага, можете загуглить статьи на тему “как мы выбрасывали монгу и впиливали postgresql"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment