Last active
May 31, 2021 11:10
-
-
Save v-kolesnikov/25395059f46c9d5fb44e to your computer and use it in GitHub Desktop.
почему дефолты в БД зло, Continuos Delivery
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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