Skip to content

Instantly share code, notes, and snippets.

@fey
Forked from v-kolesnikov/hexlet.slack.log
Created May 31, 2021 11:10
Show Gist options
  • Save fey/edcbaffb147c8568dafced752917eb03 to your computer and use it in GitHub Desktop.
Save fey/edcbaffb147c8568dafced752917eb03 to your computer and use it in GitHub Desktop.

Revisions

  1. @namreg namreg revised this gist Aug 13, 2015. 1 changed file with 1217 additions and 1 deletion.
    1,218 changes: 1,217 additions & 1 deletion hexlet.slack.log
    Original file line number Diff line number Diff line change
    @@ -1 +1,1217 @@
    fd
    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"

  2. @namreg namreg created this gist Aug 13, 2015.
    1 change: 1 addition & 0 deletions hexlet.slack.log
    Original file line number Diff line number Diff line change
    @@ -0,0 +1 @@
    fd