🤔 Как сделать так, чтобы приложение разворачивалось быстрее в Dockerе?
Для ускорения развертывания приложений в Docker существует несколько методов и практик, которые помогают оптимизировать сборку и запуск контейнеров. Вот некоторые из них:
🚩Оптимизация Dockerfile
🟠Меньше слоев
Каждая инструкция в Dockerfile создает новый слой в образе. Старайтесь минимизировать количество слоев, объединяя инструкции, где это возможно.
🟠Использование правильного базового образа
Выберите наиболее подходящий базовый образ, который минимально необходим для вашего приложения. Использование минималистичных образов, таких как
🟠Кэширование зависимостей
Сначала копируйте файлы с зависимостями (например,
🟠Использование многоступенчатой сборки
Многоступенчатая сборка позволяет собирать и тестировать ваше приложение в одном этапе и копировать только необходимые файлы в финальный образ, что уменьшает размер финального образа.
🟠Использование кэша сборки
При разработке используйте кэш Docker для ускорения сборки. Для этого нужно правильно организовать порядок инструкций в Dockerfile, чтобы неизменные части использовали кэш.
🟠Оптимизация Docker Compose
Если вы используете Docker Compose, убедитесь, что сервисы поднимаются параллельно и что вы используете возможность кэширования сборок.
🟠Использование кэшированных слоев и промежуточных образов
При частых изменениях кода старайтесь кэшировать слои, которые не меняются, и использовать промежуточные образы для ускорения сборки.
🟠Использование готовых образов для разработки
Используйте готовые образы, где уже установлены все необходимые зависимости для разработки, что сократит время сборки образов.
🟠Параллельная сборка и запуск
Используйте параллельную сборку и запуск контейнеров, если это возможно. Docker Compose поддерживает параллельный запуск, что может значительно ускорить процесс развертывания.
Ставь 👍 и забирай 📚 Базу знаний
Для ускорения развертывания приложений в Docker существует несколько методов и практик, которые помогают оптимизировать сборку и запуск контейнеров. Вот некоторые из них:
🚩Оптимизация Dockerfile
🟠Меньше слоев
Каждая инструкция в Dockerfile создает новый слой в образе. Старайтесь минимизировать количество слоев, объединяя инструкции, где это возможно.
# Плохо
RUN apt-get update
RUN apt-get install -y curl
RUN apt-get install -y vim
# Хорошо
RUN apt-get update && \
apt-get install -y curl vim
🟠Использование правильного базового образа
Выберите наиболее подходящий базовый образ, который минимально необходим для вашего приложения. Использование минималистичных образов, таких как
alpine, может существенно уменьшить размер образа.FROM php:7.4-fpm-alpine
🟠Кэширование зависимостей
Сначала копируйте файлы с зависимостями (например,
composer.json, package.json) и устанавливайте их, а затем копируйте остальной код. Это позволит Docker использовать кэш на этапе установки зависимостей, если они не изменились.FROM php:7.4-fpm-alpine
# Установка зависимостей
COPY composer.json composer.lock /app/
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
# Копирование кода
COPY . /app
🟠Использование многоступенчатой сборки
Многоступенчатая сборка позволяет собирать и тестировать ваше приложение в одном этапе и копировать только необходимые файлы в финальный образ, что уменьшает размер финального образа.
# Сборочный этап
FROM composer:latest AS builder
WORKDIR /app
COPY composer.json composer.lock /app/
RUN composer install --no-dev --optimize-autoloader
# Финальный этап
FROM php:7.4-fpm-alpine
WORKDIR /app
COPY --from=builder /app /app
COPY . /app
🟠Использование кэша сборки
При разработке используйте кэш Docker для ускорения сборки. Для этого нужно правильно организовать порядок инструкций в Dockerfile, чтобы неизменные части использовали кэш.
🟠Оптимизация Docker Compose
Если вы используете Docker Compose, убедитесь, что сервисы поднимаются параллельно и что вы используете возможность кэширования сборок.
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app
ports:
- "8080:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app_db
ports:
- "3306:3306"
🟠Использование кэшированных слоев и промежуточных образов
При частых изменениях кода старайтесь кэшировать слои, которые не меняются, и использовать промежуточные образы для ускорения сборки.
# Использование промежуточного образа
FROM php:7.4-fpm-alpine AS base
COPY . /app
WORKDIR /app
RUN composer install --no-dev --optimize-autoloader
FROM base AS dev
RUN apk add --no-cache bash
CMD ["php-fpm"]
FROM base AS prod
CMD ["php-fpm"]
🟠Использование готовых образов для разработки
Используйте готовые образы, где уже установлены все необходимые зависимости для разработки, что сократит время сборки образов.
🟠Параллельная сборка и запуск
Используйте параллельную сборку и запуск контейнеров, если это возможно. Docker Compose поддерживает параллельный запуск, что может значительно ускорить процесс развертывания.
Ставь 👍 и забирай 📚 Базу знаний
👍1💊1
🤔 Разница между pull и fetch?
git pull выполняет fetch (загружает изменения из удалённого репозитория) и автоматически сливает их с локальной веткой. git fetch только загружает изменения, не изменяя локальные файлы, что позволяет вручную контролировать слияние.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Как спроектировать базу данных?
Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям.
🟠Определение требований и структуры данных
Сначала нужно понять, какие данные будут храниться и как они связаны.
Какие объекты будут в системе? (например, пользователи, заказы, товары).
Как они связаны друг с другом? (например, один пользователь может делать много заказов).
Какие поля нужны в каждой таблице? (например,
- Какие запросы будут выполняться чаще всего?
Пример: интернет-магазин
Пользователи (
Товары (
Заказы (
Связь между заказами и товарами (
🟠Определение таблиц и связей (ERD – диаграмма)
Разделяем данные по таблицам и определяем связи (1-к-1, 1-к-N, N-к-N).
Связи между таблицами:
1-к-1 → один профиль = один пользователь (
1-к-N → один пользователь = много заказов (
N-к-N → один заказ = много товаров, и один товар может быть в разных заказах (
SQL-создание таблиц
Ставь 👍 и забирай 📚 Базу знаний
Проектирование базы данных – это ключевой этап в создании любой системы, где хранятся данные. Если БД спроектирована плохо, это приведёт к медленной работе, избыточности данных и сложным обновлениям.
🟠Определение требований и структуры данных
Сначала нужно понять, какие данные будут храниться и как они связаны.
Какие объекты будут в системе? (например, пользователи, заказы, товары).
Как они связаны друг с другом? (например, один пользователь может делать много заказов).
Какие поля нужны в каждой таблице? (например,
email, password, created_at). - Какие запросы будут выполняться чаще всего?
Пример: интернет-магазин
Пользователи (
users) Товары (
products) Заказы (
orders) Связь между заказами и товарами (
order_items) 🟠Определение таблиц и связей (ERD – диаграмма)
Разделяем данные по таблицам и определяем связи (1-к-1, 1-к-N, N-к-N).
Связи между таблицами:
1-к-1 → один профиль = один пользователь (
users → user_profiles). 1-к-N → один пользователь = много заказов (
users → orders). N-к-N → один заказ = много товаров, и один товар может быть в разных заказах (
orders ↔️ products). Users (id) --- (1:N) --- Orders (id, user_id) --- (N:M) --- Order_Items (order_id, product_id, quantity)
Products (id)
SQL-создание таблиц
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
email VARCHAR(255) UNIQUE,
password VARCHAR(255),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255),
price DECIMAL(10,2),
stock INT
);
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE order_items (
order_id INT,
product_id INT,
quantity INT,
PRIMARY KEY (order_id, product_id),
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id) ON DELETE CASCADE
);
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Для чего предназначены форматы запросов и ответов приложения?
Форматы запросов и ответов обеспечивают обмен данными между клиентом и сервером.
Популярные форматы:
- JSON – компактный, удобный для API.
- XML – читаемый, часто используется в SOAP.
- YAML – удобен для конфигураций.
- Protobuf – бинарный, эффективный для высоконагруженных систем.
Форматы обеспечивают унифицированное взаимодействие между различными сервисами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Форматы запросов и ответов обеспечивают обмен данными между клиентом и сервером.
Популярные форматы:
- JSON – компактный, удобный для API.
- XML – читаемый, часто используется в SOAP.
- YAML – удобен для конфигураций.
- Protobuf – бинарный, эффективный для высоконагруженных систем.
Форматы обеспечивают унифицированное взаимодействие между различными сервисами.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1
🤔 Какое отличие у протоколов tcp и udp?
Это два основных транспортных протокола в интернете. Они имеют разные характеристики и используются для различных целей.
🚩Основные отличия
🟠Надежность
TCP: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (ACK), контроль потерь пакетов, повторную передачу потерянных пакетов и контроль потока. Это гарантирует, что данные будут доставлены корректно и в правильном порядке.
UDP: Не обеспечивает надежную передачу данных. Нет подтверждений получения, нет повторной передачи потерянных пакетов и нет контроля потока. Это делает передачу менее надежной, но более быстрой и с меньшими накладными расходами.
🟠Установление соединения
TCP: Перед началом передачи данных устанавливается соединение с помощью процедуры "трехстороннего рукопожатия" (three-way handshake). Это означает, что обе стороны сначала обмениваются сигналами SYN и ACK для установления соединения.
UDP: Не требует установления соединения. Пакеты (датаграммы) просто отправляются к получателю без предварительного установления соединения.
🟠Порядок доставки
TCP: Обеспечивает доставку данных в правильном порядке. Если пакеты приходят в неправильном порядке, TCP собирает их в правильном порядке перед передачей приложению.
UDP: Не гарантирует порядок доставки. Пакеты могут приходить в произвольном порядке, и приложение должно обрабатывать их соответствующим образом, если это необходимо.
🟠Пропускная способность и задержки
TCP: Из-за механизмов контроля потока и подтверждений имеет большие накладные расходы и, следовательно, может быть медленнее. Это особенно заметно на сетях с высокой задержкой или потерей пакетов.
UDP: Из-за отсутствия контроля потока и подтверждений имеет меньшие накладные расходы, что может привести к меньшим задержкам и большей пропускной способности. Подходит для приложений, где важна скорость, а не надежность.
🟠Применение
TCP: Используется для приложений, где важна надежность и порядок передачи данных, таких как веб-браузеры (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3), файловые передачи (FTP), удаленный доступ (SSH).
UDP: Используется для приложений, где важна скорость и где потеря некоторых пакетов не критична, таких как потоковое видео и аудио (VoIP, IPTV), онлайн-игры, службы доменных имен (DNS).
🚩Примеры использования
TCP
UDP
Ставь 👍 и забирай 📚 Базу знаний
Это два основных транспортных протокола в интернете. Они имеют разные характеристики и используются для различных целей.
🚩Основные отличия
🟠Надежность
TCP: Обеспечивает надежную передачу данных. Он использует механизмы установления соединения, подтверждение получения (ACK), контроль потерь пакетов, повторную передачу потерянных пакетов и контроль потока. Это гарантирует, что данные будут доставлены корректно и в правильном порядке.
UDP: Не обеспечивает надежную передачу данных. Нет подтверждений получения, нет повторной передачи потерянных пакетов и нет контроля потока. Это делает передачу менее надежной, но более быстрой и с меньшими накладными расходами.
🟠Установление соединения
TCP: Перед началом передачи данных устанавливается соединение с помощью процедуры "трехстороннего рукопожатия" (three-way handshake). Это означает, что обе стороны сначала обмениваются сигналами SYN и ACK для установления соединения.
UDP: Не требует установления соединения. Пакеты (датаграммы) просто отправляются к получателю без предварительного установления соединения.
🟠Порядок доставки
TCP: Обеспечивает доставку данных в правильном порядке. Если пакеты приходят в неправильном порядке, TCP собирает их в правильном порядке перед передачей приложению.
UDP: Не гарантирует порядок доставки. Пакеты могут приходить в произвольном порядке, и приложение должно обрабатывать их соответствующим образом, если это необходимо.
🟠Пропускная способность и задержки
TCP: Из-за механизмов контроля потока и подтверждений имеет большие накладные расходы и, следовательно, может быть медленнее. Это особенно заметно на сетях с высокой задержкой или потерей пакетов.
UDP: Из-за отсутствия контроля потока и подтверждений имеет меньшие накладные расходы, что может привести к меньшим задержкам и большей пропускной способности. Подходит для приложений, где важна скорость, а не надежность.
🟠Применение
TCP: Используется для приложений, где важна надежность и порядок передачи данных, таких как веб-браузеры (HTTP/HTTPS), электронная почта (SMTP, IMAP, POP3), файловые передачи (FTP), удаленный доступ (SSH).
UDP: Используется для приложений, где важна скорость и где потеря некоторых пакетов не критична, таких как потоковое видео и аудио (VoIP, IPTV), онлайн-игры, службы доменных имен (DNS).
🚩Примеры использования
TCP
HTTP/HTTPS: Веб-серфинг
SMTP: Отправка электронной почты
IMAP/POP3: Получение электронной почты
FTP: Передача файлов
SSH: Безопасный удаленный доступ
UDP
DNS: Запросы доменных имен
VoIP: Передача голоса через IP
IPTV: Потоковое видео
Онлайн-игры: Быстрая передача данных игровой логики
NTP: Синхронизация времени
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 В чем заключается обработка ошибок и исключений?
Это механизм выявления и реагирования на непредвиденные ситуации в коде.
- Ошибки (Errors) – критические сбои (OutOfMemoryError, StackOverflowError).
- Исключения (Exceptions) – проблемы в логике (NullPointerException, IOException).
Обрабатываются с помощью try-catch-finally, throw, throws, а также глобальных обработчиков (onError, fallback strategies).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это механизм выявления и реагирования на непредвиденные ситуации в коде.
- Ошибки (Errors) – критические сбои (OutOfMemoryError, StackOverflowError).
- Исключения (Exceptions) – проблемы в логике (NullPointerException, IOException).
Обрабатываются с помощью try-catch-finally, throw, throws, а также глобальных обработчиков (onError, fallback strategies).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍3
🤔 Какие могут быть проблемы от Join'а?
Использование
🟠Производительность (нагрузка на БД)
Чем больше данных соединяется, тем больше ресурсов требуется.
Проблема:
Решение:
Добавить индексы на поля, по которым идёт соединение.
Использовать
🟠Дублирование строк (Картезианское произведение)
Если используется
Проблема:
Решение
Всегда указывать
🟠Потеря данных при `INNER JOIN`
Проблема
Решение: Использовать
🟠Медленный `JOIN` на `TEXT` или `VARCHAR`
Проблема
🟠Несовместимость типов данных
Если соединяются таблицы с разными типами данных (
Проблема
Решение
- Убедиться, что типы данных совпадают (
- Привести к нужному типу:
Ставь 👍 и забирай 📚 Базу знаний
Использование
JOIN в SQL может привести к нескольким проблемам, особенно при работе с большими таблицами. Рассмотрим основные из них. 🟠Производительность (нагрузка на БД)
Чем больше данных соединяется, тем больше ресурсов требуется.
Проблема:
JOIN создаёт временную таблицу в памяти, что замедляет запрос. Если нет индексов, соединение идёт через полный перебор (Nested Loop Join), что очень медленно. Решение:
Добавить индексы на поля, по которым идёт соединение.
Использовать
EXPLAIN для анализа запроса. EXPLAIN SELECT * FROM users JOIN orders ON users.id = orders.user_id;
🟠Дублирование строк (Картезианское произведение)
Если используется
JOIN, но нет условия соединения (ON), запрос создаст все возможные комбинации строк. Проблема:
SELECT * FROM users, orders;
Решение
Всегда указывать
ON или USING: SELECT * FROM users JOIN orders ON users.id = orders.user_id;
🟠Потеря данных при `INNER JOIN`
INNER JOIN возвращает только совпадающие строки, из-за чего можно потерять данные. Проблема
SELECT users.id, users.name, orders.id AS order_id
FROM users
INNER JOIN orders ON users.id = orders.user_id;
Решение: Использовать
LEFT JOIN, если нужны все пользователи, даже без заказов: SELECT users.id, users.name, orders.id AS order_id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
🟠Медленный `JOIN` на `TEXT` или `VARCHAR`
JOIN по строковым полям (VARCHAR, TEXT) работает медленнее, чем по числовым (INT). Проблема
SELECT * FROM users JOIN orders ON users.email = orders.email;
🟠Несовместимость типов данных
Если соединяются таблицы с разными типами данных (
INT vs VARCHAR), может быть скрытое приведение типов, которое замедляет запрос. Проблема
SELECT * FROM users
JOIN orders ON users.id = orders.user_id;
Решение
- Убедиться, что типы данных совпадают (
INT = INT). - Привести к нужному типу:
SELECT * FROM users
JOIN orders ON users.id = CAST(orders.user_id AS INT);
Ставь 👍 и забирай 📚 Базу знаний
👍1
🤔 Что такое рекурсия?
Рекурсия — это метод в программировании, при котором функция вызывает сама себя. Рекурсия используется для решения задач, которые можно разбить на более мелкие, однотипные задачи.?
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1
🤔 Зачем использовать Rest , если есть Soup?
SOAP (Simple Object Access Protocol) и REST (Representational State Transfer) – это два подхода для обмена данными между клиентом и сервером (API).
SOAP появился раньше, но REST стал более популярным, потому что он проще, быстрее и гибче.
🚩Почему REST лучше в большинстве случаев?
🟠REST проще и легче
SOAP использует сложные XML-сообщения с заголовками и схемами, что делает запросы более громоздкими.
REST использует JSON или XML, что делает его быстрее и удобнее.
Пример запроса в REST (короче и проще)
🟠REST быстрее и легче для веба
SOAP требует больше ресурсов, потому что использует XML + сложные заголовки.
REST работает по HTTP и использует JSON, который легче парсится в браузере и мобильных приложениях.
🟠REST лучше интегрируется с веб-технологиями
SOAP требует специальных библиотек (WSDL, WS-Security).
REST использует обычные HTTP-методы:
-
-
-
-
🟠REST масштабируемый и кроссплатформенный
REST легко работает с JavaScript, мобильными приложениями (iOS, Android), браузерами и фронтендом.
SOAP чаще используется в корпоративных системах (банки, госструктуры), но хуже подходит для современных веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
SOAP (Simple Object Access Protocol) и REST (Representational State Transfer) – это два подхода для обмена данными между клиентом и сервером (API).
SOAP появился раньше, но REST стал более популярным, потому что он проще, быстрее и гибче.
🚩Почему REST лучше в большинстве случаев?
🟠REST проще и легче
SOAP использует сложные XML-сообщения с заголовками и схемами, что делает запросы более громоздкими.
REST использует JSON или XML, что делает его быстрее и удобнее.
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<getUser>
<id>123</id>
</getUser>
</soap:Body>
</soap:Envelope>
Пример запроса в REST (короче и проще)
GET /users/123 HTTP/1.1
Host: api.example.com
🟠REST быстрее и легче для веба
SOAP требует больше ресурсов, потому что использует XML + сложные заголовки.
REST работает по HTTP и использует JSON, который легче парсится в браузере и мобильных приложениях.
🟠REST лучше интегрируется с веб-технологиями
SOAP требует специальных библиотек (WSDL, WS-Security).
REST использует обычные HTTP-методы:
-
GET – получить данные -
POST – создать -
PUT – обновить -
DELETE – удалить 🟠REST масштабируемый и кроссплатформенный
REST легко работает с JavaScript, мобильными приложениями (iOS, Android), браузерами и фронтендом.
SOAP чаще используется в корпоративных системах (банки, госструктуры), но хуже подходит для современных веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
👍1🤔1
🤔 Что такое блокировки и зачем они?
Это механизм синхронизации доступа к данным, предотвращающий одновременное изменение записей.
1. Они используются для обеспечения целостности данных в многопользовательских системах.
2. Различают уровни блокировок: строковые, табличные и на уровне транзакций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Это механизм синхронизации доступа к данным, предотвращающий одновременное изменение записей.
1. Они используются для обеспечения целостности данных в многопользовательских системах.
2. Различают уровни блокировок: строковые, табличные и на уровне транзакций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
👍1🔥1
🤔 Как устроен типичный тест на opening point?
Тест на Opening Point проверяет, корректно ли открывается доступ к ресурсу.
Он может включать:
- Авторизацию – доступ пользователя после входа.
- Перенаправления – корректный редирект при попытке входа.
- Доступность URL – проверка HTTP-ответа (например, 200 OK).
- Безопасность – отсутствие утечек при открытии ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Тест на Opening Point проверяет, корректно ли открывается доступ к ресурсу.
Он может включать:
- Авторизацию – доступ пользователя после входа.
- Перенаправления – корректный редирект при попытке входа.
- Доступность URL – проверка HTTP-ответа (например, 200 OK).
- Безопасность – отсутствие утечек при открытии ресурса.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
🤔 Что знаешь про нормальные формы в БД?
Нормальные формы (Normal Forms, NF) в базах данных — это правила, которые помогают организовать данные так, чтобы избежать избыточности и аномалий при обновлении, удалении и вставке.
🚩Основные нормальные формы
🟠Первая нормальная форма (1NF)
убирает повторяющиеся группы и делает все столбцы атомарными.
Что нужно сделать?
Каждое поле должно содержать только одно значение.
В таблице нет повторяющихся строк.
🟠Вторая нормальная форма (2NF)
убирает зависимости от части составного ключа.
Что нужно сделать?
Данные, которые зависят не от всего первичного ключа, вынести в отдельные таблицы.
Должна быть уже в 1NF.
🟠Третья нормальная форма (3NF)
убирает транзитивные зависимости.
Что нужно сделать?
Данные должны зависеть только от первичного ключа и не зависеть от других неключевых полей.
Должна быть уже в 2NF.
🚩Дополнительные нормальные формы
🟠Бойса-Кодда (BCNF)
более строгая версия 3NF, исключает случаи, когда таблица имеет несколько потенциальных ключей, но один из них влияет на другой.
🟠Четвёртая нормальная форма (4NF)
убирает многозначные зависимости (например, если студент изучает несколько предметов, но предметы никак не связаны друг с другом).
🟠Пятая нормальная форма (5NF)
разбиение таблицы на подтаблицы для минимизации избыточности данных.
Ставь 👍 и забирай 📚 Базу знаний
Нормальные формы (Normal Forms, NF) в базах данных — это правила, которые помогают организовать данные так, чтобы избежать избыточности и аномалий при обновлении, удалении и вставке.
🚩Основные нормальные формы
🟠Первая нормальная форма (1NF)
убирает повторяющиеся группы и делает все столбцы атомарными.
Что нужно сделать?
Каждое поле должно содержать только одно значение.
В таблице нет повторяющихся строк.
🟠Вторая нормальная форма (2NF)
убирает зависимости от части составного ключа.
Что нужно сделать?
Данные, которые зависят не от всего первичного ключа, вынести в отдельные таблицы.
Должна быть уже в 1NF.
🟠Третья нормальная форма (3NF)
убирает транзитивные зависимости.
Что нужно сделать?
Данные должны зависеть только от первичного ключа и не зависеть от других неключевых полей.
Должна быть уже в 2NF.
🚩Дополнительные нормальные формы
🟠Бойса-Кодда (BCNF)
более строгая версия 3NF, исключает случаи, когда таблица имеет несколько потенциальных ключей, но один из них влияет на другой.
🟠Четвёртая нормальная форма (4NF)
убирает многозначные зависимости (например, если студент изучает несколько предметов, но предметы никак не связаны друг с другом).
🟠Пятая нормальная форма (5NF)
разбиение таблицы на подтаблицы для минимизации избыточности данных.
Ставь 👍 и забирай 📚 Базу знаний
🤔 Что такое замыкание?
Это функция, которая «захватывает» переменные из внешней области видимости, в которой она была создана.
1. Оно позволяет использовать внешние переменные даже после завершения их контекста.
2. Замыкания полезны для сохранения состояния и создания функций с заранее заданными параметрами.
3. Пример: функция, возвращающая другую функцию, которая использует переменные из замыкающего контекста.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
1. Оно позволяет использовать внешние переменные даже после завершения их контекста.
2. Замыкания полезны для сохранения состояния и создания функций с заранее заданными параметрами.
3. Пример: функция, возвращающая другую функцию, которая использует переменные из замыкающего контекста.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний