Продолжим говорить об ACID
Раскроем буковку🔤 :
Атомарность гарантирует, что транзакция, состоящая из нескольких операций, выполняется как единая и неделимая единица работы: она либо полностью завершается успешно (фиксируется), либо полностью завершается неудачей (откатывается).
Если какая-либо часть транзакции завершается неудачей, вся транзакция откатывается, и база данных восстанавливается в том же состоянии, в котором она была до начала транзакции.
Как базы данных реализуют атомарность
Базы данных используют два ключевых механизма для обеспечения атомарности.
1️⃣ Журналы транзакций (журналы предварительной записи - Write-Ahead Logs, он же WAL)
Каждая операция записывается в журнал предварительной записи, прежде чем она будет применена к фактической таблице базы данных.
После того как запись WAL безопасно помещена на диск, база данных приступает к изменению страниц в памяти, содержащих строки для учетной записи A и учетной записи B.
Когда операции увенчаются успехом:
• База данных отмечает идентификатор транзакции 12345 как зафиксированный в журнале транзакций.
• Недавно обновленные балансы для A и B в конечном итоге будут сброшены из памяти в соответствующие файлы данных на диске.
❗️ Если база данных выходит из строя после записи в журнал, но до полного обновления файлов данных, WAL предоставляет способ восстановления:
• Контрольные точки (checkpoints) играют ключевую роль, поскольку определяют, с какого места в WAL начинается восстановление.
• СУБД сканирует WAL начиная с последней контрольной точки и воспроизводит все операции, которые были зафиксированы в журнале, но еще не записаны в файлы данных. Таким образом, база данных приводит свои данные в согласованное состояние (применяя все операции, которые были успешно закоммичены до сбоя).
✅ СУБД повторно применяет операции (например, UPDATE) , чтобы гарантировать правильность окончательных балансов в файлах данных.
❌ Если транзакция не была зафиксирована или была помечена как «выполняющаяся» на момент сбоя,то СУБД не применяет эти изменения.
2️⃣ Протоколы фиксации/отката
Базы данных предоставляют такие команды, как BEGIN TRANSACTION, COMMIT и ROLLBACK
Любые изменения, внесенные между BEGIN TRANSACTION и COMMIT
считаются «выполняемыми» и не будут применены окончательно, пока транзакция не будет успешно зафиксирована.
Если какой-либо шаг завершается неудачей или вы явно указываете ROLLBACK, все изменения с момента начала транзакции отменяются.
➖➖➖➖➖➖➖➖➖➖➖➖
Если интересна БАЗА, то ставим реакции😊 ⬇️
it пингвин | data engineer🐧
#Вопросы_с_собесов #архитектура #acid
Раскроем буковку
Атомарность гарантирует, что транзакция, состоящая из нескольких операций, выполняется как единая и неделимая единица работы: она либо полностью завершается успешно (фиксируется), либо полностью завершается неудачей (откатывается).
Если какая-либо часть транзакции завершается неудачей, вся транзакция откатывается, и база данных восстанавливается в том же состоянии, в котором она была до начала транзакции.
Как базы данных реализуют атомарность
Базы данных используют два ключевых механизма для обеспечения атомарности.
Каждая операция записывается в журнал предварительной записи, прежде чем она будет применена к фактической таблице базы данных.
После того как запись WAL безопасно помещена на диск, база данных приступает к изменению страниц в памяти, содержащих строки для учетной записи A и учетной записи B.
Когда операции увенчаются успехом:
• База данных отмечает идентификатор транзакции 12345 как зафиксированный в журнале транзакций.
• Недавно обновленные балансы для A и B в конечном итоге будут сброшены из памяти в соответствующие файлы данных на диске.
• Контрольные точки (checkpoints) играют ключевую роль, поскольку определяют, с какого места в WAL начинается восстановление.
• СУБД сканирует WAL начиная с последней контрольной точки и воспроизводит все операции, которые были зафиксированы в журнале, но еще не записаны в файлы данных. Таким образом, база данных приводит свои данные в согласованное состояние (применяя все операции, которые были успешно закоммичены до сбоя).
Базы данных предоставляют такие команды, как BEGIN TRANSACTION, COMMIT и ROLLBACK
Любые изменения, внесенные между BEGIN TRANSACTION и COMMIT
считаются «выполняемыми» и не будут применены окончательно, пока транзакция не будет успешно зафиксирована.
Если какой-либо шаг завершается неудачей или вы явно указываете ROLLBACK, все изменения с момента начала транзакции отменяются.
➖➖➖➖➖➖➖➖➖➖➖➖
Если интересна БАЗА, то ставим реакции
it пингвин | data engineer
#Вопросы_с_собесов #архитектура #acid
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥33 12❤9👍5 2
Forwarded from Дата-инженерские заметки
Недавно осознала, что каналу уже год — в связи с этим решила рассказать немного о себе.
Я — Айлин, дата-инженер из Альфа-Банка, ex Procter & Gamble. В IT пришла после учебы в сберовской Школе 21.
В этом канале делюсь вопросами с реальных собеседований на позицию дата-инженера, задачами с лайвкодинга и полезными материалами для подготовки. Посмотреть всё это можно по хештегам:
#de_собеседование
#de_тестовое_livecoding
#de_обсуждение
Также пишу про свою жизнь в корпоративном мире — пытаюсь не только выживать в нём, но и иногда выигрывать.
😘 : в личку часто прилетают вопросы обо мне, если таковые имеются, отвечу в комментариях💋
Я — Айлин, дата-инженер из Альфа-Банка, ex Procter & Gamble. В IT пришла после учебы в сберовской Школе 21.
В этом канале делюсь вопросами с реальных собеседований на позицию дата-инженера, задачами с лайвкодинга и полезными материалами для подготовки. Посмотреть всё это можно по хештегам:
#de_собеседование
#de_тестовое_livecoding
#de_обсуждение
Также пишу про свою жизнь в корпоративном мире — пытаюсь не только выживать в нём, но и иногда выигрывать.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🗿5👍2🤷♂1🔥1
Обзор собеседования
Должность: Разработчик DWH/ETL (Data Engineer)
Компания: Островок
Тип собеса: #тех_собес
Грейд: #Middle
Вилка: 250-300к
Краткий обзор собеседования:
Собес из предложки. У кого есть обзоры собесов, тоже делитесь, будем нарабатывать базу💅
it пингвин | data engineer🐧
Должность: Разработчик DWH/ETL (Data Engineer)
Компания: Островок
Тип собеса: #тех_собес
Грейд: #Middle
Вилка: 250-300к
Краткий обзор собеседования:
• Что такое инциндент у вас в компании?
• Как оптимизировать запрос?
• Виды физических джоинов?
• Всегда ли спилл на диск это плохо?
• Какие виды индексов бывают?
• Что такое кластерный индекс?
• Порядок указания полей при создании индекса?
• Хорошо или плохо булевые поля в индекс сувать?
• Премущества кластерного индекса?
• Разница между парцицированием и шардировапнием?
• Разница в скорости работа SELECT в строчных и колоночных СУБД?
• Если колоночная БД быстрее, то зачем тогда строчные?
• Что такое deadlock в блокировках?
Собес из предложки. У кого есть обзоры собесов, тоже делитесь, будем нарабатывать базу
it пингвин | data engineer
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍7 4🫡2❤1💅1 1
IT_One легенды
Проходил собес в Газпромбанк на синьорскую позицию разраб data lake. Говорили про мой опыт, хадуп, оптимизацию, разные инструменты и технологии,модели данных, запросики в уме строил.. Короче база.
Работать я там, конечно, не буду. Нужно ковырять древнюю SAS DI...
В общем, собес был изичный и я на все ответил четко. В конце мне сказали
Ахахахахх💀 🤣 А нахера я свое время тратил вообще, не понимаю🤡
Обожаю IT one❤️
Проходил собес в Газпромбанк на синьорскую позицию разраб data lake. Говорили про мой опыт, хадуп, оптимизацию, разные инструменты и технологии,модели данных, запросики в уме строил.. Короче база.
Работать я там, конечно, не буду. Нужно ковырять древнюю SAS DI...
В общем, собес был изичный и я на все ответил четко. В конце мне сказали
Все круто, ты нам подходишь, но на эту ставку нашли людей и их уже оформляют. Мы скажем, что если есть вариант лучше тебя взять, но скорее всего уже поздно.
Ахахахахх
Обожаю IT one
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣41😱10🔥3😭2💅2
Ответ от IT One
Я им назвал свои зп ожидания, они не смогли такое предложить:
я надеюсь hr-ка на меня не подписана 😁
они написали что вы в приоритете, другому кандидату оффер не успели сделать. я уточнила, можем делать вам оффер, очереди нет
уточнила, у нас не смогут предложить выше 300. Можем посмотреть другие вакансии тогда
я надеюсь hr-ка на меня не подписана 😁
😁18❤5👍3 2🔥1 1
Годовая подписка на Perplexity Pro
Pro-версия:
И для меня очень важный плюс - работает без ВПН!
Вообще подписка по классике стоит на $20/месяц.
Ко мне пришел добрый подписчик и рассказал как можно купить годовую подписку на Perplexity в десятки раз дешевле🤝
Об этом многие знают, но рассказываю таким же как и я работягам, которые слабо шарят за все эти ваши ИИ и ГПТ.
В общем, на plati.market можно купить годовую подписку за 400 - 1000 рублей (получается скидка >90%).
Это не реклама, я ни за что не отвечаю, принимайте решения сами. Может там где-то есть скам. Но я купил и оч доволен.
Нужна новая почта, которая не привязана к Perplexity.
Я купил подписку вот тут.
Perplexity Pro пока что пользуюсь около месяца. Другими LLM перестал пользоваться (но хочу еще cursor затестить).
В целом доволен, но не скажу, что вижу очень большую разницу с тем же DeepSeek. Удобно, что можно выбирать разные модельки под разные потребности. В последнее время пользуюсь Claude.
Можете написать свое мнение о PP или про вашу любимую ИИ-шку⬇️
it пингвин | data engineer 🐧
#полезная_инфа
Pro-версия:
Дает доступ к топовым языковым моделям:
• GPT-4.1 — для сложных задач и программирования
• Claude 4.0 Sonnet — для нюансированных языковых задач
• Gemini 2.5 Pro — Google's latest с продвинутыми возможностями рассуждений
• Sonar Large — собственная модель Perplexity на базе LlaMa 3.1 70B
• Reasoning Models — R1, o3, для сложного аналитического мышления
Технологические фишки
• Real-time поиск — получает актуальную информацию из интернета в режиме реального времени
• Генерация изображений
• Голосовой ввод
*и многое другое. Сами почитаете:)
И для меня очень важный плюс - работает без ВПН!
Вообще подписка по классике стоит на $20/месяц.
Ко мне пришел добрый подписчик и рассказал как можно купить годовую подписку на Perplexity в десятки раз дешевле
Об этом многие знают, но рассказываю таким же как и я работягам, которые слабо шарят за все эти ваши ИИ и ГПТ.
В общем, на plati.market можно купить годовую подписку за 400 - 1000 рублей (получается скидка >90%).
Это не реклама, я ни за что не отвечаю, принимайте решения сами. Может там где-то есть скам. Но я купил и оч доволен.
Нужна новая почта, которая не привязана к Perplexity.
Я купил подписку вот тут.
Perplexity Pro пока что пользуюсь около месяца. Другими LLM перестал пользоваться (но хочу еще cursor затестить).
В целом доволен, но не скажу, что вижу очень большую разницу с тем же DeepSeek. Удобно, что можно выбирать разные модельки под разные потребности. В последнее время пользуюсь Claude.
Можете написать свое мнение о PP или про вашу любимую ИИ-шку
it пингвин | data engineer 🐧
#полезная_инфа
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7🔥5 4 2👍1🤣1🫡1
Днем прошел первую секцию в Яндекс 😄
Созвонились с норм мужиком - просто порешали sql задачки и немного поговорили про архитектуру 🤝
Кстати, задачи мне прям понравились. Скоро выложу их.
Через пару часов пришел ответ:
Задачи на питоне давно не решал. Так что возможно устрою себе челлендж на этот месяц - каждый будний день решать алго задачку на литкоде🤔
Зачем мне этот Яндекс?
- чисто ради интереса (и контента само собой 😁)
Столько разговоров о них. Надо самому прочувствовать это experience 🥰
Еще слышал, что если раз прошел успешно секции sql/python, то результаты сохраняются и потом не надо будет проходить каждый раз эти этапы.
У кого был опыт взаимодействия Яндексоидами, как вам?)⬇️
Созвонились с норм мужиком - просто порешали sql задачки и немного поговорили про архитектуру 🤝
Кстати, задачи мне прям понравились. Скоро выложу их.
Через пару часов пришел ответ:
Cекция на скл пройдена оочень хорошо) приглашаю тебя на алгоритмы.
Слоты пока совсем далеко, почти через месяц..
Задачи на питоне давно не решал. Так что возможно устрою себе челлендж на этот месяц - каждый будний день решать алго задачку на литкоде
Зачем мне этот Яндекс?
- чисто ради интереса (и контента само собой 😁)
Столько разговоров о них. Надо самому прочувствовать это experience 🥰
Еще слышал, что если раз прошел успешно секции sql/python, то результаты сохраняются и потом не надо будет проходить каждый раз эти этапы.
У кого был опыт взаимодействия Яндексоидами, как вам?)
Please open Telegram to view this post
VIEW IN TELEGRAM
❤19🔥12👍4 4🗿3 1
Обзор собеседования
Должность: DWH разработчик
Компания: ГК Иннотех
Тип собеса: #тех_собес
Грейд: #Middle
Вилка: от 200к (думаю 270 можно выбить)
Краткий обзор собеседования:
Собес прошлогодний и был прям по самой базе, которую нужно обязательно знать.
У кого есть обзоры собесов (на аналитиков тоже интересно) - делитесь, делаем базу💅
it пингвин | data engineer 🐧
boost🥰
Должность: DWH разработчик
Компания: ГК Иннотех
Тип собеса: #тех_собес
Грейд: #Middle
Вилка: от 200к (думаю 270 можно выбить)
Краткий обзор собеседования:
• Операторы в airflow?
• Для чего нужны сенсоры?
• Есть несколько дагов, как их связать между собой?
• Что такое dwh, DataLake в чем отличия?
• Звезда, Снежинка, Data Vault что такое?
• Какие есть нормальные формы?
• Что такое первычный ключ?
• Что такое суррогатный ключ, на примере кредитного договора?
• Для чего нужны колоночные БД?
• Почему нам все не хранить в колоночных БД?
• Что такое исторические таблицы?
• Как формируются исторические таблицы (про типы SCD)
• Что знаешь инкрементальную загрузку?
• Что такое NULL, как с ними работать?
• 10 + NULL?
• Как джоинятся NULL?
• Виды JOIN?
• Зачем нужен HAVING?
• Как убрать дубли из таблицы?
• Что знаешь про индексы, для чего нужны?
• Что значит сбалнасированное дерево и как оно ускоряет поиск?
• Есть ли разница в каком порядке ставить атрибуты при создании индекса (многомерные индексы)
• Почему SELECT могут медлденно работать, если повесить кучу индексов?
• На что обращать внимание в плане запроса?
• Виды сканирования данных?
• Виды физических джоинов?
• Статистика связанная с индексами?
Задачка:
• Создать сипсок чисел от 1 из 9 по рекурссии
• Разбить на 5 групп (идея про остаток деления на 5)
• По каждой группе посчитать сумму чисел и нарастающий итог
Собес прошлогодний и был прям по самой базе, которую нужно обязательно знать.
У кого есть обзоры собесов (на аналитиков тоже интересно) - делитесь, делаем базу
it пингвин | data engineer 🐧
boost🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥21❤5🫡3👍1 1 1
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😱23😁7 3 2🔥1
Есть предложение по работе в большой банк , зп ~400к гросс
*предложение актуально, пока пост опубликован
*upd. На указанную вакансию отправил резюме кандидатов.
Если среди моих подписчиков есть опытные DE, которые ищут работу, пишите в лс, может помогу. Есть контакты hr.
Пишите в личку @it_pengwin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13 8 3❤2🫡2🔥1
Задачи Яндекса
Выкладываю первую часть задачек с собеса с Я:
====================================
1️⃣ Таблица table с 1 колонкой id
Значения в таблице:
Что вернет функция в запросе вида:
-- SELECT … FROM table
count(*)=
count(1)=
count(id)=
count('id')=
sum(id) OVER (ORDER BY id NULLS LAST) =
sum(id) OVER () =
===================================
2️⃣ Есть две таблицы DEBIT и CREDIT, содержащие транзакции о поступлениях (DEBIT) и расходах (CREDIT) на лицевых счетах, со следующей одинаковой структурой
Напишите SQL-запрос, возвращающий разность между поступлениями и расходами за каждый день по каждому лицевому
===================================
Как вам задачки? Тоже думали будет сложнее😅
Присылайте решения и задавайте вопросы⬇️
*На днях выложу вторую часть
it пингвин | data engineer 🐧
boost🥰
Выкладываю первую часть задачек с собеса с Я:
====================================
Значения в таблице:
2
3
4
5
NULL
NULL
Что вернет функция в запросе вида:
-- SELECT … FROM table
count(*)=
count(1)=
count(id)=
count('id')=
sum(id) OVER (ORDER BY id NULLS LAST) =
sum(id) OVER () =
===================================
ACC_ID | номер лицевого счета
DT | дата транзакции
AMNT | сумма транзакции (всегда положительная)
Напишите SQL-запрос, возвращающий разность между поступлениями и расходами за каждый день по каждому лицевому
===================================
Как вам задачки? Тоже думали будет сложнее
Присылайте решения и задавайте вопросы
*На днях выложу вторую часть
it пингвин | data engineer 🐧
boost🥰
Please open Telegram to view this post
VIEW IN TELEGRAM
❤12👍5💅4🔥2 2 1
Задачи Яндекса ч2
Продолжение задачек с собеса:
Рассмотрим таблицу sessions за 1 календарный день с тремя колонками:
Задача 1
Необходимо вывести данные, чтобы нарисовать распределение:сколько пользователей проводит на сайте Х часов
====================================
Задача 2
Вывести любых 100 пользователей, впервые зашедших на сайт в 5 часов
====================================
Задача 3
В какое время наибольшее число пользователей на сайте?
Если таких вариантов несколько, вывести все
====================================
Задача 4
В какое время наибольшее число изменений изменений параметра?
====================================
Задача 5
Написать запрос, который преобразует колонку value не в изменение параметра, а в актуальное значение параметра:
Если value не NULL, оставить значение без изменений. Иначе, заменить value на предыдущее по времени не NULL значение для этого пользователя.
Гарантируется, что для каждого id первое по времени значение value всегда не NULL
====================================
На самом деле не такой уж и простой собес был. За 1 час я немного рассказал о своем опыте, порешали первый пулл задачек, поговорили про SQL и DWH. И так как осталось время, то еще порешали задачки (и это только первый этап 😃)
Когда пишешь решение тебя сразу спрашивают какие-то тонкости по sql-ым конструкциям. Задачки не сложные, но нужно все быстро решать.
Интервьюер понравился, вообще не душный. Например, можно было условно сказать про обработку времени, но сам код не писать и обработку null-ов проговорить просто и переходить к след задачам.
Он как будто сам хотел, чтоб я все успешно решил. Вайб такой дружеский был.
Сказал, что у меня хороший результат и редко кто доходит до последней задачи и решает ее.
Советую последнюю задачку отработать.
Как вам задачки?🎮 ⬇️
it пингвин | data engineer🐧
Продолжение задачек с собеса:
Рассмотрим таблицу sessions за 1 календарный день с тремя колонками:
|| id | time | value ||
|| 1 | 1 | a ||
|| 1 | 2 | NULL ||
|| 1 | 3 | NULL ||
|| 1 | 4 | b ||
|| 1 | 5 | NULL ||
|| 2 | 1 | c ||
|| 2 | 2 | d ||
|| 2 | 3 | NULL ||
Задача 1
Необходимо вывести данные, чтобы нарисовать распределение:сколько пользователей проводит на сайте Х часов
====================================
Задача 2
Вывести любых 100 пользователей, впервые зашедших на сайт в 5 часов
====================================
Задача 3
В какое время наибольшее число пользователей на сайте?
Если таких вариантов несколько, вывести все
====================================
Задача 4
В какое время наибольшее число изменений изменений параметра?
====================================
Задача 5
Написать запрос, который преобразует колонку value не в изменение параметра, а в актуальное значение параметра:
Если value не NULL, оставить значение без изменений. Иначе, заменить value на предыдущее по времени не NULL значение для этого пользователя.
Гарантируется, что для каждого id первое по времени значение value всегда не NULL
====================================
На самом деле не такой уж и простой собес был. За 1 час я немного рассказал о своем опыте, порешали первый пулл задачек, поговорили про SQL и DWH. И так как осталось время, то еще порешали задачки (и это только первый этап 😃)
Когда пишешь решение тебя сразу спрашивают какие-то тонкости по sql-ым конструкциям. Задачки не сложные, но нужно все быстро решать.
Интервьюер понравился, вообще не душный. Например, можно было условно сказать про обработку времени, но сам код не писать и обработку null-ов проговорить просто и переходить к след задачам.
Он как будто сам хотел, чтоб я все успешно решил. Вайб такой дружеский был.
Сказал, что у меня хороший результат и редко кто доходит до последней задачи и решает ее.
Советую последнюю задачку отработать.
Как вам задачки?
it пингвин | data engineer
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10❤4👍2 2💅1 1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3❤2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
😱6❤4👍2
Задача "допустимые скобки"
Классическая задачка на скобки 🤩
Мне эта задачка как-то давно на собесе попалась. И недавно решал алгосы на neetcode и снова попалась эта задачка. Попробуйте решить, неплохая разминОчка.
Вот как по мне самое лаконичное и четенькое решение)
def isValid(s: str) -> bool:
stack = []
closeToOpen = {")": "(", "]": "[", "}": "{"}
for c in s:
if c in closeToOpen:
if stack and stack[-1] == closeToOpen[c]:
stack.pop()
else:
return False
else:
stack.append(c)
return True if not stack else False
print(isValid('([{}])'))
И вот второй вариант, но ресурсов больше жрет
def isValid( s: str) -> bool:
while '()' in s or '{}' in s or '[]' in s:
s = s.replace('()', '')
s = s.replace('{}', '')
s = s.replace('[]', '')
return s == ''
print(isValid('([{})]'))
Есть упрощенная вариация этой задачки - с одним видом скобочек, у нее решение будет полегче.
Стоит ли периодически постить задачки по питону?🤔 ⬇️
Сложные не хочется, так мало кто будет вникать 😁
it пингвин | data engineer🐧
Классическая задачка на скобки 🤩
Вам дана строка, s состоящая из следующих символов: '(', ')', '{', '}', '[' и ']'.
Входная строка s валиднаяя тогда и только тогда, когда:
• Каждая открывающаяся скобка закрывается закрывающейся скобкой того же типа.
• Открытые скобки закрываются в правильном порядке.
• Каждой закрывающейся скобке соответствует открывающая скобка того же типа.
Верните true если s это валидная (допустимая) строка, и false наоборот.
=======================================
Пример 1:
Input: s = "[]"
Output: true
Пример 2:
Input: s = "([{}])"
Output: true
Пример 3:
Input: s = "[(])"
Output: false
Пояснение: Скобки закрыты в неправильном порядке.
=======================================Мне эта задачка как-то давно на собесе попалась. И недавно решал алгосы на neetcode и снова попалась эта задачка. Попробуйте решить, неплохая разминОчка.
Вот как по мне самое лаконичное и четенькое решение)
def isValid(s: str) -> bool:
stack = []
closeToOpen = {")": "(", "]": "[", "}": "{"}
for c in s:
if c in closeToOpen:
if stack and stack[-1] == closeToOpen[c]:
stack.pop()
else:
return False
else:
stack.append(c)
return True if not stack else False
print(isValid('([{}])'))
И вот второй вариант, но ресурсов больше жрет
while '()' in s or '{}' in s or '[]' in s:
s = s.replace('()', '')
s = s.replace('{}', '')
s = s.replace('[]', '')
return s == ''
print(isValid('([{})]'))
Есть упрощенная вариация этой задачки - с одним видом скобочек, у нее решение будет полегче.
Стоит ли периодически постить задачки по питону?
Сложные не хочется, так мало кто будет вникать 😁
it пингвин | data engineer
Please open Telegram to view this post
VIEW IN TELEGRAM
👍39🔥8❤5 4💅2
Продолжаю серию постов про ACID
Раскроем буковку🔤 :
Consistency или согласованность (C) в контексте транзакций ACID гарантирует, что любая транзакция переведет базу данных из одного допустимого состояния в другое допустимое состояние, никогда не оставляя ее в поврежденном или «недопустимом» состоянии.
Это означает, что все ограничения целостности данных, такие как ограничения первичного ключа (отсутствие повторяющихся идентификаторов), ограничения внешнего ключа (связанные записи должны существовать в родительских таблицах) и проверочные ограничения (возраст не может быть отрицательным), удовлетворяются до и после транзакции.
Если транзакция попытается нарушить эти правила, она не будет зафиксирована, а база данных вернется в предыдущее состояние.
Пример:
В базе данных электронной коммерции есть две таблицы:
• products(со столбцами: product_id, stock_quantity и т.д.)
• orders(со столбцами: order_id, product_id, quantity и т.д.)
Ограничение : Вы не можете разместить заказ на товар, если quantity(кол-во в заказе) больше, чем указано stock_quantity(кол-во на складе) в таблице products - CHECK (stock_quantity >= 0) или через триггер.
Транзакция:
Если у товара stock_quantity было 8 (меньше, чем то, что мы пытаемся заказать), то СУБД видит, что новое значение будет -2, что нарушает правило согласованности (оно не должно быть отрицательным).
Транзакция завершается неудачей и инициируется откат.
Еще пример:
Например, пользователь в системе заполняет карточку: ФИО, Дата рождения, ИНН, Телефон(отдельно код страны, города и номер), Адрес(тоже разбит на несколько полей).
В базе данных у нас есть несколько таблиц: client, phone, address
Так что когда пользователь заполнил форму и нажал «сохранить», система отправляет в базу данных 3 запроса:
Можно отправить 3 разных запроса, но лучше сделать одну транзакцию, внутри которой будут эти 3 запроса.
Атомарность гарантирует, что не получится такого, что адрес с телефоном сохранились, а сам клиент — нет. Это сделало бы базу неконсистентной, ведь у нас бы появились атрибуты, «висящие в воздухе», никому не принадлежащие. Что, в свою очередь, приведет к ошибкам в системе.
❗️ Важный момент. За консистентностью должен следить разработчик. Ведь это вопрос скорее бизнес-логики, чем технологий. Разработчик знает, что:
✅ если есть телефон в таблице phone, то он должен ссылаться на таблицу client
База об этом не знает ничего, если ей не рассказать. И она легко пропустит запрос «добавь в базу телефон без ссылки на клиента», если сам по себе запрос корректный, а разработчик не повесил на таблицу foreign key.
Разработчик пишет код, пошагово переводящий БД в нужное согласованное состояние и, если где-то посередине возникает ошибка,то откатывает всю транзакцию.
Как реализовать согласованность:
1. Ограничения схемы базы данных
➖ Ограничения NOT NULL , UNIQUE , PRIMARY KEY , FOREIGN KEY , CHECK и другие определения схемы гарантируют, что недопустимые записи не допускаются.
2. Триггеры и хранимые процедуры
➖ Триггеры могут автоматически проверять дополнительные правила при каждой вставке, обновлении или удалении строк.
➖ Хранимая процедура может содержать логику для проверки данных перед их фиксацией.
3. Защитные меры на уровне приложений
➖ В то время как база данных обеспечивает соблюдение ограничений на более низком уровне, приложения часто добавляют дополнительные проверки, например, обеспечивают соблюдение бизнес-правил или проверяют данные еще до того, как они попадут на уровень базы данных.
➖➖➖➖➖➖➖➖➖➖➖➖
Согласованность тесно связана с уровнями изоляции транзакций, о чем расскажу дальше..
it пингвин | data engineer🐧
#Вопросы_с_собесов #архитектура #acid
Раскроем буковку
Consistency или согласованность (C) в контексте транзакций ACID гарантирует, что любая транзакция переведет базу данных из одного допустимого состояния в другое допустимое состояние, никогда не оставляя ее в поврежденном или «недопустимом» состоянии.
Это означает, что все ограничения целостности данных, такие как ограничения первичного ключа (отсутствие повторяющихся идентификаторов), ограничения внешнего ключа (связанные записи должны существовать в родительских таблицах) и проверочные ограничения (возраст не может быть отрицательным), удовлетворяются до и после транзакции.
Если транзакция попытается нарушить эти правила, она не будет зафиксирована, а база данных вернется в предыдущее состояние.
Пример:
В базе данных электронной коммерции есть две таблицы:
• products(со столбцами: product_id, stock_quantity и т.д.)
• orders(со столбцами: order_id, product_id, quantity и т.д.)
Ограничение : Вы не можете разместить заказ на товар, если quantity(кол-во в заказе) больше, чем указано stock_quantity(кол-во на складе) в таблице products - CHECK (stock_quantity >= 0) или через триггер.
Транзакция:
BEGIN TRANSACTION;
INSERT INTO orders (product_id, quantity)
VALUES (101, 10);
-- Next, try to decrement stock from the products table
UPDATE products
SET stock_quantity = stock_quantity - 10
WHERE product_id = 101;
-- Check constraint: If 'stock_quantity' goes below 0, this violates the rule.
COMMIT;
Если у товара stock_quantity было 8 (меньше, чем то, что мы пытаемся заказать), то СУБД видит, что новое значение будет -2, что нарушает правило согласованности (оно не должно быть отрицательным).
Транзакция завершается неудачей и инициируется откат.
Еще пример:
Например, пользователь в системе заполняет карточку: ФИО, Дата рождения, ИНН, Телефон(отдельно код страны, города и номер), Адрес(тоже разбит на несколько полей).
В базе данных у нас есть несколько таблиц: client, phone, address
Так что когда пользователь заполнил форму и нажал «сохранить», система отправляет в базу данных 3 запроса:
insert into client… -- вставить в таблицу клиентов такие-то данные
insert into phone…
insert into address…
Можно отправить 3 разных запроса, но лучше сделать одну транзакцию, внутри которой будут эти 3 запроса.
Атомарность гарантирует, что не получится такого, что адрес с телефоном сохранились, а сам клиент — нет. Это сделало бы базу неконсистентной, ведь у нас бы появились атрибуты, «висящие в воздухе», никому не принадлежащие. Что, в свою очередь, приведет к ошибкам в системе.
База об этом не знает ничего, если ей не рассказать. И она легко пропустит запрос «добавь в базу телефон без ссылки на клиента», если сам по себе запрос корректный, а разработчик не повесил на таблицу foreign key.
Разработчик пишет код, пошагово переводящий БД в нужное согласованное состояние и, если где-то посередине возникает ошибка,то откатывает всю транзакцию.
Как реализовать согласованность:
1. Ограничения схемы базы данных
2. Триггеры и хранимые процедуры
3. Защитные меры на уровне приложений
➖➖➖➖➖➖➖➖➖➖➖➖
Согласованность тесно связана с уровнями изоляции транзакций, о чем расскажу дальше..
it пингвин | data engineer
#Вопросы_с_собесов #архитектура #acid
Please open Telegram to view this post
VIEW IN TELEGRAM
❤17👍11🔥5🫡1🗿1 1 1
Талант или дисциплина
Я все-таки хочу напомнить про базовую базу..
Дисциплина и упорство сильнее таланта. Человек с супер талантом в школе, в универе, из-за своей лени, боязни принимать серьезные решения или маленьких амбиций может его не реализовать. Если это осознанный выбор, просто наслаждаться жизнью - то это збс, такое не осуждаем.
И, наоборот, обычный работяга со средним талантом, но с высоким упорством, за счет большего числа попыток и системной работы, способен добиться значительно большего.
Гениями, которые меняют мир, становятся когда есть и талант, и дисциплина и удача.
В айти тоже самое. Есть куча талантливых программистов, которые пишут на ассемблере с 5 лет и каждый год участвуют в олимпиадах. Я на работе часто таких встречаю.
Объективно чел гораздо сильнее меня - шарит за алгосы, архитектуру, как работает память, сети, знает несколько языков программирования, делает кучу крутых пет проектов. И все это ему дается легко. Например, он просто быстрее читает документацию, статьи и сразу усваивает информацию.
Но во-первых он особо не парится из-за карьеры и во-вторых на этих должностях высокие навыки могут быть избыточны. Закрывать базовые задачи в дате объективно не сложно.
Он мог бы пойти дальше, но ему это не надо. А мне надо 😃 Поэтому смотрю всегда чуть выше. Думаю чего хочу добиться и строю план.
Так что, друзья, работаем✊
#МыслиВслух
Я все-таки хочу напомнить про базовую базу..
Дисциплина и упорство сильнее таланта. Человек с супер талантом в школе, в универе, из-за своей лени, боязни принимать серьезные решения или маленьких амбиций может его не реализовать. Если это осознанный выбор, просто наслаждаться жизнью - то это збс, такое не осуждаем.
И, наоборот, обычный работяга со средним талантом, но с высоким упорством, за счет большего числа попыток и системной работы, способен добиться значительно большего.
Гениями, которые меняют мир, становятся когда есть и талант, и дисциплина и удача.
В айти тоже самое. Есть куча талантливых программистов, которые пишут на ассемблере с 5 лет и каждый год участвуют в олимпиадах. Я на работе часто таких встречаю.
Объективно чел гораздо сильнее меня - шарит за алгосы, архитектуру, как работает память, сети, знает несколько языков программирования, делает кучу крутых пет проектов. И все это ему дается легко. Например, он просто быстрее читает документацию, статьи и сразу усваивает информацию.
Но во-первых он особо не парится из-за карьеры и во-вторых на этих должностях высокие навыки могут быть избыточны. Закрывать базовые задачи в дате объективно не сложно.
Он мог бы пойти дальше, но ему это не надо. А мне надо 😃 Поэтому смотрю всегда чуть выше. Думаю чего хочу добиться и строю план.
Так что, друзья, работаем
#МыслиВслух
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥47❤19👍10 5💅2🗿1