🤔 В чем заключается отличие между MVC и MVVM?
Обе архитектурные схемы применяются для разделения обязанностей и улучшения структуры кода в приложениях. Несмотря на общие цели, они различаются по способам организации кода и взаимодействия компонентов.
🚩 MVC (Model-View-Controller)
🟠 Model (Модель)
Отвечает за данные и бизнес-логику. Модель занимается получением данных из базы, обработкой этих данных и отправкой обновлений в представление через контроллер.
🟠 View (Представление)
Отображает данные пользователю. Представление отвечает за визуализацию информации, полученной от модели, и обновляет интерфейс при изменениях данных.
🟠 Controller (Контроллер)
Обрабатывает пользовательские действия и взаимодействует с моделью и представлением. Контроллер принимает ввод пользователя, проверяет данные, обновляет модель и выбирает нужное представление для отображения.
Пользователь взаимодействует с представлением, например, нажимает кнопку.
Контроллер обрабатывает событие и изменяет данные в модели.
Модель уведомляет представление об изменениях.
Представление обновляет отображаемую информацию.
🚩 MVVM (Model-View-ViewModel)
🟠 Model (Модель)
Так же, как и в MVC, отвечает за данные и бизнес-логику, не изменяется.
🟠 View (Представление)
Отвечает за отображение данных. В отличие от MVC, представление связывается с ViewModel, а не с контроллером.
🟠 ViewModel (Модель представления)
Является посредником между моделью и представлением. ViewModel содержит логику отображения и команды для представления. Он преобразует данные модели в удобный для отображения вид и наоборот. Часто использует механизмы двусторонней привязки данных для автоматического обновления интерфейса.
Представление связано с ViewModel через привязку данных.
Пользователь взаимодействует с представлением, например, вводит текст.
ViewModel обновляет модель.
Модель уведомляет ViewModel об изменениях.
ViewModel автоматически обновляет представление через привязку данных.
🚩 Основные отличия
🟠 Связывание данных
В MVVM применяется двусторонняя привязка данных между представлением и ViewModel, что облегчает автоматическое обновление интерфейса. В MVC такого механизма нет, обновление представления происходит через контроллер.
🟠 Посредник
В MVC роль посредника между моделью и представлением выполняет контроллер. В MVVM эту функцию берет на себя ViewModel, который тесно связан с представлением посредством привязки данных.
🟠 Упрощение логики интерфейса
MVVM подходит для сложных пользовательских интерфейсов, так как позволяет вынести логику отображения в ViewModel, делая код представления более чистым и простым. В MVC логика может оставаться в представлении или контроллере, что иногда усложняет структуру.
🟠 Технологическая направленность
MVVM часто применяется в приложениях с активным использованием привязки данных, например, в WPF, Xamarin, Angular. MVC более универсален и часто используется в веб-приложениях, например, ASP.NET MVC.
Ставь 👍 и 📚
@backendquiz
Обе архитектурные схемы применяются для разделения обязанностей и улучшения структуры кода в приложениях. Несмотря на общие цели, они различаются по способам организации кода и взаимодействия компонентов.
🚩 MVC (Model-View-Controller)
🟠 Model (Модель)
Отвечает за данные и бизнес-логику. Модель занимается получением данных из базы, обработкой этих данных и отправкой обновлений в представление через контроллер.
🟠 View (Представление)
Отображает данные пользователю. Представление отвечает за визуализацию информации, полученной от модели, и обновляет интерфейс при изменениях данных.
🟠 Controller (Контроллер)
Обрабатывает пользовательские действия и взаимодействует с моделью и представлением. Контроллер принимает ввод пользователя, проверяет данные, обновляет модель и выбирает нужное представление для отображения.
Пользователь взаимодействует с представлением, например, нажимает кнопку.
Контроллер обрабатывает событие и изменяет данные в модели.
Модель уведомляет представление об изменениях.
Представление обновляет отображаемую информацию.
🚩 MVVM (Model-View-ViewModel)
🟠 Model (Модель)
Так же, как и в MVC, отвечает за данные и бизнес-логику, не изменяется.
🟠 View (Представление)
Отвечает за отображение данных. В отличие от MVC, представление связывается с ViewModel, а не с контроллером.
🟠 ViewModel (Модель представления)
Является посредником между моделью и представлением. ViewModel содержит логику отображения и команды для представления. Он преобразует данные модели в удобный для отображения вид и наоборот. Часто использует механизмы двусторонней привязки данных для автоматического обновления интерфейса.
Представление связано с ViewModel через привязку данных.
Пользователь взаимодействует с представлением, например, вводит текст.
ViewModel обновляет модель.
Модель уведомляет ViewModel об изменениях.
ViewModel автоматически обновляет представление через привязку данных.
🚩 Основные отличия
🟠 Связывание данных
В MVVM применяется двусторонняя привязка данных между представлением и ViewModel, что облегчает автоматическое обновление интерфейса. В MVC такого механизма нет, обновление представления происходит через контроллер.
🟠 Посредник
В MVC роль посредника между моделью и представлением выполняет контроллер. В MVVM эту функцию берет на себя ViewModel, который тесно связан с представлением посредством привязки данных.
🟠 Упрощение логики интерфейса
MVVM подходит для сложных пользовательских интерфейсов, так как позволяет вынести логику отображения в ViewModel, делая код представления более чистым и простым. В MVC логика может оставаться в представлении или контроллере, что иногда усложняет структуру.
🟠 Технологическая направленность
MVVM часто применяется в приложениях с активным использованием привязки данных, например, в WPF, Xamarin, Angular. MVC более универсален и часто используется в веб-приложениях, например, ASP.NET MVC.
Ставь 👍 и 📚
@backendquiz
🤔 В чем заключается отличие между Scrum и Kanban?
Оба этих метода широко применяются для управления проектами и процессами в Agile-разработке. Они помогают командам повысить эффективность и организованность работы, но основываются на разных принципах и подходах. Ниже приведены ключевые отличия между Scrum и Kanban:
🚩Scrum
🟠Структура
Работа организована в фиксированные временные периоды, называемые спринтами, которые обычно длятся от 2 до 4 недель.
В Scrum существуют определённые роли: Scrum-мастер, Product Owner и команда разработчиков.
🟠Процессы и встречи
Перед каждым спринтом проводится планирование, на котором команда решает, какие задачи будут выполнены.
Каждый день проходят короткие встречи (Stand-ups), где обсуждают текущий прогресс, препятствия и планы на день.
В конце спринта проводится ретроспектива, на которой команда анализирует удачные моменты, выявляет возможные улучшения и разрабатывает план действий.
🟠Артефакты
Product Backlog — это список всех задач и требований к продукту.
Sprint Backlog — список задач, выбранных для выполнения в текущем спринте.
Burn-down Chart — график, демонстрирующий оставшийся объём работы в спринте.
🟠Изменения в ходе спринта
После начала спринта изменения в задачах не допускаются. Все задачи должны быть определены до его начала.
🚩Kanban
🟠Структура
Kanban предполагает непрерывный поток работы без фиксированных временных рамок или спринтов.
Роли в Kanban не жёстко регламентированы, команда может включать любые необходимые роли.
🟠Процессы и встречи
Для визуализации процесса используется доска с колонками, например, «To Do», «In Progress», «Done».
Устанавливаются лимиты на количество задач, находящихся одновременно в определённых колонках (WIP), чтобы избежать перегрузки и улучшить поток работы.
🟠Артефакты
Kanban-доска — основной инструмент для отслеживания и визуализации работы.
Карточки задач отражают отдельные задачи на доске.
🟠Изменения в ходе работы
Изменения могут вноситься в любое время. Задачи могут добавляться, изменяться или удаляться по мере необходимости.
Ставь 👍 и 📚
@backendquiz
Оба этих метода широко применяются для управления проектами и процессами в Agile-разработке. Они помогают командам повысить эффективность и организованность работы, но основываются на разных принципах и подходах. Ниже приведены ключевые отличия между Scrum и Kanban:
🚩Scrum
🟠Структура
Работа организована в фиксированные временные периоды, называемые спринтами, которые обычно длятся от 2 до 4 недель.
В Scrum существуют определённые роли: Scrum-мастер, Product Owner и команда разработчиков.
🟠Процессы и встречи
Перед каждым спринтом проводится планирование, на котором команда решает, какие задачи будут выполнены.
Каждый день проходят короткие встречи (Stand-ups), где обсуждают текущий прогресс, препятствия и планы на день.
В конце спринта проводится ретроспектива, на которой команда анализирует удачные моменты, выявляет возможные улучшения и разрабатывает план действий.
🟠Артефакты
Product Backlog — это список всех задач и требований к продукту.
Sprint Backlog — список задач, выбранных для выполнения в текущем спринте.
Burn-down Chart — график, демонстрирующий оставшийся объём работы в спринте.
🟠Изменения в ходе спринта
После начала спринта изменения в задачах не допускаются. Все задачи должны быть определены до его начала.
🚩Kanban
🟠Структура
Kanban предполагает непрерывный поток работы без фиксированных временных рамок или спринтов.
Роли в Kanban не жёстко регламентированы, команда может включать любые необходимые роли.
🟠Процессы и встречи
Для визуализации процесса используется доска с колонками, например, «To Do», «In Progress», «Done».
Устанавливаются лимиты на количество задач, находящихся одновременно в определённых колонках (WIP), чтобы избежать перегрузки и улучшить поток работы.
🟠Артефакты
Kanban-доска — основной инструмент для отслеживания и визуализации работы.
Карточки задач отражают отдельные задачи на доске.
🟠Изменения в ходе работы
Изменения могут вноситься в любое время. Задачи могут добавляться, изменяться или удаляться по мере необходимости.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 В чем основные отличия между SQLite и SQL Server Express?
Это два различных типа систем управления базами данных (СУБД), каждая из которых обладает своими особенностями, назначением и сферой применения.
🟠 Архитектура
SQLite
Это встроенная СУБД, представляющая собой библиотеку, которая интегрируется непосредственно в приложение. Для работы не нужен отдельный сервер.
Отсутствие сервера: SQLite функционирует без запуска отдельного серверного процесса, что облегчает установку и настройку.
Файловая система: Все данные сохраняются в одном файле базы данных на диске.
SQL Server Express
Это серверная СУБД — облегчённая версия Microsoft SQL Server, требующая установки и запуска серверного процесса.
Клиент-серверная модель: Клиенты подключаются к серверу базы данных через сеть.
Данные и логи хранятся отдельно, в разных файлах.
🟠 Производительность и масштабируемость
SQLite
Легковесная и быстрая, подходит для приложений с небольшими или средними объёмами данных и невысокими требованиями к одновременному доступу нескольких пользователей.
Поддержка нескольких пользователей ограничена, так как блокировки происходят на уровне файла.
SQL Server Express
Обеспечивает масштабируемость и подходит для приложений с высокими требованиями к производительности, поддерживая большое количество одновременных пользователей.
Поддерживает многопользовательский доступ и параллельное выполнение транзакций.
🟠 Функциональные возможности
SQLite
Поддерживает основные SQL-команды, такие как SELECT, INSERT, UPDATE, DELETE.
Не включает многие расширенные функции, например, триггеры, хранимые процедуры, сложные типы данных и транзакции, состоящие из нескольких команд.
SQL Server Express
Имеет расширенный функционал: поддерживает триггеры, хранимые процедуры, полнотекстовый поиск, транзакции и другие продвинутые возможности.
Имеются ограничения по сравнению с полной версией: максимальный размер базы данных — 10 ГБ, ограничение по использованию ресурсов — до 1 ГБ оперативной памяти и один процессор.
🟠 Установка и развертывание
SQLite
Очень проста в установке — достаточно подключить библиотеку к приложению.
Развёртывание лёгкое, поскольку база данных хранится в одном файле, который можно просто скопировать.
SQL Server Express
Требует установки серверной части с несколькими этапами настройки.
Необходимы определённые навыки администрирования для настройки безопасности, резервного копирования и восстановления данных.
🟠 Сферы применения
SQLite
Часто применяется в мобильных приложениях (например, Android и iOS) для локального хранения данных.
Подходит для встроенных систем и устройств Интернета вещей.
Удобен для быстрого прототипирования и тестирования.
SQL Server Express
Хорошо подходит для небольших веб-приложений и сервисов, особенно на платформе Windows.
Используется в настольных приложениях, которым нужна мощная база данных.
Широко применяется в образовательных целях для обучения работе с SQL Server.
Ставь 👍 и 📚
@backendquiz
Это два различных типа систем управления базами данных (СУБД), каждая из которых обладает своими особенностями, назначением и сферой применения.
🟠 Архитектура
SQLite
Это встроенная СУБД, представляющая собой библиотеку, которая интегрируется непосредственно в приложение. Для работы не нужен отдельный сервер.
Отсутствие сервера: SQLite функционирует без запуска отдельного серверного процесса, что облегчает установку и настройку.
Файловая система: Все данные сохраняются в одном файле базы данных на диске.
SQL Server Express
Это серверная СУБД — облегчённая версия Microsoft SQL Server, требующая установки и запуска серверного процесса.
Клиент-серверная модель: Клиенты подключаются к серверу базы данных через сеть.
Данные и логи хранятся отдельно, в разных файлах.
🟠 Производительность и масштабируемость
SQLite
Легковесная и быстрая, подходит для приложений с небольшими или средними объёмами данных и невысокими требованиями к одновременному доступу нескольких пользователей.
Поддержка нескольких пользователей ограничена, так как блокировки происходят на уровне файла.
SQL Server Express
Обеспечивает масштабируемость и подходит для приложений с высокими требованиями к производительности, поддерживая большое количество одновременных пользователей.
Поддерживает многопользовательский доступ и параллельное выполнение транзакций.
🟠 Функциональные возможности
SQLite
Поддерживает основные SQL-команды, такие как SELECT, INSERT, UPDATE, DELETE.
Не включает многие расширенные функции, например, триггеры, хранимые процедуры, сложные типы данных и транзакции, состоящие из нескольких команд.
SQL Server Express
Имеет расширенный функционал: поддерживает триггеры, хранимые процедуры, полнотекстовый поиск, транзакции и другие продвинутые возможности.
Имеются ограничения по сравнению с полной версией: максимальный размер базы данных — 10 ГБ, ограничение по использованию ресурсов — до 1 ГБ оперативной памяти и один процессор.
🟠 Установка и развертывание
SQLite
Очень проста в установке — достаточно подключить библиотеку к приложению.
Развёртывание лёгкое, поскольку база данных хранится в одном файле, который можно просто скопировать.
SQL Server Express
Требует установки серверной части с несколькими этапами настройки.
Необходимы определённые навыки администрирования для настройки безопасности, резервного копирования и восстановления данных.
🟠 Сферы применения
SQLite
Часто применяется в мобильных приложениях (например, Android и iOS) для локального хранения данных.
Подходит для встроенных систем и устройств Интернета вещей.
Удобен для быстрого прототипирования и тестирования.
SQL Server Express
Хорошо подходит для небольших веб-приложений и сервисов, особенно на платформе Windows.
Используется в настольных приложениях, которым нужна мощная база данных.
Широко применяется в образовательных целях для обучения работе с SQL Server.
Ставь 👍 и 📚
@backendquiz
🤔 Почему растёт интерес к функциональному программированию (FP)?
Интерес к функциональному программированию увеличивается из-за изменений в требованиях к созданию современных приложений, таких как необходимость масштабируемости, управления сложностью и обработки больших объёмов данных. Функциональное программирование предлагает преимущества, позволяющие эффективнее справляться с этими задачами.
🚩Основные причины увеличения интереса к FP
🟠Эффективная работа с многопоточностью и параллелизмом
Функциональное программирование делает упор на чистые функции, которые не вызывают побочных эффектов. Это облегчает разработку многопоточных программ, поскольку отпадает нужда в синхронизации общего состояния. Языки, такие как Scala, Clojure и Haskell, предлагают мощные инструменты для работы с параллелизмом и потоками данных, что особенно важно в эпоху многоядерных процессоров.
🟠Масштабируемость и контроль состояния
Современные распределённые системы требуют минимизации работы с изменяемым состоянием. FP с подходом к неизменяемым данным помогает избежать проблем, связанных с изменчивостью, таких как гонки данных или сложные состояния.
🟠Обработка больших данных
Фреймворки, например Apache Spark и Apache Flink, применяют концепции функционального программирования (такие как операции над коллекциями: map, filter, reduce) для работы с большими данными. Это делает FP особенно полезным для обработки потоков данных и анализа больших объёмов информации.
🟠Улучшение читаемости и предсказуемости кода
Код, написанный в функциональном стиле, легче анализировать и тестировать благодаря следующим принципам:
Чистые функции: результат зависит только от входных данных.
Неизменяемость данных: данные не изменяются после создания.
Декларативный стиль: акцент на том, что должно быть сделано, а не как.
🟠Распространение функциональных возможностей в императивных языках
Основные императивные языки программирования (Java, Python, JavaScript, C#) добавляют функциональные возможности, такие как лямбда-выражения, стримы и функции высшего порядка. Это делает функциональный стиль более доступным для широкого круга разработчиков.
🟠Повышение надёжности кода
Отсутствие побочных эффектов снижает количество ошибок. Код становится проще для тестирования, так как функции можно проверять по отдельности. Система типов в функциональных языках, например Haskell, обеспечивает большую безопасность, что уменьшает вероятность ошибок во время выполнения.
🟠Тенденция к модульности и повторному использованию кода
FP способствует созданию более модульного кода. Композиция функций позволяет легко создавать новые функциональности из уже существующих компонентов.
🟠Популярность в веб-разработке и мобильных приложениях
Языки, такие как Elm, ReasonML, а также фреймворки, например React (с концепцией функциональных компонентов), активно применяют принципы функционального программирования. Это помогает создавать приложения с минимальным количеством ошибок и высокой предсказуемостью поведения.
Ставь 👍 и 📚
@backendquiz
Интерес к функциональному программированию увеличивается из-за изменений в требованиях к созданию современных приложений, таких как необходимость масштабируемости, управления сложностью и обработки больших объёмов данных. Функциональное программирование предлагает преимущества, позволяющие эффективнее справляться с этими задачами.
🚩Основные причины увеличения интереса к FP
🟠Эффективная работа с многопоточностью и параллелизмом
Функциональное программирование делает упор на чистые функции, которые не вызывают побочных эффектов. Это облегчает разработку многопоточных программ, поскольку отпадает нужда в синхронизации общего состояния. Языки, такие как Scala, Clojure и Haskell, предлагают мощные инструменты для работы с параллелизмом и потоками данных, что особенно важно в эпоху многоядерных процессоров.
🟠Масштабируемость и контроль состояния
Современные распределённые системы требуют минимизации работы с изменяемым состоянием. FP с подходом к неизменяемым данным помогает избежать проблем, связанных с изменчивостью, таких как гонки данных или сложные состояния.
🟠Обработка больших данных
Фреймворки, например Apache Spark и Apache Flink, применяют концепции функционального программирования (такие как операции над коллекциями: map, filter, reduce) для работы с большими данными. Это делает FP особенно полезным для обработки потоков данных и анализа больших объёмов информации.
🟠Улучшение читаемости и предсказуемости кода
Код, написанный в функциональном стиле, легче анализировать и тестировать благодаря следующим принципам:
Чистые функции: результат зависит только от входных данных.
Неизменяемость данных: данные не изменяются после создания.
Декларативный стиль: акцент на том, что должно быть сделано, а не как.
🟠Распространение функциональных возможностей в императивных языках
Основные императивные языки программирования (Java, Python, JavaScript, C#) добавляют функциональные возможности, такие как лямбда-выражения, стримы и функции высшего порядка. Это делает функциональный стиль более доступным для широкого круга разработчиков.
🟠Повышение надёжности кода
Отсутствие побочных эффектов снижает количество ошибок. Код становится проще для тестирования, так как функции можно проверять по отдельности. Система типов в функциональных языках, например Haskell, обеспечивает большую безопасность, что уменьшает вероятность ошибок во время выполнения.
🟠Тенденция к модульности и повторному использованию кода
FP способствует созданию более модульного кода. Композиция функций позволяет легко создавать новые функциональности из уже существующих компонентов.
🟠Популярность в веб-разработке и мобильных приложениях
Языки, такие как Elm, ReasonML, а также фреймворки, например React (с концепцией функциональных компонентов), активно применяют принципы функционального программирования. Это помогает создавать приложения с минимальным количеством ошибок и высокой предсказуемостью поведения.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Что ты знаешь о нереляционных базах данных?
Это системы управления базами данных, которые не используют классическую реляционную модель. Такие базы созданы для работы с большими объемами информации, обеспечивая высокую скорость обработки запросов и гибкость в представлении данных.
🚩Основные виды нереляционных баз данных:
🟠Документные базы данных
Хранят данные в формате документов, например JSON, BSON или XML. К примеру, MongoDB и CouchDB. Они подходят для приложений, где структура данных может часто меняться и быть разнообразной.
🟠Колонковые базы данных
Сохраняют данные по столбцам, а не по строкам. Это позволяет эффективно обрабатывать большие объемы информации и выполнять аналитические запросы. Примеры: Apache Cassandra, HBase. Используются в аналитике, обработке больших данных, телекоммуникациях.
🟠Ключ-значение базы данных
Хранят данные в виде пар "ключ-значение". Очень просты и обеспечивают быструю работу. Примеры: Redis, Riak, DynamoDB. Обычно применяются для кеширования, управления сессиями пользователей и реализации простых хранилищ.
🟠Графовые базы данных
Представляют данные в виде графов с узлами, ребрами и их свойствами. Отлично подходят для отображения связей между данными. Например, Neo4j и OrientDB. Используются в социальных сетях, рекомендательных системах, управлении сетями.
🚩Преимущества
➕Гибкость в модели данных: Легко адаптируются к изменяющимся и разнообразным данным.
➕Масштабируемость: Хорошо расширяются как по горизонтали (добавляя серверы), так и по вертикали (увеличивая мощность серверов).
➕Высокая производительность: Эффективны для определённых типов операций и при работе с большими объемами данных.
➕Эффективность при обработке больших данных: Быстро реагируют на запросы и обрабатывают значительные объемы информации.
🚩Недостатки
➖Отсутствие единых стандартов: Разные системы могут иметь свои модели и интерфейсы, что усложняет переход между ними.
➖Ограниченная поддержка сложных запросов: Могут не предоставлять возможности сложных SQL-запросов и транзакций, привычных для реляционных баз.
➖Проблемы с консистентностью данных: Некоторые NoSQL базы жертвуют строгой согласованностью ради доступности и масштабируемости (согласно теореме CAP).
🚩Области применения:
🟠Социальные сети
Используют графовые базы для отображения связей между пользователями.
🟠Интернет-магазины
Применяют документные базы для хранения информации о товарах с разной структурой.
🟠Аналитические платформы
Используют колонковые базы для выполнения сложных аналитических запросов на больших данных.
🟠Кеширование
Ключ-значение базы применяются для быстрого доступа к часто используемым данным.
Ставь 👍 и 📚
@backendquiz
Это системы управления базами данных, которые не используют классическую реляционную модель. Такие базы созданы для работы с большими объемами информации, обеспечивая высокую скорость обработки запросов и гибкость в представлении данных.
🚩Основные виды нереляционных баз данных:
🟠Документные базы данных
Хранят данные в формате документов, например JSON, BSON или XML. К примеру, MongoDB и CouchDB. Они подходят для приложений, где структура данных может часто меняться и быть разнообразной.
🟠Колонковые базы данных
Сохраняют данные по столбцам, а не по строкам. Это позволяет эффективно обрабатывать большие объемы информации и выполнять аналитические запросы. Примеры: Apache Cassandra, HBase. Используются в аналитике, обработке больших данных, телекоммуникациях.
🟠Ключ-значение базы данных
Хранят данные в виде пар "ключ-значение". Очень просты и обеспечивают быструю работу. Примеры: Redis, Riak, DynamoDB. Обычно применяются для кеширования, управления сессиями пользователей и реализации простых хранилищ.
🟠Графовые базы данных
Представляют данные в виде графов с узлами, ребрами и их свойствами. Отлично подходят для отображения связей между данными. Например, Neo4j и OrientDB. Используются в социальных сетях, рекомендательных системах, управлении сетями.
🚩Преимущества
➕Гибкость в модели данных: Легко адаптируются к изменяющимся и разнообразным данным.
➕Масштабируемость: Хорошо расширяются как по горизонтали (добавляя серверы), так и по вертикали (увеличивая мощность серверов).
➕Высокая производительность: Эффективны для определённых типов операций и при работе с большими объемами данных.
➕Эффективность при обработке больших данных: Быстро реагируют на запросы и обрабатывают значительные объемы информации.
🚩Недостатки
➖Отсутствие единых стандартов: Разные системы могут иметь свои модели и интерфейсы, что усложняет переход между ними.
➖Ограниченная поддержка сложных запросов: Могут не предоставлять возможности сложных SQL-запросов и транзакций, привычных для реляционных баз.
➖Проблемы с консистентностью данных: Некоторые NoSQL базы жертвуют строгой согласованностью ради доступности и масштабируемости (согласно теореме CAP).
🚩Области применения:
🟠Социальные сети
Используют графовые базы для отображения связей между пользователями.
🟠Интернет-магазины
Применяют документные базы для хранения информации о товарах с разной структурой.
🟠Аналитические платформы
Используют колонковые базы для выполнения сложных аналитических запросов на больших данных.
🟠Кеширование
Ключ-значение базы применяются для быстрого доступа к часто используемым данным.
Ставь 👍 и 📚
@backendquiz
🎉1
🤔 Что характеризует хороший код?
Это код, который легко читать, понимать, поддерживать и развивать. Он эффективно выполняет поставленные задачи и соответствует требованиям качества, важным для конкретного проекта и команды.
🟠 Читаемость
Код должен быть понятен другим разработчикам, даже если они раньше не работали с этим проектом. Использование осмысленных имён для переменных, функций и классов, а также наличие ясных комментариев помогают быстрее разобраться в логике программы. Читаемый код снижает вероятность ошибок при поддержке и улучшении, облегчает проведение ревью и обучение новых членов команды.
🟠 Поддерживаемость
Код должен легко модифицироваться, чтобы можно было адаптировать его под новые требования или исправлять ошибки. Это достигается благодаря модульности, разделению логики и избеганию жёсткой связи между частями кода. Хорошая структура и стандартизация, такие как следование принципам SOLID или архитектурным шаблонам (например, MVC), делают код более надёжным.
🟠 Простота
Хороший код решает задачи максимально простым и прямолинейным способом. Такой код легче читать, тестировать и отлаживать. Он избегает ненужных усложнений и излишних абстракций, но при этом остаётся гибким. Принципы KISS (Keep It Simple, Stupid) и YAGNI (You Aren't Gonna Need It) помогают поддерживать простоту кода.
🟠 Эффективность
Код должен быть оптимальным для выполнения задачи без излишнего расхода ресурсов, таких как время выполнения и память. Хотя преждевременная оптимизация нежелательна, хороший код учитывает производительность и избегает очевидных узких мест. Знание алгоритмов и структур данных помогает писать эффективный и быстрый код.
🟠 Тестируемость
Хороший код легко покрыть модульными, интеграционными и системными тестами. Тестируемость обеспечивается благодаря слабой связности и высокой связанности, а также соблюдению принципов инверсии зависимостей. Код, который просто тестировать, позволяет быстрее находить и исправлять ошибки, повышая общую надёжность.
🟠 Гибкость и расширяемость
Хороший код легко адаптируется к изменяющимся требованиям. Новые функции можно добавить без серьёзных изменений в существующую логику. Это достигается за счёт слабой связности и высокой связанности, применения шаблонов проектирования и принципов SOLID.
🟠 Документированность
Хотя код должен быть самодокументируемым, иногда нужны комментарии и документация для объяснения сложной логики, архитектурных решений или деталей реализации. Хорошая документация помогает быстрее разобраться в коде и понять, как его использовать.
🟠 Соответствие стилю и стандартам
Код должен соответствовать общепринятым стандартам стиля, принятым в проекте или языке программирования. Это делает его единообразным и легко читаемым для других участников команды. Использование линтеров, форматтеров и соблюдение отраслевых стандартов (например, PEP8 для Python) помогает поддерживать единый стиль.
Ставь 👍 и 📚
@backendquiz
Это код, который легко читать, понимать, поддерживать и развивать. Он эффективно выполняет поставленные задачи и соответствует требованиям качества, важным для конкретного проекта и команды.
🟠 Читаемость
Код должен быть понятен другим разработчикам, даже если они раньше не работали с этим проектом. Использование осмысленных имён для переменных, функций и классов, а также наличие ясных комментариев помогают быстрее разобраться в логике программы. Читаемый код снижает вероятность ошибок при поддержке и улучшении, облегчает проведение ревью и обучение новых членов команды.
🟠 Поддерживаемость
Код должен легко модифицироваться, чтобы можно было адаптировать его под новые требования или исправлять ошибки. Это достигается благодаря модульности, разделению логики и избеганию жёсткой связи между частями кода. Хорошая структура и стандартизация, такие как следование принципам SOLID или архитектурным шаблонам (например, MVC), делают код более надёжным.
🟠 Простота
Хороший код решает задачи максимально простым и прямолинейным способом. Такой код легче читать, тестировать и отлаживать. Он избегает ненужных усложнений и излишних абстракций, но при этом остаётся гибким. Принципы KISS (Keep It Simple, Stupid) и YAGNI (You Aren't Gonna Need It) помогают поддерживать простоту кода.
🟠 Эффективность
Код должен быть оптимальным для выполнения задачи без излишнего расхода ресурсов, таких как время выполнения и память. Хотя преждевременная оптимизация нежелательна, хороший код учитывает производительность и избегает очевидных узких мест. Знание алгоритмов и структур данных помогает писать эффективный и быстрый код.
🟠 Тестируемость
Хороший код легко покрыть модульными, интеграционными и системными тестами. Тестируемость обеспечивается благодаря слабой связности и высокой связанности, а также соблюдению принципов инверсии зависимостей. Код, который просто тестировать, позволяет быстрее находить и исправлять ошибки, повышая общую надёжность.
🟠 Гибкость и расширяемость
Хороший код легко адаптируется к изменяющимся требованиям. Новые функции можно добавить без серьёзных изменений в существующую логику. Это достигается за счёт слабой связности и высокой связанности, применения шаблонов проектирования и принципов SOLID.
🟠 Документированность
Хотя код должен быть самодокументируемым, иногда нужны комментарии и документация для объяснения сложной логики, архитектурных решений или деталей реализации. Хорошая документация помогает быстрее разобраться в коде и понять, как его использовать.
🟠 Соответствие стилю и стандартам
Код должен соответствовать общепринятым стандартам стиля, принятым в проекте или языке программирования. Это делает его единообразным и легко читаемым для других участников команды. Использование линтеров, форматтеров и соблюдение отраслевых стандартов (например, PEP8 для Python) помогает поддерживать единый стиль.
Ставь 👍 и 📚
@backendquiz
🤔 Что такое git-flow?
Git-flow — это модель ветвления в Git, предложенная Винсентом Дриссеном, которая структурирует разработку, упрощает выпуск версий и поддерживает стабильность проекта.
🚩Основные компоненты git-flow
🟠Основные
master: Эта ветка содержит стабильные и готовые к выпуску версии продукта. Каждый коммит в master должен представлять собой релизную версию.
develop: Эта ветка используется для интеграции всех новых разработок. Она содержит последний готовый к выпуску код, но ещё может быть нестабильной.
🟠Поддерживающие
feature: Эти ветки создаются для разработки новых функций. Они ответвляются от develop и сливаются обратно в develop после завершения работы. Например, feature/новая-функция.
release: Эти ветки создаются для подготовки нового релиза. Они ответвляются от develop, и после завершения всех необходимых исправлений и тестирования сливаются в master и develop. Например release/1.0.0
hotfix: Эти ветки используются для срочных исправлений в стабильной версии продукта. Они ответвляются от master и после завершения работы сливаются в master и develop. Например, hotfix/исправление-ошибки.
🚩Как это используется:
🟠Создание новой функции:
Создайте ветку feature от develop.
Разработайте новую функцию.
Слейте feature ветку обратно в develop.
🟠Подготовка к новому релизу:
Создайте ветку release от develop.
Проведите финальное тестирование и внесите мелкие исправления.
Слейте release ветку в master и develop.
Создайте тег для новой версии на master.
🟠Срочные исправления:
Создайте ветку hotfix от master.
Исправьте проблему.
Слейте hotfix ветку в master и develop.
Создайте тег для новой версии на master.
🚩Плюсы
🟠Организация: Четкое разграничение между стабильной версией и текущей разработкой упрощает управление проектом.
🟠Параллельная разработка: Легкость создания и слияния веток способствует одновременной работе над несколькими функциями.
🟠Поддержка релизов: Обособленные ветки для подготовки релизов и срочных исправлений упрощают управление версионностью.
🚩Минусы:
🟠Сложность: Может быть избыточным для небольших проектов с небольшими командами.
🟠Требования к дисциплине: Требует строгого соблюдения правил для обеспечения стабильности и непрерывности разработки.
Ставь 👍 и 📚
@backendquiz
Git-flow — это модель ветвления в Git, предложенная Винсентом Дриссеном, которая структурирует разработку, упрощает выпуск версий и поддерживает стабильность проекта.
🚩Основные компоненты git-flow
🟠Основные
master: Эта ветка содержит стабильные и готовые к выпуску версии продукта. Каждый коммит в master должен представлять собой релизную версию.
develop: Эта ветка используется для интеграции всех новых разработок. Она содержит последний готовый к выпуску код, но ещё может быть нестабильной.
🟠Поддерживающие
feature: Эти ветки создаются для разработки новых функций. Они ответвляются от develop и сливаются обратно в develop после завершения работы. Например, feature/новая-функция.
release: Эти ветки создаются для подготовки нового релиза. Они ответвляются от develop, и после завершения всех необходимых исправлений и тестирования сливаются в master и develop. Например release/1.0.0
hotfix: Эти ветки используются для срочных исправлений в стабильной версии продукта. Они ответвляются от master и после завершения работы сливаются в master и develop. Например, hotfix/исправление-ошибки.
🚩Как это используется:
🟠Создание новой функции:
Создайте ветку feature от develop.
Разработайте новую функцию.
Слейте feature ветку обратно в develop.
🟠Подготовка к новому релизу:
Создайте ветку release от develop.
Проведите финальное тестирование и внесите мелкие исправления.
Слейте release ветку в master и develop.
Создайте тег для новой версии на master.
🟠Срочные исправления:
Создайте ветку hotfix от master.
Исправьте проблему.
Слейте hotfix ветку в master и develop.
Создайте тег для новой версии на master.
🚩Плюсы
🟠Организация: Четкое разграничение между стабильной версией и текущей разработкой упрощает управление проектом.
🟠Параллельная разработка: Легкость создания и слияния веток способствует одновременной работе над несколькими функциями.
🟠Поддержка релизов: Обособленные ветки для подготовки релизов и срочных исправлений упрощают управление версионностью.
🚩Минусы:
🟠Сложность: Может быть избыточным для небольших проектов с небольшими командами.
🟠Требования к дисциплине: Требует строгого соблюдения правил для обеспечения стабильности и непрерывности разработки.
Ставь 👍 и 📚
@backendquiz
🤔 Каким образом можно найти "медленный запрос" и проанализировать его в PostgreSQL?
🚩Методы и инструменты.
🟠Включение журналирования медленных запросов
Настройка параметров конфигурации PostgreSQL для журналирования медленных запросов позволяет отслеживать запросы, выполнение которых занимает много времени.
1⃣Откройте файл конфигурации PostgreSQL (postgresql.conf).
2⃣Настройте следующие параметры:
# Включить логирование всех запросов
log_statement = 'all'
# Либо логирование только медленных запросов
log_min_duration_statement = 1000 # Логировать запросы, выполнение которых заняло более 1000 мс (1 секунда)
3⃣Перезапустите сервер PostgreSQL для применения изменений:
sudo systemctl restart postgresql
🟠Использование инструмента `pg_stat_statements`
Расширение pg_stat_statements позволяет собирать статистику по выполненным запросам и предоставляет информацию о частоте, времени выполнения и других характеристиках запросов.
1⃣Включите расширение в postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
2⃣Перезапустите сервер PostgreSQL:
sudo systemctl restart postgresql
3⃣Создайте расширение в нужной базе данных:
CREATE EXTENSION pg_stat_statements;
4⃣Используйте запрос для получения информации о медленных запросах:
SELECT
query,
calls,
total_time,
mean_time,
stddev_time,
rows,
min_time,
max_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;
🟠Анализ запросов с помощью `EXPLAIN` и `EXPLAIN ANALYZE`
Команды EXPLAIN и EXPLAIN ANALYZE позволяют понять, как PostgreSQL планирует и выполняет запросы, предоставляя детальную информацию о плане выполнения.
1⃣Выполните команду EXPLAIN для запроса:
EXPLAIN SELECT * FROM my_table WHERE id = 1;
2⃣Выполните команду EXPLAIN ANALYZE для запроса:
EXPLAIN ANALYZE SELECT * FROM my_table WHERE id = 1;
3⃣Анализируйте выходные данные, чтобы понять, какие операции занимают больше всего времени (например, полное сканирование таблицы, узкие места при соединении таблиц и т.д.).
🟠Использование системных представлений и утилит
pg_stat_activity: Показывает текущую активность базы данных, включая выполняемые запросы и их состояние.
SELECT
pid,
usename,
state,
query,
now() - query_start AS duration
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;
pg_locks: Отображает информацию о текущих блокировках в базе данных.
SELECT * FROM pg_locks;
1⃣Индексы:
Убедитесь, что для часто используемых условий WHERE и JOIN существуют соответствующие индексы.
2⃣Переписывание запросов:
Попробуйте переписать запросы для улучшения их производительности.
3⃣Материализованные представления:
Используйте материализованные представления для часто выполняемых сложных запросов.
4⃣Конфигурация сервера:
Настройте параметры конфигурации PostgreSQL для оптимизации производительности (например, work_mem, shared_buffers, maintenance_work_mem).
Ставь 👍 и 📚
@backendquiz
🚩Методы и инструменты.
🟠Включение журналирования медленных запросов
Настройка параметров конфигурации PostgreSQL для журналирования медленных запросов позволяет отслеживать запросы, выполнение которых занимает много времени.
1⃣Откройте файл конфигурации PostgreSQL (postgresql.conf).
2⃣Настройте следующие параметры:
# Включить логирование всех запросов
log_statement = 'all'
# Либо логирование только медленных запросов
log_min_duration_statement = 1000 # Логировать запросы, выполнение которых заняло более 1000 мс (1 секунда)
3⃣Перезапустите сервер PostgreSQL для применения изменений:
sudo systemctl restart postgresql
🟠Использование инструмента `pg_stat_statements`
Расширение pg_stat_statements позволяет собирать статистику по выполненным запросам и предоставляет информацию о частоте, времени выполнения и других характеристиках запросов.
1⃣Включите расширение в postgresql.conf:
shared_preload_libraries = 'pg_stat_statements'
2⃣Перезапустите сервер PostgreSQL:
sudo systemctl restart postgresql
3⃣Создайте расширение в нужной базе данных:
CREATE EXTENSION pg_stat_statements;
4⃣Используйте запрос для получения информации о медленных запросах:
SELECT
query,
calls,
total_time,
mean_time,
stddev_time,
rows,
min_time,
max_time
FROM
pg_stat_statements
ORDER BY
total_time DESC
LIMIT 10;
🟠Анализ запросов с помощью `EXPLAIN` и `EXPLAIN ANALYZE`
Команды EXPLAIN и EXPLAIN ANALYZE позволяют понять, как PostgreSQL планирует и выполняет запросы, предоставляя детальную информацию о плане выполнения.
1⃣Выполните команду EXPLAIN для запроса:
EXPLAIN SELECT * FROM my_table WHERE id = 1;
2⃣Выполните команду EXPLAIN ANALYZE для запроса:
EXPLAIN ANALYZE SELECT * FROM my_table WHERE id = 1;
3⃣Анализируйте выходные данные, чтобы понять, какие операции занимают больше всего времени (например, полное сканирование таблицы, узкие места при соединении таблиц и т.д.).
🟠Использование системных представлений и утилит
pg_stat_activity: Показывает текущую активность базы данных, включая выполняемые запросы и их состояние.
SELECT
pid,
usename,
state,
query,
now() - query_start AS duration
FROM
pg_stat_activity
WHERE
state != 'idle'
ORDER BY
duration DESC;
pg_locks: Отображает информацию о текущих блокировках в базе данных.
SELECT * FROM pg_locks;
1⃣Индексы:
Убедитесь, что для часто используемых условий WHERE и JOIN существуют соответствующие индексы.
2⃣Переписывание запросов:
Попробуйте переписать запросы для улучшения их производительности.
3⃣Материализованные представления:
Используйте материализованные представления для часто выполняемых сложных запросов.
4⃣Конфигурация сервера:
Настройте параметры конфигурации PostgreSQL для оптимизации производительности (например, work_mem, shared_buffers, maintenance_work_mem).
Ставь 👍 и 📚
@backendquiz
🔥1
🤔 Что такое идемпотентность?
Идемпотентность — это свойство операции, при котором повторное выполнение этой операции приводит к тому же результату, что и однократное выполнение. Это понятие часто используется в контексте HTTP методов, API запросов и транзакций в системах с распределенной архитектурой.
🚩Основные аспекты идемпотентности
🟠Идемпотентные операции
GET: Получение ресурса. Повторный запрос не изменяет состояние ресурса.
PUT: Обновление или создание ресурса. Повторный запрос с одинаковыми данными приводит к одному и тому же состоянию ресурса.
DELETE: Удаление ресурса. Повторный запрос удаляет ресурс, если он существует, или не изменяет состояние, если ресурс уже удален.
🟠Неидемпотентные операции
POST: Создание нового ресурса. Повторный запрос приводит к созданию нового ресурса с новым идентификатором, что изменяет состояние системы.
🚩Примеры идемпотентности
GET запрос
GET /user/123
PUT запрос
PUT /user/123
{
"name": "John Doe",
"age": 30
}
Идемпотентная операция
UPDATE users SET name = 'John Doe' WHERE id = 123;
Неидемпотентная операция
INSERT INTO users (name, age) VALUES ('John Doe', 30);
🚩Зачем нужна идемпотентность
🟠Повышение надежности
Идемпотентные операции помогают в обеспечении надежности и устойчивости систем, особенно в условиях повторных запросов из-за сетевых сбоев или таймаутов.
🟠Упрощение обработки ошибок
При сбоях в системе легче повторно выполнить идемпотентную операцию, не беспокоясь о непредвиденных изменениях состояния.
🟠Удобство разработки
Идемпотентность упрощает разработку и тестирование, так как позволяет предсказуемо управлять состоянием системы при повторных запросах.
Ставь 👍 и 📚
@backendquiz
Идемпотентность — это свойство операции, при котором повторное выполнение этой операции приводит к тому же результату, что и однократное выполнение. Это понятие часто используется в контексте HTTP методов, API запросов и транзакций в системах с распределенной архитектурой.
🚩Основные аспекты идемпотентности
🟠Идемпотентные операции
GET: Получение ресурса. Повторный запрос не изменяет состояние ресурса.
PUT: Обновление или создание ресурса. Повторный запрос с одинаковыми данными приводит к одному и тому же состоянию ресурса.
DELETE: Удаление ресурса. Повторный запрос удаляет ресурс, если он существует, или не изменяет состояние, если ресурс уже удален.
🟠Неидемпотентные операции
POST: Создание нового ресурса. Повторный запрос приводит к созданию нового ресурса с новым идентификатором, что изменяет состояние системы.
🚩Примеры идемпотентности
GET запрос
GET /user/123
PUT запрос
PUT /user/123
{
"name": "John Doe",
"age": 30
}
Идемпотентная операция
UPDATE users SET name = 'John Doe' WHERE id = 123;
Неидемпотентная операция
INSERT INTO users (name, age) VALUES ('John Doe', 30);
🚩Зачем нужна идемпотентность
🟠Повышение надежности
Идемпотентные операции помогают в обеспечении надежности и устойчивости систем, особенно в условиях повторных запросов из-за сетевых сбоев или таймаутов.
🟠Упрощение обработки ошибок
При сбоях в системе легче повторно выполнить идемпотентную операцию, не беспокоясь о непредвиденных изменениях состояния.
🟠Удобство разработки
Идемпотентность упрощает разработку и тестирование, так как позволяет предсказуемо управлять состоянием системы при повторных запросах.
Ставь 👍 и 📚
@backendquiz
👍2
🤔 Обеспечение отказоустойчивости веб-приложения
Это процесс создания системы, которая продолжает корректно работать даже при частичных сбоях. Отказоустойчивость позволяет приложению оставаться доступным, минимизировать потери данных и поддерживать положительный пользовательский опыт в случае непредвиденных ситуаций.
🚩Методы
🟠Использование балансировщиков нагрузки
Балансировщики нагрузки распределяют входящий трафик между несколькими серверами, чтобы снизить нагрузку на отдельные серверы и избежать перегрузок. В случае сбоя одного сервера запросы автоматически перенаправляются на работающие экземпляры. Использование балансировщика повышает масштабируемость системы, поскольку позволяет легко добавлять или убирать серверы по мере необходимости.
🟠Горизонтальное масштабирование и кластеризация
Развертывание приложения на нескольких серверах (в кластере) позволяет избежать единой точки отказа (SPOF — Single Point of Failure). Горизонтальное масштабирование даёт возможность добавлять дополнительные серверы при увеличении нагрузки, что повышает отказоустойчивость и общую производительность системы. Сервисы, такие как Kubernetes и Docker Swarm, упрощают управление и оркестрацию контейнеров в кластере, автоматизируя процесс развертывания, обновлений и балансировки нагрузки.
🟠Механизмы резервного копирования и репликации данных
Важные данные должны регулярно сохраняться в резервных копиях и реплицироваться на несколько узлов или в несколько дата-центров. Репликация базы данных (например, master-slave или master-master репликация) обеспечивает доступность данных, даже если один из узлов выходит из строя. Для обеспечения целостности данных реплики могут быть синхронными (обеспечивают актуальность данных на всех узлах, но добавляют задержку) или асинхронными (с меньшей задержкой, но возможностью устаревания данных).
🟠Кеширование и использование CDN
Использование кешей (Redis, Memcached) снижает нагрузку на базу данных и позволяет быстрее обрабатывать запросы, снижая риски сбоев из-за высокой нагрузки. Content Delivery Network (CDN) распределяет контент по серверам, находящимся близко к пользователю. Это снижает нагрузку на основной сервер и обеспечивает доступность контента в случае перегрузки или отказа в одном из центров обработки данных.
🟠Автоматическое восстановление и мониторинг системы
Настройка систем мониторинга (например, Prometheus, Grafana, New Relic) позволяет оперативно выявлять сбои и реагировать на проблемы. Системы автоматического восстановления могут перезапускать упавшие серверы или контейнеры. Например, инструменты оркестрации, такие как Kubernetes, могут автоматически восстанавливать неработающие контейнеры. Настройка системы оповещений для обнаружения потенциальных проблем (например, медленного ответа сервера) позволяет вовремя реагировать на них и предотвращать крупные сбои.
🟠Использование очередей сообщений
Для работы с критически важными задачами, которые могут быть временно отложены, целесообразно использовать системы очередей сообщений (например, RabbitMQ, Kafka). Очереди позволяют обрабатывать запросы асинхронно, обеспечивая бесперебойную работу системы при перегрузках. Если один компонент выходит из строя, другой может продолжить обработку сообщений из очереди после восстановления.
Ставь 👍 и 📚
@backendquiz
Это процесс создания системы, которая продолжает корректно работать даже при частичных сбоях. Отказоустойчивость позволяет приложению оставаться доступным, минимизировать потери данных и поддерживать положительный пользовательский опыт в случае непредвиденных ситуаций.
🚩Методы
🟠Использование балансировщиков нагрузки
Балансировщики нагрузки распределяют входящий трафик между несколькими серверами, чтобы снизить нагрузку на отдельные серверы и избежать перегрузок. В случае сбоя одного сервера запросы автоматически перенаправляются на работающие экземпляры. Использование балансировщика повышает масштабируемость системы, поскольку позволяет легко добавлять или убирать серверы по мере необходимости.
🟠Горизонтальное масштабирование и кластеризация
Развертывание приложения на нескольких серверах (в кластере) позволяет избежать единой точки отказа (SPOF — Single Point of Failure). Горизонтальное масштабирование даёт возможность добавлять дополнительные серверы при увеличении нагрузки, что повышает отказоустойчивость и общую производительность системы. Сервисы, такие как Kubernetes и Docker Swarm, упрощают управление и оркестрацию контейнеров в кластере, автоматизируя процесс развертывания, обновлений и балансировки нагрузки.
🟠Механизмы резервного копирования и репликации данных
Важные данные должны регулярно сохраняться в резервных копиях и реплицироваться на несколько узлов или в несколько дата-центров. Репликация базы данных (например, master-slave или master-master репликация) обеспечивает доступность данных, даже если один из узлов выходит из строя. Для обеспечения целостности данных реплики могут быть синхронными (обеспечивают актуальность данных на всех узлах, но добавляют задержку) или асинхронными (с меньшей задержкой, но возможностью устаревания данных).
🟠Кеширование и использование CDN
Использование кешей (Redis, Memcached) снижает нагрузку на базу данных и позволяет быстрее обрабатывать запросы, снижая риски сбоев из-за высокой нагрузки. Content Delivery Network (CDN) распределяет контент по серверам, находящимся близко к пользователю. Это снижает нагрузку на основной сервер и обеспечивает доступность контента в случае перегрузки или отказа в одном из центров обработки данных.
🟠Автоматическое восстановление и мониторинг системы
Настройка систем мониторинга (например, Prometheus, Grafana, New Relic) позволяет оперативно выявлять сбои и реагировать на проблемы. Системы автоматического восстановления могут перезапускать упавшие серверы или контейнеры. Например, инструменты оркестрации, такие как Kubernetes, могут автоматически восстанавливать неработающие контейнеры. Настройка системы оповещений для обнаружения потенциальных проблем (например, медленного ответа сервера) позволяет вовремя реагировать на них и предотвращать крупные сбои.
🟠Использование очередей сообщений
Для работы с критически важными задачами, которые могут быть временно отложены, целесообразно использовать системы очередей сообщений (например, RabbitMQ, Kafka). Очереди позволяют обрабатывать запросы асинхронно, обеспечивая бесперебойную работу системы при перегрузках. Если один компонент выходит из строя, другой может продолжить обработку сообщений из очереди после восстановления.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Что такое транзакция в БД ?
Это последовательность одной или нескольких операций над базой данных, которая выполняется как единое целое. Транзакции обеспечивают, что все операции в рамках транзакции либо успешно выполняются, либо полностью отменяются, что гарантирует целостность данных.
🚩Основные свойства транзакций (ACID)
🟠Atomicity (Атомарность)
Транзакция должна быть либо выполнена полностью, либо не выполнена вовсе. Если какая-то часть транзакции не удается, вся транзакция откатывается (roll back) к исходному состоянию.
🟠Consistency (Согласованность)
Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после завершения транзакции все правила целостности данных должны быть соблюдены.
🟠Isolation (Изоляция)
Результаты выполнения транзакции не должны быть видны другим параллельно выполняющимся транзакциям до тех пор, пока данная транзакция не завершится. Это предотвращает влияние одной транзакции на другую.
🟠Durability (Устойчивость)
После успешного завершения транзакции (коммита) ее результаты должны быть зафиксированы в базе данных и сохранены, даже если произойдет сбой системы.
🚩Пример работы с транзакциями
На SQL
BEGIN TRANSACTION;
-- Пример операций внутри транзакции
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Если все операции прошли успешно
COMMIT;
-- Если произошла ошибка
ROLLBACK;
Пример на Java (использование JDBC)
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");
connection.setAutoCommit(false); // Начало транзакции
// Пример операций внутри транзакции
PreparedStatement pstmt1 = connection.prepareStatement("UPDATE accounts SET balance = balance - 100 WHERE account_id = ?");
pstmt1.setInt(1, 1);
pstmt1.executeUpdate();
PreparedStatement pstmt2 = connection.prepareStatement("UPDATE accounts SET balance = balance + 100 WHERE account_id = ?");
pstmt2.setInt(1, 2);
pstmt2.executeUpdate();
connection.commit(); // Коммит транзакции
} catch (SQLException e) {
if (connection != null) {
try {
connection.rollback(); // Откат транзакции при ошибке
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
Ставь 👍 и 📚
@backendquiz
Это последовательность одной или нескольких операций над базой данных, которая выполняется как единое целое. Транзакции обеспечивают, что все операции в рамках транзакции либо успешно выполняются, либо полностью отменяются, что гарантирует целостность данных.
🚩Основные свойства транзакций (ACID)
🟠Atomicity (Атомарность)
Транзакция должна быть либо выполнена полностью, либо не выполнена вовсе. Если какая-то часть транзакции не удается, вся транзакция откатывается (roll back) к исходному состоянию.
🟠Consistency (Согласованность)
Транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что после завершения транзакции все правила целостности данных должны быть соблюдены.
🟠Isolation (Изоляция)
Результаты выполнения транзакции не должны быть видны другим параллельно выполняющимся транзакциям до тех пор, пока данная транзакция не завершится. Это предотвращает влияние одной транзакции на другую.
🟠Durability (Устойчивость)
После успешного завершения транзакции (коммита) ее результаты должны быть зафиксированы в базе данных и сохранены, даже если произойдет сбой системы.
🚩Пример работы с транзакциями
На SQL
BEGIN TRANSACTION;
-- Пример операций внутри транзакции
UPDATE accounts SET balance = balance - 100 WHERE account_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE account_id = 2;
-- Если все операции прошли успешно
COMMIT;
-- Если произошла ошибка
ROLLBACK;
Пример на Java (использование JDBC)
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "user", "password");
connection.setAutoCommit(false); // Начало транзакции
// Пример операций внутри транзакции
PreparedStatement pstmt1 = connection.prepareStatement("UPDATE accounts SET balance = balance - 100 WHERE account_id = ?");
pstmt1.setInt(1, 1);
pstmt1.executeUpdate();
PreparedStatement pstmt2 = connection.prepareStatement("UPDATE accounts SET balance = balance + 100 WHERE account_id = ?");
pstmt2.setInt(1, 2);
pstmt2.executeUpdate();
connection.commit(); // Коммит транзакции
} catch (SQLException e) {
if (connection != null) {
try {
connection.rollback(); // Откат транзакции при ошибке
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (connection != null) {
try {
connection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Примеры систем CP, AP и CA?
В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability).
🚩CP-системы (Consistency + Partition Tolerance)
Системы, которые обеспечивают согласованность данных и устойчивость к разделению сети, но могут временно отказаться от доступности при возникновении сетевых сбоев. Такие системы при сетевом разделении блокируют часть данных или операций, чтобы сохранить согласованное состояние.
🟠HBase и MongoDB в режиме CP
Оба эти хранилища данных поддерживают согласованность при сетевых сбоях, но могут ограничивать доступность данных, блокируя операции до восстановления связи.
🟠Zookeeper
Система координации распределённых приложений, обеспечивающая согласованность, но жертвующая доступностью в случае сетевых проблем. Она часто используется для управления конфигурацией и синхронизацией данных.
🚩AP-системы (Availability + Partition Tolerance)
Системы, которые фокусируются на доступности и устойчивости к разделению сети, но допускают временную неидеальную согласованность данных (например, данные могут быть не сразу синхронизированы между репликами).
🟠Cassandra
Эта система обеспечивает доступность и устойчивость к разделению сети, но может допускать задержки в синхронизации данных между узлами.
🟠DynamoDB (режим AP)
Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети.
🟠Riak
Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже.
🚩CA-системы (Consistency + Availability)
Системы, обеспечивающие согласованность и доступность данных, но не гарантирующие устойчивости к разделению сети. В реальных распределённых системах подобный подход встречается редко, так как любая сеть может столкнуться с разделением, что нарушит работу.
🟠Реляционные базы данных на одном сервере
Например, PostgreSQL или MySQL в традиционной конфигурации, работающей на одном сервере без распределения данных. Они поддерживают согласованность и доступность, так как нет сетевого разделения.
🟠Системы кэширования в локальной сети
Такие системы, как Redis, при отсутствии распределённой конфигурации и работе в пределах одного узла, могут обеспечить согласованность и доступность.
Ставь 👍 и 📚
@backendquiz
В контексте CAP-теоремы(Consistency, Availability, Partition Tolerance) системы обычно делят на три группы: CP (Consistency + Partition Tolerance), AP (Availability + Partition Tolerance) и CA (Consistency + Availability).
🚩CP-системы (Consistency + Partition Tolerance)
Системы, которые обеспечивают согласованность данных и устойчивость к разделению сети, но могут временно отказаться от доступности при возникновении сетевых сбоев. Такие системы при сетевом разделении блокируют часть данных или операций, чтобы сохранить согласованное состояние.
🟠HBase и MongoDB в режиме CP
Оба эти хранилища данных поддерживают согласованность при сетевых сбоях, но могут ограничивать доступность данных, блокируя операции до восстановления связи.
🟠Zookeeper
Система координации распределённых приложений, обеспечивающая согласованность, но жертвующая доступностью в случае сетевых проблем. Она часто используется для управления конфигурацией и синхронизацией данных.
🚩AP-системы (Availability + Partition Tolerance)
Системы, которые фокусируются на доступности и устойчивости к разделению сети, но допускают временную неидеальную согласованность данных (например, данные могут быть не сразу синхронизированы между репликами).
🟠Cassandra
Эта система обеспечивает доступность и устойчивость к разделению сети, но может допускать задержки в синхронизации данных между узлами.
🟠DynamoDB (режим AP)
Поддерживает доступность и устойчивость к разделению сети, за счёт возможного отклонения в согласованности. DynamoDB был разработан Amazon для обеспечения высокой доступности даже в условиях сбоя сети.
🟠Riak
Распределённое хранилище, оптимизированное для доступности и устойчивости к разделениям сети. Оно допускает временные рассогласования данных, которые разрешаются позже.
🚩CA-системы (Consistency + Availability)
Системы, обеспечивающие согласованность и доступность данных, но не гарантирующие устойчивости к разделению сети. В реальных распределённых системах подобный подход встречается редко, так как любая сеть может столкнуться с разделением, что нарушит работу.
🟠Реляционные базы данных на одном сервере
Например, PostgreSQL или MySQL в традиционной конфигурации, работающей на одном сервере без распределения данных. Они поддерживают согласованность и доступность, так как нет сетевого разделения.
🟠Системы кэширования в локальной сети
Такие системы, как Redis, при отсутствии распределённой конфигурации и работе в пределах одного узла, могут обеспечить согласованность и доступность.
Ставь 👍 и 📚
@backendquiz
🤔 Как выбрать данные из двух таблиц без метода join()?
Для выбора данных из двух таблиц без использования метода JOIN можно использовать подзапросы. Подзапросы позволяют выполнять вложенные запросы, где результат одного запроса используется в другом запросе.
🟠Использование подзапросов в `SELECT`
Вы можете использовать подзапрос в операторе SELECT, чтобы извлечь данные из одной таблицы, используя значения из другой таблицы.
SELECT
o.order_id,
o.order_date,
(SELECT c.customer_name FROM customers c WHERE c.customer_id = o.customer_id) AS customer_name
FROM
orders o;
🟠Использование подзапросов в `WHERE`
Вы можете использовать подзапрос в операторе WHERE, чтобы фильтровать данные на основе условий из другой таблицы.
SELECT
o.order_id,
o.order_date
FROM
orders o
WHERE
o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.city = 'New York');
🟠Использование подзапросов в `FROM`
Вы можете использовать подзапрос в операторе FROM, чтобы создать временную таблицу и затем выбрать данные из нее.
SELECT
c.customer_name,
latest_orders.order_id,
latest_orders.order_date
FROM
customers c,
(SELECT
o.customer_id,
o.order_id,
o.order_date
FROM
orders o
WHERE
o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id)
) AS latest_orders
WHERE
c.customer_id = latest_orders.customer_id;
🟠Использование подзапросов с агрегатными функциями
Подзапросы могут быть полезны при использовании агрегатных функций для получения обобщенной информации из одной таблицы, связанной с другой таблицей.
SELECT
c.customer_name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.customer_id) AS total_orders
FROM
customers c;
🟠Использование подзапросов с операторами EXISTS
Оператор EXISTS проверяет наличие строк в подзапросе и возвращает TRUE, если подзапрос возвращает хотя бы одну строку.
SELECT
c.customer_name
FROM
customers c
WHERE
EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Ставь 👍 и 📚
@backendquiz
Для выбора данных из двух таблиц без использования метода JOIN можно использовать подзапросы. Подзапросы позволяют выполнять вложенные запросы, где результат одного запроса используется в другом запросе.
🟠Использование подзапросов в `SELECT`
Вы можете использовать подзапрос в операторе SELECT, чтобы извлечь данные из одной таблицы, используя значения из другой таблицы.
SELECT
o.order_id,
o.order_date,
(SELECT c.customer_name FROM customers c WHERE c.customer_id = o.customer_id) AS customer_name
FROM
orders o;
🟠Использование подзапросов в `WHERE`
Вы можете использовать подзапрос в операторе WHERE, чтобы фильтровать данные на основе условий из другой таблицы.
SELECT
o.order_id,
o.order_date
FROM
orders o
WHERE
o.customer_id IN (SELECT c.customer_id FROM customers c WHERE c.city = 'New York');
🟠Использование подзапросов в `FROM`
Вы можете использовать подзапрос в операторе FROM, чтобы создать временную таблицу и затем выбрать данные из нее.
SELECT
c.customer_name,
latest_orders.order_id,
latest_orders.order_date
FROM
customers c,
(SELECT
o.customer_id,
o.order_id,
o.order_date
FROM
orders o
WHERE
o.order_date = (SELECT MAX(order_date) FROM orders o2 WHERE o2.customer_id = o.customer_id)
) AS latest_orders
WHERE
c.customer_id = latest_orders.customer_id;
🟠Использование подзапросов с агрегатными функциями
Подзапросы могут быть полезны при использовании агрегатных функций для получения обобщенной информации из одной таблицы, связанной с другой таблицей.
SELECT
c.customer_name,
(SELECT COUNT(*) FROM orders o WHERE o.customer_id = c.customer_id) AS total_orders
FROM
customers c;
🟠Использование подзапросов с операторами EXISTS
Оператор EXISTS проверяет наличие строк в подзапросе и возвращает TRUE, если подзапрос возвращает хотя бы одну строку.
SELECT
c.customer_name
FROM
customers c
WHERE
EXISTS (SELECT 1 FROM orders o WHERE o.customer_id = c.customer_id);
Ставь 👍 и 📚
@backendquiz
🤔 Что такое нормализация баз данных?
Нормализация баз данных - это процесс организации данных в базе данных для минимизации избыточности данных и обеспечения их целостности. Цель нормализации - структурировать таблицы таким образом, чтобы устранить аномалии обновления, вставки и удаления данных. Нормализация достигается путем разбиения больших таблиц на более мелкие, связанных между собой отношениями, что упрощает управление данными и делает их более логически связанными.
🚩Зачем нужна нормализация
🟠Устранение избыточности данных
Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных.
🟠Обеспечение целостности данных
Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных.
🟠Упрощение структуры базы данных
Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования.
🟠Избежание аномалий данных
Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных.
🚩Основные формы нормализации
🟠Первая нормальная форма (1NF)
Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными.
🟠Вторая нормальная форма (2NF)
Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа.
🟠Третья нормальная форма (3NF)
Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов.
🟠Бойс-Кодд нормальная форма (BCNF)
Усиление 3NF: каждая детерминанта должна быть кандидатом на ключ, что означает, что в любой нетривиальной функциональной зависимости X -> Y, X должно быть суперключом.
🟠Четвертая нормальная форма (4NF)
Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута.
🟠Пятая нормальная форма (5NF)
Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.
🚩Примеры применения нормализации
🟠Первая нормальная форма
Если у вас есть таблица с повторяющимися группами, такими как несколько телефонных номеров для одного клиента, вы создаете отдельную таблицу для телефонов и связываете ее с таблицей клиентов.
🟠Вторая нормальная форма
Если у вас есть таблица заказов с колонками "номер заказа", "название товара" и "цена товара", вы можете создать отдельные таблицы для заказов и товаров, чтобы цена товара зависела только от товара, а не от комбинации заказа и товара.
🟠Третья нормальная форма
Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника.
Ставь 👍 и 📚
@backendquiz
Нормализация баз данных - это процесс организации данных в базе данных для минимизации избыточности данных и обеспечения их целостности. Цель нормализации - структурировать таблицы таким образом, чтобы устранить аномалии обновления, вставки и удаления данных. Нормализация достигается путем разбиения больших таблиц на более мелкие, связанных между собой отношениями, что упрощает управление данными и делает их более логически связанными.
🚩Зачем нужна нормализация
🟠Устранение избыточности данных
Нормализация позволяет минимизировать дублирование данных, что экономит пространство и упрощает управление базой данных.
🟠Обеспечение целостности данных
Нормализация помогает поддерживать целостность данных, обеспечивая правильное и единообразное хранение данных.
🟠Упрощение структуры базы данных
Разделение данных на логические таблицы делает структуру базы данных более понятной и удобной для использования.
🟠Избежание аномалий данных
Нормализация предотвращает возникновение аномалий при обновлении, вставке и удалении данных.
🚩Основные формы нормализации
🟠Первая нормальная форма (1NF)
Удаление повторяющихся групп в таблице. Каждый столбец должен содержать только атомарные (неделимые) значения. Все записи в таблице должны быть уникальными.
🟠Вторая нормальная форма (2NF)
Таблица должна быть в 1NF. Удаление частичной функциональной зависимости: каждый неключевой атрибут должен быть полностью зависим от первичного ключа.
🟠Третья нормальная форма (3NF)
Таблица должна быть в 2NF. Удаление транзитивной зависимости: все неключевые атрибуты должны быть напрямую зависимы от первичного ключа, а не от других неключевых атрибутов.
🟠Бойс-Кодд нормальная форма (BCNF)
Усиление 3NF: каждая детерминанта должна быть кандидатом на ключ, что означает, что в любой нетривиальной функциональной зависимости X -> Y, X должно быть суперключом.
🟠Четвертая нормальная форма (4NF)
Таблица должна быть в BCNF. Устранение многозначных зависимостей: таблица не должна содержать многозначных зависимостей, когда один атрибут зависит от нескольких значений другого атрибута.
🟠Пятая нормальная форма (5NF)
Таблица должна быть в 4NF. Устранение соединительных зависимостей: данные должны быть разбиты так, чтобы каждая зависимость сохранялась.
🚩Примеры применения нормализации
🟠Первая нормальная форма
Если у вас есть таблица с повторяющимися группами, такими как несколько телефонных номеров для одного клиента, вы создаете отдельную таблицу для телефонов и связываете ее с таблицей клиентов.
🟠Вторая нормальная форма
Если у вас есть таблица заказов с колонками "номер заказа", "название товара" и "цена товара", вы можете создать отдельные таблицы для заказов и товаров, чтобы цена товара зависела только от товара, а не от комбинации заказа и товара.
🟠Третья нормальная форма
Если у вас есть таблица сотрудников с колонками "идентификатор сотрудника", "название отдела" и "имя начальника отдела", вы можете создать отдельные таблицы для сотрудников и отделов, чтобы имя начальника отдела зависело только от отдела, а не от сотрудника.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Основные подводные камни удалённых вызовов?
Это технология, позволяющая приложениям вызывать функции или процедуры, которые выполняются на удалённом сервере, как если бы они были локальными. Несмотря на удобство, такая модель имеет ряд подводных камней, которые необходимо учитывать при проектировании и разработке распределённых систем.
🟠Скрытие распределённости
Удалённые вызовы маскируют тот факт, что операция выполняется через сеть. Это может создать ложное чувство локальности у разработчиков, которые не учитывают:
Сетевую задержку: вызовы занимают больше времени, чем локальные операции, особенно при медленных сетях. Сетевые сбои: соединение может быть потеряно, что приведёт к ошибкам выполнения или длительным тайм-аутам. Изменение задержки: время выполнения одного и того же вызова может существенно варьироваться в зависимости от сетевых условий.
🟠Обработка ошибок
Обработка ошибок в распределённых системах сложнее, чем при локальных вызовах:
Необходимо обрабатывать такие ошибки, как потеря соединения, тайм-ауты, отказ сервера. В некоторых случаях может возникнуть "проблема повторного вызова" (например, запрос был выполнен, но подтверждение потерялось), что приводит к возможной идемпотентности операций.
🟠Сериализация и десериализация данных
Для передачи данных через сеть они должны быть преобразованы в сериализованный формат. Это может:
Увеличивать задержки из-за времени, необходимого на преобразование. Создавать проблемы совместимости, если клиент и сервер используют разные версии протокола. Усложнять отладку и диагностику ошибок в данных.
🟠Распределённая согласованность
Взаимодействие между распределёнными компонентами приводит к необходимости поддерживать согласованность данных: Проблема согласованности особенно актуальна при частичных отказах системы. Может потребоваться использование распределённых транзакций, что усложняет архитектуру.
🟠Проблемы безопасности
Удалённые вызовы подвержены угрозам: Необходимо обеспечивать шифрование данных, чтобы избежать утечек. Аутентификация и авторизация играют ключевую роль в защите системы. Возможны атаки на уровень сети или использование слабостей в протоколах передачи данных.
🟠Балансировка нагрузки и масштабирование
При большом числе клиентов сервер может стать узким местом: Нагрузка на сервер может привести к деградации производительности. Требуется правильная стратегия масштабирования и балансировки нагрузки, например, использование нескольких серверов или очередей сообщений.
🟠Выбор протокола и технологий
Различные протоколы (например, HTTP, gRPC, Thrift) обладают своими особенностями: Протокол может накладывать ограничения на производительность и возможности. Ошибки конфигурации или несоответствие версий могут вызвать проблемы.
🚩Как это используется
🟠Для создания распределённых систем
Микросервисные архитектуры. Взаимодействие клиент-сервер (например, мобильное приложение и API). Системы с тяжёлой серверной логикой.
🟠Чтобы избежать подводных камней
Чётко проектировать архитектуру, учитывая особенности сети. Использовать идемпотентные операции. Обеспечивать надёжные стратегии обработки ошибок. Применять мониторинг и трассировку (например, OpenTelemetry) для отслеживания поведения системы.
Ставь 👍 и 📚
@backendquiz
Это технология, позволяющая приложениям вызывать функции или процедуры, которые выполняются на удалённом сервере, как если бы они были локальными. Несмотря на удобство, такая модель имеет ряд подводных камней, которые необходимо учитывать при проектировании и разработке распределённых систем.
🟠Скрытие распределённости
Удалённые вызовы маскируют тот факт, что операция выполняется через сеть. Это может создать ложное чувство локальности у разработчиков, которые не учитывают:
Сетевую задержку: вызовы занимают больше времени, чем локальные операции, особенно при медленных сетях. Сетевые сбои: соединение может быть потеряно, что приведёт к ошибкам выполнения или длительным тайм-аутам. Изменение задержки: время выполнения одного и того же вызова может существенно варьироваться в зависимости от сетевых условий.
🟠Обработка ошибок
Обработка ошибок в распределённых системах сложнее, чем при локальных вызовах:
Необходимо обрабатывать такие ошибки, как потеря соединения, тайм-ауты, отказ сервера. В некоторых случаях может возникнуть "проблема повторного вызова" (например, запрос был выполнен, но подтверждение потерялось), что приводит к возможной идемпотентности операций.
🟠Сериализация и десериализация данных
Для передачи данных через сеть они должны быть преобразованы в сериализованный формат. Это может:
Увеличивать задержки из-за времени, необходимого на преобразование. Создавать проблемы совместимости, если клиент и сервер используют разные версии протокола. Усложнять отладку и диагностику ошибок в данных.
🟠Распределённая согласованность
Взаимодействие между распределёнными компонентами приводит к необходимости поддерживать согласованность данных: Проблема согласованности особенно актуальна при частичных отказах системы. Может потребоваться использование распределённых транзакций, что усложняет архитектуру.
🟠Проблемы безопасности
Удалённые вызовы подвержены угрозам: Необходимо обеспечивать шифрование данных, чтобы избежать утечек. Аутентификация и авторизация играют ключевую роль в защите системы. Возможны атаки на уровень сети или использование слабостей в протоколах передачи данных.
🟠Балансировка нагрузки и масштабирование
При большом числе клиентов сервер может стать узким местом: Нагрузка на сервер может привести к деградации производительности. Требуется правильная стратегия масштабирования и балансировки нагрузки, например, использование нескольких серверов или очередей сообщений.
🟠Выбор протокола и технологий
Различные протоколы (например, HTTP, gRPC, Thrift) обладают своими особенностями: Протокол может накладывать ограничения на производительность и возможности. Ошибки конфигурации или несоответствие версий могут вызвать проблемы.
🚩Как это используется
🟠Для создания распределённых систем
Микросервисные архитектуры. Взаимодействие клиент-сервер (например, мобильное приложение и API). Системы с тяжёлой серверной логикой.
🟠Чтобы избежать подводных камней
Чётко проектировать архитектуру, учитывая особенности сети. Использовать идемпотентные операции. Обеспечивать надёжные стратегии обработки ошибок. Применять мониторинг и трассировку (например, OpenTelemetry) для отслеживания поведения системы.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Какие связи с моделями в БД знаешь?
🚩"Один к одному" (One-to-One)
Каждая запись в одной таблице связана с одной и только одной записью в другой таблице.
Пользователь (User) и Паспорт (Passport)
Каждому пользователю соответствует один уникальный паспорт. В реляционных базах данных можно реализовать эту связь с помощью уникального внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE passports (
id SERIAL PRIMARY KEY,
user_id INTEGER UNIQUE,
passport_number VARCHAR(50),
FOREIGN KEY (user_id) REFERENCES users(id)
);
🚩"Один ко многим" (One-to-Many)
Каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, но каждая запись в другой таблице связана только с одной записью в первой таблице.
Пользователь (User) и Заказы (Orders)
Один пользователь может сделать много заказов, но каждый заказ связан с одним пользователем. Эта связь обычно реализуется с помощью внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
🚩"Многие ко многим" (Many-to-Many)
Каждая запись в одной таблице может быть связана с множеством записей в другой таблице, и наоборот.
Студенты (Students) и Курсы (Courses)
Один студент может записаться на множество курсов, и каждый курс может быть записан многими студентами. Эта связь обычно реализуется с помощью промежуточной таблицы (таблицы связи), которая содержит внешние ключи обеих связанных таблиц.
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE student_courses (
student_id INTEGER,
course_id INTEGER,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
🚩Варианты связей в нереляционных базах данных (NoSQL)
В нереляционных базах данных связи могут быть организованы иначе, поскольку они часто не поддерживают традиционные реляционные модели.
Вложенные документы
Например, в MongoDB документы могут включать вложенные документы или массивы, что позволяет моделировать отношения "один ко многим" и "многие ко многим" внутри одного документа.
{
"_id": 1,
"name": "John",
"orders": [
{ "order_id": 1, "order_date": "2023-08-01" },
{ "order_id": 2, "order_date": "2023-08-05" }
]
}
Ставь 👍 и 📚
@backendquiz
🚩"Один к одному" (One-to-One)
Каждая запись в одной таблице связана с одной и только одной записью в другой таблице.
Пользователь (User) и Паспорт (Passport)
Каждому пользователю соответствует один уникальный паспорт. В реляционных базах данных можно реализовать эту связь с помощью уникального внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE passports (
id SERIAL PRIMARY KEY,
user_id INTEGER UNIQUE,
passport_number VARCHAR(50),
FOREIGN KEY (user_id) REFERENCES users(id)
);
🚩"Один ко многим" (One-to-Many)
Каждая запись в одной таблице может быть связана с несколькими записями в другой таблице, но каждая запись в другой таблице связана только с одной записью в первой таблице.
Пользователь (User) и Заказы (Orders)
Один пользователь может сделать много заказов, но каждый заказ связан с одним пользователем. Эта связь обычно реализуется с помощью внешнего ключа.
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER,
order_date DATE,
FOREIGN KEY (user_id) REFERENCES users(id)
);
🚩"Многие ко многим" (Many-to-Many)
Каждая запись в одной таблице может быть связана с множеством записей в другой таблице, и наоборот.
Студенты (Students) и Курсы (Courses)
Один студент может записаться на множество курсов, и каждый курс может быть записан многими студентами. Эта связь обычно реализуется с помощью промежуточной таблицы (таблицы связи), которая содержит внешние ключи обеих связанных таблиц.
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100)
);
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
course_name VARCHAR(100)
);
CREATE TABLE student_courses (
student_id INTEGER,
course_id INTEGER,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
🚩Варианты связей в нереляционных базах данных (NoSQL)
В нереляционных базах данных связи могут быть организованы иначе, поскольку они часто не поддерживают традиционные реляционные модели.
Вложенные документы
Например, в MongoDB документы могут включать вложенные документы или массивы, что позволяет моделировать отношения "один ко многим" и "многие ко многим" внутри одного документа.
{
"_id": 1,
"name": "John",
"orders": [
{ "order_id": 1, "order_date": "2023-08-01" },
{ "order_id": 2, "order_date": "2023-08-05" }
]
}
Ставь 👍 и 📚
@backendquiz
🤔 Какие http методы могут быть?
HTTP (HyperText Transfer Protocol) методы представляют собой набор стандартных операций, которые используются для взаимодействия между клиентом и сервером в сети. Каждый метод определяет конкретное действие, которое должен выполнить сервер. Вот основные HTTP методы и их предназначение:
🟠GET
Метод GET используется для получения данных с сервера. Он запрашивает представление ресурса, не изменяя его состояния. GET запросы часто используются для запросов веб-страниц и получения данных из API.
🟠POST
Метод POST используется для отправки данных на сервер с целью создания или обновления ресурса. Это может включать отправку формы на веб-сайте или загрузку файла. POST запросы обычно содержат данные в теле запроса.
🟠PUT
Метод PUT используется для обновления существующего ресурса или создания нового ресурса на сервере. Если ресурс уже существует, он будет обновлен, если нет — будет создан.
🟠DELETE
Метод DELETE используется для удаления ресурса с сервера. Запросы DELETE могут быть небезопасными, так как они изменяют состояние сервера, удаляя данные.
🟠PATCH
Метод PATCH используется для частичного обновления ресурса. В отличие от PUT, который заменяет весь ресурс, PATCH изменяет только указанные части ресурса.
🟠HEAD
Метод HEAD аналогичен GET, но без тела ответа. Используется для получения метаданных о ресурсе, таких как заголовки, без загрузки самого ресурса.
🟠OPTIONS
Метод OPTIONS используется для запроса информации о поддерживаемых методах на сервере или на конкретном ресурсе. Это может быть полезно для определения доступных операций перед отправкой основного запроса.
🟠CONNECT
Метод CONNECT используется для установления туннеля к серверу через прокси. Обычно используется для HTTPS через прокси.
🟠TRACE
Метод TRACE выполняет тестовый запрос по маршруту до ресурса. Он возвращает запрос, полученный сервером, что может помочь в диагностике сетевых проблем или выявлении изменений в маршруте запроса.
Ставь 👍 и 📚
@backendquiz
HTTP (HyperText Transfer Protocol) методы представляют собой набор стандартных операций, которые используются для взаимодействия между клиентом и сервером в сети. Каждый метод определяет конкретное действие, которое должен выполнить сервер. Вот основные HTTP методы и их предназначение:
🟠GET
Метод GET используется для получения данных с сервера. Он запрашивает представление ресурса, не изменяя его состояния. GET запросы часто используются для запросов веб-страниц и получения данных из API.
🟠POST
Метод POST используется для отправки данных на сервер с целью создания или обновления ресурса. Это может включать отправку формы на веб-сайте или загрузку файла. POST запросы обычно содержат данные в теле запроса.
🟠PUT
Метод PUT используется для обновления существующего ресурса или создания нового ресурса на сервере. Если ресурс уже существует, он будет обновлен, если нет — будет создан.
🟠DELETE
Метод DELETE используется для удаления ресурса с сервера. Запросы DELETE могут быть небезопасными, так как они изменяют состояние сервера, удаляя данные.
🟠PATCH
Метод PATCH используется для частичного обновления ресурса. В отличие от PUT, который заменяет весь ресурс, PATCH изменяет только указанные части ресурса.
🟠HEAD
Метод HEAD аналогичен GET, но без тела ответа. Используется для получения метаданных о ресурсе, таких как заголовки, без загрузки самого ресурса.
🟠OPTIONS
Метод OPTIONS используется для запроса информации о поддерживаемых методах на сервере или на конкретном ресурсе. Это может быть полезно для определения доступных операций перед отправкой основного запроса.
🟠CONNECT
Метод CONNECT используется для установления туннеля к серверу через прокси. Обычно используется для HTTPS через прокси.
🟠TRACE
Метод TRACE выполняет тестовый запрос по маршруту до ресурса. Он возвращает запрос, полученный сервером, что может помочь в диагностике сетевых проблем или выявлении изменений в маршруте запроса.
Ставь 👍 и 📚
@backendquiz
🤔 Что такое singleton?
Это порождающий шаблон проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Этот шаблон часто используется для управления ресурсами, такими как базы данных или логирование, где требуется, чтобы доступ был централизованным и единичным.
🚩Характеристики
🟠Единственный экземпляр
Класс Singleton создаёт только один экземпляр своего типа и предотвращает создание дополнительных экземпляров.
🟠Глобальная точка доступа
Singleton предоставляет глобальный доступ к своему экземпляру. Это может быть реализовано через статический метод, который возвращает экземпляр класса.
🚩Реализация на Python
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
🚩Реализация на Java
public class Singleton {
private static Singleton instance;
private Singleton() {
// приватный конструктор предотвращает создание объектов вне класса
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
// Пример использования
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // True
Ставь 👍 и 📚
@backendquiz
Это порождающий шаблон проектирования, который гарантирует, что у класса есть только один экземпляр, и предоставляет глобальную точку доступа к этому экземпляру. Этот шаблон часто используется для управления ресурсами, такими как базы данных или логирование, где требуется, чтобы доступ был централизованным и единичным.
🚩Характеристики
🟠Единственный экземпляр
Класс Singleton создаёт только один экземпляр своего типа и предотвращает создание дополнительных экземпляров.
🟠Глобальная точка доступа
Singleton предоставляет глобальный доступ к своему экземпляру. Это может быть реализовано через статический метод, который возвращает экземпляр класса.
🚩Реализация на Python
class Singleton:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
return cls._instance
# Пример использования
singleton1 = Singleton()
singleton2 = Singleton()
print(singleton1 is singleton2) # True
🚩Реализация на Java
public class Singleton {
private static Singleton instance;
private Singleton() {
// приватный конструктор предотвращает создание объектов вне класса
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
// Пример использования
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
System.out.println(singleton1 == singleton2); // True
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Что можешь рассказать про HTML?
HTML (HyperText Markup Language) — это основной язык разметки, используемый для создания и структурирования веб-страниц. HTML позволяет создавать веб-страницы с текстом, изображениями, ссылками, формами и другими элементами, которые могут быть отображены в браузере. Он является фундаментом веб-технологий и работает в тандеме с CSS (Cascading Style Sheets) и JavaScript для создания полноценных веб-приложений.
🚩Основные аспекты HTML:
Структура документа: HTML-документ состоит из различных элементов, каждый из которых представлен тегами. Теги определяют, как различные части документа должны быть отображены в браузере.
🟠 : Определяет тип документа и версию HTML.
🟠 : Корневой элемент документа.
🟠: Содержит метаданные о документе, такие как теги , , стили и скрипты.
🟠 : Содержит видимую часть документа, включая текст, изображения, ссылки и другие элементы.
Элементы и теги: HTML использует теги для определения различных элементов. Теги обычно идут в парах: открывающий тег и закрывающий тег . Некоторые теги являются самозакрывающимися, например, и .
🟠 - : Заголовки различных уровней.
🟠 : Параграф текста.
🟠: Гиперссылка.
🟠 : Изображение.
🟠, , : Ненумерованные и нумерованные списки и элементы списка.
🟠, , : Таблицы и их элементы.
Атрибуты: Теги могут иметь атрибуты, которые предоставляют дополнительную информацию о элементе. Атрибуты записываются внутри открывающего тега и имеют формат имя="значение".
🟠href для : Указывает URL, на который ведёт ссылка.
🟠src для : Указывает путь к изображению.
🟠alt для : Описывает изображение для поисковых систем и пользователей с ограниченными возможностями.
Формы: HTML позволяет создавать интерактивные формы для сбора данных от пользователей. Формы могут содержать различные типы полей ввода, такие как текстовые поля, радиокнопки, чекбоксы и кнопки отправки.
🟠 : Общее поле ввода. Атрибут type определяет тип ввода (например, text, password, email).
🟠: Многострочное текстовое поле.
🟠 и : Выпадающий список.
🟠 : Кнопка.
🚩Преимущества HTML:
🟠Простота использования: HTML легко изучить и использовать. Он не требует сложных инструментов для написания или редактирования.
🟠Совместимость: HTML поддерживается всеми веб-браузерами, что обеспечивает кроссплатформенность и широкую доступность.
🟠Расширяемость: HTML можно расширять с помощью CSS и JavaScript для создания более сложных и интерактивных веб-страниц.
🟠Стандартизация: HTML является стандартом, поддерживаемым W3C (World Wide Web Consortium), что обеспечивает его надежность и предсказуемость.
🚩Как используется HTML:
🟠Создание веб-страниц:
Основное применение HTML — это создание веб-страниц и веб-приложений. Каждый веб-сайт, который вы посещаете, использует HTML для структурирования своего контента.
🟠Электронные письма:
HTML также используется для создания форматированных электронных писем с текстом, изображениями и ссылками.
🟠Документация и справочные системы:
HTML используется для создания интерактивной документации и справочных систем, которые могут включать текст, ссылки, изображения и другие элементы.
Ставь 👍 и 📚
@backendquiz
HTML (HyperText Markup Language) — это основной язык разметки, используемый для создания и структурирования веб-страниц. HTML позволяет создавать веб-страницы с текстом, изображениями, ссылками, формами и другими элементами, которые могут быть отображены в браузере. Он является фундаментом веб-технологий и работает в тандеме с CSS (Cascading Style Sheets) и JavaScript для создания полноценных веб-приложений.
🚩Основные аспекты HTML:
Структура документа: HTML-документ состоит из различных элементов, каждый из которых представлен тегами. Теги определяют, как различные части документа должны быть отображены в браузере.
🟠 : Определяет тип документа и версию HTML.
🟠 : Корневой элемент документа.
🟠: Содержит метаданные о документе, такие как теги , , стили и скрипты.
🟠 : Содержит видимую часть документа, включая текст, изображения, ссылки и другие элементы.
Элементы и теги: HTML использует теги для определения различных элементов. Теги обычно идут в парах: открывающий тег и закрывающий тег . Некоторые теги являются самозакрывающимися, например, и .
🟠 - : Заголовки различных уровней.
🟠 : Параграф текста.
🟠: Гиперссылка.
🟠 : Изображение.
🟠, , : Ненумерованные и нумерованные списки и элементы списка.
🟠, , : Таблицы и их элементы.
Атрибуты: Теги могут иметь атрибуты, которые предоставляют дополнительную информацию о элементе. Атрибуты записываются внутри открывающего тега и имеют формат имя="значение".
🟠href для : Указывает URL, на который ведёт ссылка.
🟠src для : Указывает путь к изображению.
🟠alt для : Описывает изображение для поисковых систем и пользователей с ограниченными возможностями.
Формы: HTML позволяет создавать интерактивные формы для сбора данных от пользователей. Формы могут содержать различные типы полей ввода, такие как текстовые поля, радиокнопки, чекбоксы и кнопки отправки.
🟠 : Общее поле ввода. Атрибут type определяет тип ввода (например, text, password, email).
🟠: Многострочное текстовое поле.
🟠 и : Выпадающий список.
🟠 : Кнопка.
🚩Преимущества HTML:
🟠Простота использования: HTML легко изучить и использовать. Он не требует сложных инструментов для написания или редактирования.
🟠Совместимость: HTML поддерживается всеми веб-браузерами, что обеспечивает кроссплатформенность и широкую доступность.
🟠Расширяемость: HTML можно расширять с помощью CSS и JavaScript для создания более сложных и интерактивных веб-страниц.
🟠Стандартизация: HTML является стандартом, поддерживаемым W3C (World Wide Web Consortium), что обеспечивает его надежность и предсказуемость.
🚩Как используется HTML:
🟠Создание веб-страниц:
Основное применение HTML — это создание веб-страниц и веб-приложений. Каждый веб-сайт, который вы посещаете, использует HTML для структурирования своего контента.
🟠Электронные письма:
HTML также используется для создания форматированных электронных писем с текстом, изображениями и ссылками.
🟠Документация и справочные системы:
HTML используется для создания интерактивной документации и справочных систем, которые могут включать текст, ссылки, изображения и другие элементы.
Ставь 👍 и 📚
@backendquiz
👍1
🤔 Что такое блокировки (локи) в БД?
Блокировки (локи) в базе данных - это механизмы, которые управляют доступом к данным, чтобы обеспечить их целостность и предотвратить конфликты при одновременном доступе нескольких транзакций.
🚩Основные типы
🟠Блокировки уровня таблицы (Table-Level Locks):
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).
🟠Блокировки уровня строки (Row-Level Locks):
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.
🟠Консультативные блокировки (Advisory Locks):
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.
🚩Основные цели
🟠Предотвращение гонок (race conditions):
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
🟠Изоляция транзакций:
Выполнение каждой транзакции в изолированном контексте.
🟠Защита целостности данных:
Предотвращение одновременного изменения данных, что может привести к их несогласованности.
🚩Примеры использования
🟠Интернет-магазин:
Блокировки могут предотвращать одновременное изменение состояния товара.
🟠Банковские операции:
При переводе средств используются блокировки для предотвращения одновременного списания или зачисления.
🟠Редактирование данных:
При одновременном редактировании одной записи несколькими пользователями.
🚩Проблемы, связанные с блокировками
🟠Дедлоки (Deadlocks):
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
🟠Гранулярность блокировок:
Блокировки высокой гранулярности могут снижать производительность.
Ставь 👍 и 📚
@backendquiz
Блокировки (локи) в базе данных - это механизмы, которые управляют доступом к данным, чтобы обеспечить их целостность и предотвратить конфликты при одновременном доступе нескольких транзакций.
🚩Основные типы
🟠Блокировки уровня таблицы (Table-Level Locks):
ACCESS SHARE: Позволяет чтение данных, блокирует команды, изменяющие таблицу.
ROW SHARE: Применяется для команд SELECT FOR UPDATE и SELECT FOR SHARE.
ROW EXCLUSIVE: Используется при вставке, обновлении или удалении строк.
SHARE UPDATE EXCLUSIVE: Используется для команд VACUUM.
SHARE: Обеспечивает видимость текущего состояния данных (ANALYZE).
SHARE ROW EXCLUSIVE: Используется для операций, требующих более строгого контроля (CREATE INDEX CONCURRENTLY).
EXCLUSIVE: Требуется для команд, изменяющих структуру таблицы (ALTER TABLE).
ACCESS EXCLUSIVE: Блокирует все команды, включая SELECT (DROP TABLE, ALTER TABLE).
🟠Блокировки уровня строки (Row-Level Locks):
SELECT FOR UPDATE: Блокирует строки для изменения.
SELECT FOR NO KEY UPDATE: Похоже на SELECT FOR UPDATE, но позволяет другим транзакциям выполнять SELECT FOR SHARE и SELECT FOR KEY SHARE.
SELECT FOR SHARE: Блокирует строки для чтения.
SELECT FOR KEY SHARE: Похоже на SELECT FOR SHARE, но позволяет другим транзакциям выполнять SELECT FOR NO KEY UPDATE и SELECT FOR UPDATE.
🟠Консультативные блокировки (Advisory Locks):
Устанавливаются вручную для синхронизации произвольных ресурсов.
pg_advisory_lock: Устанавливает консультативную блокировку.
pg_advisory_unlock: Снимает консультативную блокировку.
pg_try_advisory_lock: Пытается установить консультативную блокировку без ожидания.
🚩Основные цели
🟠Предотвращение гонок (race conditions):
Обеспечивают корректность данных при одновременном доступе нескольких транзакций.
🟠Изоляция транзакций:
Выполнение каждой транзакции в изолированном контексте.
🟠Защита целостности данных:
Предотвращение одновременного изменения данных, что может привести к их несогласованности.
🚩Примеры использования
🟠Интернет-магазин:
Блокировки могут предотвращать одновременное изменение состояния товара.
🟠Банковские операции:
При переводе средств используются блокировки для предотвращения одновременного списания или зачисления.
🟠Редактирование данных:
При одновременном редактировании одной записи несколькими пользователями.
🚩Проблемы, связанные с блокировками
🟠Дедлоки (Deadlocks):
Ситуация, когда транзакции блокируют друг друга, ожидая освобождения ресурсов.
🟠Гранулярность блокировок:
Блокировки высокой гранулярности могут снижать производительность.
Ставь 👍 и 📚
@backendquiz
🔥1
🤔 Какие существуют нормальные формы в SQL?
Это процесс организации данных для минимизации избыточности и избегания аномалий при внесении данных. Нормальные формы (NF) — это набор правил, которые помогают в нормализации баз данных.
🟠Первая нормальная форма (1NF)
Таблица находится в 1NF, если: Все столбцы содержат атомарные значения, то есть каждое значение в столбце неделимо. Все строки уникальны, нет повторяющихся строк.
Пример: Если у вас есть таблица с заказами, и каждый заказ может содержать несколько продуктов, вместо хранения всех продуктов в одном столбце, нужно разбить их на отдельные строки.
🟠Вторая нормальная форма (2NF)
Таблица находится во 2NF, если: Она находится в 1NF. Все неключевые столбцы полностью зависят от всего первичного ключа, а не от его части.
Пример
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.
🟠Третья нормальная форма (3NF)
Таблица находится в 3NF, если: Она находится во 2NF. Все неключевые столбцы зависят только от первичного ключа, а не от других неключевых столбцов.
Пример
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.
🟠Бойс-Кодд нормальная форма (BCNF)
Таблица находится в BCNF, если: Она находится в 3NF. Для каждой функциональной зависимости X -> Y, X является суперключом.
Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.
🟠Четвертая нормальная форма (4NF)
Таблица находится в 4NF, если: Она находится в BCNF. В ней нет многозначных зависимостей (Multivalued Dependencies).
Пример:
Если студент может записаться на несколько курсов и участвовать в нескольких клубах, то эти зависимости должны быть вынесены в отдельные таблицы.
🟠Пятая нормальная форма (5NF)
Таблица находится в 5NF, если: Она находится в 4NF. В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.
Пример:
Если у вас есть сложные зависимости между несколькими таблицами, то нужно убедиться, что все соединения этих таблиц могут быть разложены обратно без потери информации.
🟠Доменино-ключевая нормальная форма (DKNF)
Таблица находится в DKNF, если: Все ограничения и зависимости выражаются только через домены и ключи таблицы, и отсутствуют аномалии при вставке, обновлении или удалении данных.
Ставь 👍 и 📚
@backendquiz
Это процесс организации данных для минимизации избыточности и избегания аномалий при внесении данных. Нормальные формы (NF) — это набор правил, которые помогают в нормализации баз данных.
🟠Первая нормальная форма (1NF)
Таблица находится в 1NF, если: Все столбцы содержат атомарные значения, то есть каждое значение в столбце неделимо. Все строки уникальны, нет повторяющихся строк.
Пример: Если у вас есть таблица с заказами, и каждый заказ может содержать несколько продуктов, вместо хранения всех продуктов в одном столбце, нужно разбить их на отдельные строки.
🟠Вторая нормальная форма (2NF)
Таблица находится во 2NF, если: Она находится в 1NF. Все неключевые столбцы полностью зависят от всего первичного ключа, а не от его части.
Пример
Если в таблице "Заказы" у вас есть составной ключ (OrderID, ProductID), то столбцы, зависящие только от OrderID (например, OrderDate), должны быть вынесены в отдельную таблицу.
🟠Третья нормальная форма (3NF)
Таблица находится в 3NF, если: Она находится во 2NF. Все неключевые столбцы зависят только от первичного ключа, а не от других неключевых столбцов.
Пример
Если в таблице "Сотрудники" у вас есть столбцы EmployeeID, DepartmentID и DepartmentName, нужно вынести DepartmentName в отдельную таблицу "Департаменты", чтобы избежать зависимости между неключевыми столбцами.
🟠Бойс-Кодд нормальная форма (BCNF)
Таблица находится в BCNF, если: Она находится в 3NF. Для каждой функциональной зависимости X -> Y, X является суперключом.
Пример:
Если в таблице "Курс" есть зависимости (Professor, Course) -> Room и Room -> Capacity, необходимо реструктурировать таблицу так, чтобы не было зависимостей, где детерминанты не являются суперключами.
🟠Четвертая нормальная форма (4NF)
Таблица находится в 4NF, если: Она находится в BCNF. В ней нет многозначных зависимостей (Multivalued Dependencies).
Пример:
Если студент может записаться на несколько курсов и участвовать в нескольких клубах, то эти зависимости должны быть вынесены в отдельные таблицы.
🟠Пятая нормальная форма (5NF)
Таблица находится в 5NF, если: Она находится в 4NF. В ней нет соединительных зависимостей (Join Dependencies), которые нельзя разделить без потери данных.
Пример:
Если у вас есть сложные зависимости между несколькими таблицами, то нужно убедиться, что все соединения этих таблиц могут быть разложены обратно без потери информации.
🟠Доменино-ключевая нормальная форма (DKNF)
Таблица находится в DKNF, если: Все ограничения и зависимости выражаются только через домены и ключи таблицы, и отсутствуют аномалии при вставке, обновлении или удалении данных.
Ставь 👍 и 📚
@backendquiz