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"