Backend
3.95K subscribers
35 photos
705 links
Комьюнити Backend программистов.
Python, Java, Golang, PHP, C#, C/C++, DevOps

Сайт easyoffer.ru
Реклама @easyoffer_adv
ВП @easyoffer_vp
Download Telegram
🤔 Чем отличаются LEFT JOIN от INNER JOIN?

Это два типа соединений (joins) в языке SQL, которые используются для объединения строк из двух или более таблиц на основе связанных столбцов. Основное различие между ними заключается в том, какие строки включаются в результирующий набор данных.

🚩INNER JOIN

Возвращает только те строки, которые имеют совпадающие значения в обеих таблицах, участвующих в соединении. Возвращает строки, где существует совпадение значений в обоих таблицах. Если нет совпадающих значений, строка не будет включена в результирующий набор.
SELECT Employees.name, Departments.department_name
FROM Employees
INNER JOIN Departments ON Employees.department_id = Departments.id;


🚩LEFT JOIN

Возвращает все строки из левой таблицы (первой таблицы в запросе) и соответствующие строки из правой таблицы. Если в правой таблице нет совпадающих строк, в результирующем наборе будут NULL значения для столбцов правой таблицы. Возвращает все строки из левой таблицы и соответствующие строки из правой таблицы. Если в правой таблице нет соответствия, возвращаются NULL значения для правой таблицы.
SELECT Employees.name, Departments.department_name
FROM Employees
LEFT JOIN Departments ON Employees.department_id = Departments.id;


🚩Сравнение

🟠INNER JOIN
Возвращает только совпадающие строки. Если нет совпадений, строки не включаются в результат.

🟠LEFT JOIN
Возвращает все строки из левой таблицы. Включает совпадающие строки из правой таблицы. Если нет совпадений, строки из правой таблицы будут заполнены NULL значениями.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 В чем разница char и varchar в SQL ?

Это два типа данных в SQL, которые используются для хранения строковых данных. Основные различия между ними касаются способа хранения данных и управления памятью.

🚩`CHAR` (Fixed-length Character Data)

🟠Фиксированная длина
CHAR(n) хранит строки фиксированной длины n. Если строка короче, она дополняется пробелами до указанной длины.

🟠Использование памяти
Использует фиксированное количество памяти, равное указанной длине n, независимо от фактической длины строки.

🟠Производительность
Может быть быстрее в некоторых случаях, так как длина строк фиксирована и известна заранее, что упрощает управление памятью.

🟠Пример использования
Подходит для хранения данных, которые всегда имеют одинаковую длину, например, коды стран, идентификаторы и т.д.

CREATE TABLE example (
fixed_char CHAR(10)
);


🚩`VARCHAR` (Variable-length Character Data)

🟠Переменная длина
VARCHAR(n) хранит строки переменной длины, где n — это максимальная длина строки. Реальная длина строки определяется по количеству символов в ней.

🟠Использование памяти
Использует только столько памяти, сколько необходимо для хранения фактической длины строки, плюс дополнительные байты для хранения информации о длине строки.

🟠Производительность
Может быть менее эффективным в некоторых случаях по сравнению с CHAR, так как длина строки не фиксирована и требует дополнительной обработки для управления памятью.

🟠Пример использования
Подходит для хранения данных, длина которых может варьироваться, например, имена, адреса, описания и т.д.

CREATE TABLE example (
variable_char VARCHAR(50)
);


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
🤔 Почему NULL часто называют «Ошибкой на миллиард долларов»?

Термин «Ошибка на миллиард долларов» (The Billion Dollar Mistake) был введён Тони Хоаром (Tony Hoare), создателем NULL, который в 2009 году на конференции признался, что введение NULL было его крупнейшей ошибкой. Название связано с тем, что NULL стал причиной множества багов, сбоев в программах и уязвимостей, что привело к огромным финансовым потерям в индустрии.

🚩Какие проблемы вызывает `NULL`?

🟠NullPointerException (NPE) и аварийные сбои
- Попытка вызвать метод у NULL приводит к ошибке NullPointerException в Java, NullReferenceException в C# и аналогичным сбоям в других языках.
- Это одна из самых распространённых ошибок в программировании.

🟠Дополнительные проверки и сложность кода
- Из-за NULL приходится постоянно писать проверки if (x != null), что раздувает код и делает его менее читаемым.
- Если забыть такую проверку, можно получить неожиданный сбой.

🟠Слабая типизация и отсутствие явности
- NULL можно передавать в любую функцию или объект, что ломает строгую типизацию.
- Код становится менее предсказуемым.

🟠Проблемы с базами данных
- NULL в SQL ведёт себя неинтуитивно (NULL != NULL, сравнение может давать UNKNOWN).
- Может приводить к некорректным вычислениям в агрегатных функциях.

🟠Уязвимости в безопасности
- Некоторые атаки используют NULL для взлома систем (например, null dereference в C/C++ может привести к DoS-атаке).
- NULL может скрывать ошибки и приводить к утечке данных.

🚩Какие альтернативы `NULL`?

🟠Optional / Maybe (Java, Kotlin, Haskell, Rust)
- Использование обёрток вроде Optional<T> (Java) или Option<T> (Rust) позволяет явно указывать возможность отсутствия значения.

🟠Исключения вместо `NULL` (C# и Java)
- Вместо возврата NULL можно выбрасывать осмысленные исключения (IllegalArgumentException, NotFoundException).

🟠Специальные значения по умолчанию
- Вместо NULL можно использовать дефолтные объекты (EmptyList, GuestUser и т. д.).

🟠Типы-юнит (Tagged Union) в функциональных языках
- Например, в Haskell и Rust применяют Either<T, E>, Option<T>, что делает обработку NULL-подобных случаев более явной.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔Как определить, что у кода плохая организация?

Плохая организация кода — это один из главных факторов, который делает поддержку и развитие проекта сложными. Определить, что код плохо организован, можно по следующим признакам:

🟠Отсутствие структуры
- Файлы и каталоги разбросаны хаотично.
- Код находится в одном огромном файле без логического разделения.
- Нет четкой модулярности (всё смешано в одном месте).

🟠Дублирование кода
- Один и тот же фрагмент кода повторяется в разных местах вместо вынесения в отдельные функции или классы.
- При внесении изменений приходится исправлять одну и ту же логику в нескольких местах.

🟠Чрезмерная сложность
- Функции или методы слишком длинные и делают слишком много.
- Код трудно читать из-за вложенных конструкций (if, for, while и т. д.).
- Используются сложные алгоритмы там, где можно было бы обойтись более простыми.

🟠Нарушение принципов SOLID
- Один класс выполняет несколько задач (нарушение *Single Responsibility Principle*).
- Сильная зависимость между модулями (нарушение *Dependency Inversion Principle*).
- Проблемы с расширяемостью кода.

🟠Плохие наименования переменных, функций и классов
- Используются непонятные или слишком короткие названия (a, x1, doSomething).
- Название не отражает суть выполняемой операции.

🟠Отсутствие или избыточная документация
- Если документации нет, код сложно понять.
- Если документации слишком много, и она не актуальна, это также мешает.

🟠Сильная связанность (high coupling)
- Компоненты сильно зависят друг от друга, что усложняет тестирование и внесение изменений.
- Модули не могут использоваться независимо.

🟠Отсутствие тестов
- Если код сложно протестировать, это признак плохой организации.
- Нет юнит-тестов или они покрывают только тривиальные случаи.

🟠Отсутствие обработчиков ошибок
- Ошибки не логируются, а просто подавляются (try...catch с пустым catch).
- Ошибки обрабатываются хаотично.

🟠Проблемы с производительностью
- Избыточное потребление памяти или процессорных ресурсов из-за неоптимальных алгоритмов.
- Использование ненужных циклов, повторные вызовы функций.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔 В чем разница между Postgres и MySQL?

Это реляционные системы управления базами данных (СУБД), но у них есть значительные различия, которые влияют на выбор той или иной системы в зависимости от проекта.

🟠Архитектура и модель хранения данных
PostgreSQL — объектно-реляционная СУБД (ORDBMS), поддерживающая расширяемость, сложные структуры данных и расширенные функции. Она использует MVCC (Multiversion Concurrency Control) для обработки транзакций.
MySQL — классическая реляционная СУБД (RDBMS). По умолчанию использует механизм хранения InnoDB, который поддерживает ACID, но менее гибок, чем у PostgreSQL.

🟠Язык SQL и расширенные функции
PostgreSQL поддерживает более сложные SQL-конструкции, такие как CTE (Common Table Expressions), оконные функции, пользовательские типы данных и полнотекстовый поиск.
MySQL менее гибок в плане сложных SQL-запросов, хотя в новых версиях поддержка CTE и оконных функций была добавлена.

🟠Производительность
MySQL лучше работает на простых чтениях и небольших нагрузках, особенно в веб-приложениях, где важна скорость выполнения запросов.
PostgreSQL более оптимизирован для сложных аналитических запросов, работы с большими объемами данных и параллельной обработки.

🟠Расширяемость
PostgreSQL позволяет добавлять новые типы данных, операторы и даже писать пользовательские функции на различных языках (PL/pgSQL, Python, JavaScript и др.).
MySQL менее гибок, хотя поддерживает хранимые процедуры и триггеры.

🟠Совместимость с ACID и репликация
PostgreSQL полностью ACID-совместим, поддерживает сложные транзакции и строгую консистентность данных.
MySQL тоже поддерживает ACID (через InnoDB), но раньше его главная фишка была в высокой скорости за счет возможного ослабления требований к консистентности.

🟠Масштабируемость и репликация
MySQL традиционно использовался для масштабирования за счет мастер-слейв репликации и шардинга.
PostgreSQL поддерживает логическую и потоковую репликацию, а также такие расширения, как Citus, позволяющие эффективно масштабировать базу данных горизонтально.

🟠Поддержка JSON и NoSQL-функций
PostgreSQL изначально поддерживает JSONB, что делает его хорошим выбором для гибридных реляционно-документных решений.
MySQL тоже поддерживает JSON, но его функциональность более ограничена.

🟠Сообщество и лицензия
PostgreSQL — полностью open-source (лицензия PostgreSQL), активно развивается сообществом.
MySQL принадлежит Oracle, и хотя есть open-source-версия, некоторые функции доступны только в коммерческих редакциях.

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 В чем разница между MVC и MVVM?

Это две архитектурные паттерны, которые используются для разделения ответственности и улучшения структуры кода в приложениях. Несмотря на схожие цели, они имеют разные подходы к организации кода и взаимодействию компонентов.

🚩MVC (Model-View-Controller)

🟠Model (Модель)
Представляет данные и бизнес-логику. Модель отвечает за получение данных из базы данных, выполнение операций над ними и отправку обновлений обратно в представление через контроллер.

🟠View (Представление)
Отображает данные пользователю. Представление отвечает за визуальное представление данных, полученных от модели, и обновление интерфейса в ответ на изменения данных.

🟠Controller (Контроллер)
Обрабатывает пользовательские вводы и взаимодействует с моделью и представлением. Контроллер получает ввод от пользователя, обрабатывает его (например, валидирует данные), обновляет модель и выбирает соответствующее представление для отображения.

Пользователь взаимодействует с представлением (например, нажимает кнопку).
Контроллер обрабатывает это событие, изменяет данные в модели.
Модель уведомляет представление об изменениях.
Представление обновляет отображение данных для пользователя.

🚩MVVM (Model-View-ViewModel)

🟠Model (Модель)
Так же, как и в MVC, модель представляет данные и бизнес-логику. Модель не изменяется.

🟠View (Представление)
Отвечает за визуальное представление данных. В отличие от MVC, представление связывается с ViewModel, а не с контроллером.

🟠ViewModel (Модель представления)
Посредник между моделью и представлением. ViewModel содержит логику отображения и команду для представления. Он отвечает за преобразование данных из модели в форму, удобную для представления, и наоборот. ViewModel часто использует механизмы связывания данных (data binding) для автоматического обновления представления при изменении данных.

Представление связывается с ViewModel через механизмы привязки данных.
Пользователь взаимодействует с представлением (например, вводит текст).
ViewModel обновляет данные в модели.
Модель уведомляет ViewModel об изменениях.
ViewModel автоматически обновляет представление через привязку данных.

🚩Основные различия

🟠Связывание данных
В MVVM используется двустороннее связывание данных между представлением и ViewModel, что упрощает автоматическое обновление UI. В MVC такого механизма нет, и обновление представления осуществляется через контроллер.

🟠Посредник
В MVC контроллер действует как посредник между моделью и представлением. В MVVM эту роль выполняет ViewModel, который теснее интегрирован с представлением через привязку данных.

🟠Упрощение UI-логики
MVVM лучше подходит для сложных UI, так как позволяет выносить логику отображения в ViewModel, что делает код представления (UI) более чистым и простым. В MVC логика может оставаться в представлении или контроллере, что иногда усложняет структуру.

🟠Технологическая направленность
MVVM часто используется в приложениях, где активно применяется привязка данных, например, в WPF, Xamarin, Angular. MVC более универсален и часто используется в веб-приложениях (например, ASP.NET MVC).

Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1