Академический Документы
Профессиональный Документы
Культура Документы
Atomicity — Атомарность
Атомарность гарантирует, что никакая транзакция не будет зафиксирована в системе
частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной.
Поскольку на практике невозможно одновременно и атомарно выполнить всю
последовательность операций внутри транзакции, вводится понятие «отката»
(rollback): если транзакцию не удаётся полностью завершить, результаты всех её до
сих пор произведённых действий будут отменены и система вернётся во «внешне
исходное» состояние — со стороны будет казаться,взсчто транзакции и не было.
Consistency — Согласованность
Транзакция, достигающая своего нормального завершения (EOT — end of transaction,
завершение транзакции) и, тем самым, фиксирующая свои результаты, сохраняет
согласованность базы данных. Другими словами, каждая успешная транзакция по
определению фиксирует только допустимые результаты. Это условие является
необходимым для поддержки четвёртого свойства.
Isolation — Изолированность
Во время выполнения транзакции параллельные транзакции не должны оказывать
влияния на её результат.
Durability — Стойкость
Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или
сбои в оборудовании) изменения, сделанные успешно завершённой транзакцией,
должны остаться сохранёнными после возвращения системы в работу. Другими
словами, если пользователь получил подтверждение от системы, что транзакция
выполнена, он может быть уверен, что сделанные им изменения не будут отменены
из-за какого-либо сбоя.
Serializable (упорядочиваемость)
Самый высокий уровень изолированности; транзакции полностью изолируются друг от
друга, каждая выполняется так, как будто параллельных транзакций не существует. Только
на этом уровне параллельные транзакции не подвержены эффекту «фантомного чтения».
DRY
KISS
Keep it simple, stupid принцип проектирования, принятый в ВМС США в 1960. Принцип
KISS утверждает, что большинство систем работают лучше всего, если они остаются
простыми, а не усложняются. Поэтому в области проектирования простота должна быть
одной из ключевых целей, и следует избегать ненужной сложности.
Less is more подход к разработке программного обеспечения, объявляющий простоту
реализации и простоту интерфейса более важными, чем любые другие свойства
системы.
YAGNI
You aren't gonna need it»; с англ. — «Вам это не понадобится») — процесс и принцип
проектирования ПО, при котором в качестве основной цели и/или ценности
декларируется отказ от избыточной функциональности, — то есть отказ добавления
функциональности, в которой нет непосредственной надобности.
Unix way
SOLID
TDD
BDD
DDD
domain-driven design Предметно-ориентированное проектирование
это набор принципов и схем, направленных на создание оптимальных систем
объектов. Сводится к созданию программных абстракций, которые называются
моделями предметных областей. В эти модели входит бизнес-логика,
устанавливающая связь между реальными условиями области применения продукта и
кодом.
Концепции:
Элементы:
Общий смысл в том, что прежде чем что-то делать, надо придумать критерий
выполненной работы и критерий того, что работа сделана правильно.
Для приемочных тестов используется подход Given – When – Then (GWT). Суть та же,
только с другого ракурса.
Given описывает что «дано», т.е. состояние системы в начальный момент времени
When задает непосредственно триггер, который должен привести к результату. Чаще
всего это какое-то действие пользователя.
Then определяет результат этого действия, т.е. является критерием приемки.
UNIT TESTS
GRASP
Создатель (Creator)
создавать экземпляры класса должен класс, которому они нужны.
Класс должен создавать экземпляры тех классов, которые он может:
● Содержать или агрегировать;
● Записывать;
● Использовать;
● Инициализировать, имея нужные данные.
Контроллер (Controller)
Отвечает за операции, запросы на которые приходят от пользователя, и может
выполнять сценарии одного или нескольких вариантов использования (например,
создание и удаление);
Не выполняет работу самостоятельно, а делегирует компетентным исполнителям;
И наоборот, низкая связность — это ситуация, при которой данный элемент имеет
слишком много несвязанных обязанностей. Элементы с низкой связностью часто
страдают от того, что их трудно понять, трудно использовать, трудно поддерживать.
Полиморфизм (Polymorphism)
Устройство и поведение системы:
Определяется данными;
Задано полиморфными операциями её интерфейса. (способность функции
обрабатывать данные разных типов)
один интерфейс — много реализаций
Перенаправление (Indirection)
Необходимо распределить обязанности между объектами, избежав прямого
связывания. Для этого можно присвоить обязанности по обеспечению связи между
компонентами или службами промежуточному объекту.
Design Patterns
Порождающие паттерны
отвечают за удобное и безопасное создание новых объектов или даже целых семейств
объектов.
Фабричный метод
определяет общий интерфейс для создания объектов в суперклассе, позволяя
подклассам изменять тип создаваемых объектов.
Паттерн Фабричный метод предлагает создавать объекты не напрямую, используя
оператор new, а через вызов особого фабричного метода. Не пугайтесь, объекты всё
равно будут создаваться при помощи new, но делать это будет фабричный метод.
Абстрактная фабрика
позволяет создавать семейства связанных объектов, не привязываясь к конкретным
классам создаваемых объектов.
Для начала паттерн Абстрактная фабрика предлагает выделить общие интерфейсы
для отдельных продуктов, составляющих семейства. Так, все вариации кресел получат
общий интерфейс Кресло, все диваны реализуют интерфейс Диван и так далее.
Строитель
позволяет создавать сложные объекты пошагово. Строитель даёт возможность
использовать один и тот же код строительства для получения разных представлений
объектов.
Паттерн Строитель предлагает вынести конструирование объекта за пределы его
собственного класса, поручив это дело отдельным объектам, называемым
строителями.
Прототип
позволяет копировать объекты, не вдаваясь в подробности их реализации.
Паттерн Прототип поручает создание копий самим копируемым объектам. Он вводит
общий интерфейс для всех объектов, поддерживающих клонирование. Это позволяет
копировать объекты, не привязываясь к их конкретным классам. Обычно такой
интерфейс имеет всего один метод clone.
Одиночка
гарантирует, что у класса есть только один экземпляр, и предоставляет к нему
глобальную точку доступа.
Структурные паттерны
Мост
разделяет один или несколько классов на две отдельные иерархии — абстракцию и
реализацию, позволяя изменять их независимо друг от друга.
Паттерн Мост предлагает заменить наследование агрегацией или композицией. Для
этого нужно выделить одну из таких «плоскостей» в отдельную иерархию и ссылаться
на объект этой иерархии, вместо хранения его состояния и поведения внутри одного
класса.
У вас есть класс геометрических Фигур, который имеет подклассы Круг и Квадрат. Вы
хотите расширить иерархию фигур по цвету, то есть иметь Красные и Синие фигуры.
Но чтобы всё это объединить, вам придётся создать 4 комбинации подклассов, вроде
СиниеКруги и КрасныеКвадраты.
Корень проблемы заключается в том, что мы пытаемся расширить классы фигур сразу
в двух независимых плоскостях — по виду и по цвету. Именно это приводит к
разрастанию дерева классов.
Компоновщик
Агрегат из DDD
Декоратор
позволяет динамически добавлять объектам новую функциональность, оборачивая их
в полезные «обёртки».
Декоратор имеет альтернативное название — обёртка. Оно более точно описывает
суть паттерна: вы помещаете целевой объект в другой объект-обёртку, который
запускает базовое поведение объекта, а затем добавляет к результату что-то своё.
Оба объекта имеют общий интерфейс, поэтому для пользователя нет никакой
разницы, с каким объектом работать — чистым или обёрнутым.
Фасад
предоставляет простой интерфейс к сложной системе классов, библиотеке или
фреймворку.
Легковес
позволяет вместить бóльшее количество объектов в отведённую оперативную память.
Легковес экономит память, разделяя общее состояние объектов между собой, вместо
хранения одинаковых данных в каждом объекте.
Паттерн Легковес предлагает не хранить в классе внешнее состояние, а передавать
его в те или иные методы через параметры. Таким образом, одни и те же объекты
можно будет повторно использовать в различных контекстах. Но главное —
понадобится гораздо меньше объектов, ведь теперь они будут отличаться только
внутренним состоянием, а оно имеет не так много вариаций.
Заместитель
позволяет подставлять вместо реальных объектов специальные объекты-заменители.
Эти объекты перехватывают вызовы к оригинальному объекту, позволяя сделать
что-то до или после передачи вызова оригиналу.
Паттерн Заместитель предлагает создать новый класс-дублёр, имеющий тот же
интерфейс, что и оригинальный служебный объект. При получении запроса от клиента
объект-заместитель сам бы создавал экземпляр служебного объекта и
переадресовывал бы ему всю реальную работу.
Поведенческие паттерны
Цепочка обязанностей
позволяет передавать запросы последовательно по цепочке обработчиков. Каждый
последующий обработчик решает, может ли он обработать запрос сам и стоит ли
передавать запрос дальше по цепи.
Паттерн предлагает связать объекты обработчиков в одну цепь. Каждый из них будет
иметь ссылку на следующий обработчик в цепи. Таким образом, при получении
запроса обработчик сможет не только сам что-то с ним сделать, но и передать
обработку следующему объекту в цепочке.
Команда
превращает запросы в объекты, позволяя передавать их как аргументы при вызове
методов, ставить запросы в очередь, логировать их, а также поддерживать отмену
операций.
Паттерн Команда предлагает больше не отправлять такие вызовы напрямую. Вместо
этого каждый вызов, отличающийся от других, следует завернуть в собственный класс
с единственным методом, который и будет осуществлять вызов. Такие объекты
называют командами.
Итератор
даёт возможность последовательно обходить элементы составных объектов, не
раскрывая их внутреннего представления.
Идея паттерна Итератор состоит в том, чтобы вынести поведение обхода коллекции из
самой коллекции в отдельный класс.
Посредник
позволяет уменьшить связанность множества классов между собой, благодаря
перемещению этих связей в один класс-посредник.
Паттерн Посредник заставляет объекты общаться не напрямую друг с другом, а через
отдельный объект-посредник, который знает, кому нужно перенаправить тот или иной
запрос. Благодаря этому, компоненты системы будут зависеть только от посредника, а
не от десятков других компонентов.
Снимок/Хранитель
позволяет сохранять и восстанавливать прошлые состояния объектов, не раскрывая
подробностей их реализации.
Паттерн Снимок поручает создание копии состояния объекта самому объекту, который
этим состоянием владеет. Вместо того, чтобы делать снимок «извне», наш редактор
сам сделает копию своих полей, ведь ему доступны все поля, даже приватные.
Наблюдатель
создаёт механизм подписки, позволяющий одним объектам следить и реагировать на
события, происходящие в других объектах.
Паттерн Наблюдатель предлагает хранить внутри объекта издателя список ссылок на
объекты подписчиков, причём издатель не должен вести список подписки
самостоятельно. Он предоставит методы, с помощью которых подписчики могли бы
добавлять или убирать себя из списка.
Состояние
позволяет объектам менять поведение в зависимости от своего состояния. Извне
создаётся впечатление, что изменился класс объекта.
Паттерн Состояние предлагает создать отдельные классы для каждого состояния, в
котором может пребывать объект, а затем вынести туда поведения, соответствующие
этим состояниям.
Вместо того, чтобы хранить код всех состояний, первоначальный объект, называемый
контекстом, будет содержать ссылку на один из объектов-состояний и делегировать
ему работу, зависящую от состояния.
Стратегия
определяет семейство схожих алгоритмов и помещает каждый из них в собственный
класс, после чего алгоритмы можно взаимозаменять прямо во время исполнения
программы.
Шаблонный метод
определяет скелет алгоритма, перекладывая ответственность за некоторые его шаги
на подклассы. Паттерн позволяет подклассам переопределять шаги алгоритма, не
меняя его общей структуры.
Посетитель
позволяет добавлять в программу новые операции, не изменяя классы объектов, над
которыми эти операции могут выполняться.
Паттерн Посетитель предлагает разместить новое поведение в отдельном классе,
вместо того чтобы множить его сразу в нескольких классах. Объекты, с которыми
должно было быть связано поведение, не будут выполнять его самостоятельно.
Вместо этого вы будете передавать эти объекты в методы посетителя.
Связные списки
Связный список состоит из группы узлов, которые вместе образуют
последовательность. Каждый узел содержит две вещи: фактические данные, которые в
нем хранятся (это могут быть данные любого типа) и указатель (или ссылку) на
следующий узел в последовательности. Также существуют двусвязные списки: в них у
каждого узла есть указатель и на следующий, и на предыдущий элемент в списке.
Стеки
Стек — это базовая структура данных, которая позволяет добавлять или удалять
элементы только в её начале. Она похожа на стопку книг: если вы хотите взглянуть на
книгу в середине стека, сперва придется убрать лежащие сверху.
Стек организован по принципу LIFO (Last In First Out, «последним пришёл — первым
вышел») . Это значит, что последний элемент, который вы добавили в стек, первым
выйдет из него.
Деки
стек с двумя концами. Действительно, несмотря конкретный перевод, дек можно
определять не только как двухстороннюю очередь, но и как стек, имеющий два конца.
Это означает, что данный вид списка позволяет добавлять элементы в начало и в
конец, и то же самое справедливо для операции извлечения.
Эта структура одновременно работает по двум способам организации данных: FIFO и
LIFO. Поэтому ее допустимо отнести к отдельной программной единице, полученной в
результате суммирования двух предыдущих видов списка.
Очереди
Очередь устроена по принципу FIFO (First In First Out, «первый пришёл — первый
вышел»). Это значит, что удалить элемент можно только после того, как были убраны
все ранее добавленные элементы.
Множества
Множество хранит значения данных без определенного порядка, не повторяя их. Оно
позволяет не только добавлять и удалять элементы: есть ещё несколько важных
функций, которые можно применять к двум множествам сразу.
Хэш-таблицы
Хэш-таблица — это похожая на Map структура, которая содержит пары ключ/значение.
Она использует хэш-функцию для вычисления индекса в массиве из блоков данных,
чтобы найти желаемое значение.
Префиксное дерево
Префиксное (нагруженное) дерево — это разновидность дерева поиска. Оно хранит
данные в метках, каждая из которых представляет собой узел на дереве. Такие
структуры часто используют, чтобы хранить слова и выполнять быстрый поиск по ним
— например, для функции автозаполнения.
Каждый узел в языковом префиксном дереве содержит одну букву слова. Чтобы
составить слово, нужно следовать по ветвям дерева, проходя по одной букве за раз.
Дерево начинает ветвиться, когда порядок букв отличается от других имеющихся в нем
слов или когда слово заканчивается. Каждый узел содержит букву (данные) и булево
значение, которое указывает, является ли он последним в слове.
Двоичная куча
Двоичная куча — ещё одна древовидная структура данных. В ней у каждого узла не
более двух потомков. Также она является совершенным деревом: это значит, что в ней
полностью заняты данными все уровни, а последний заполнен слева направо.
Граф
Графы — это совокупности узлов (вершин) и связей между ними (рёбер). Также их
называют сетями.
Чаще всего граф изображают в каком-либо из двух видов: это может быть список
смежности или матрица смежности
уществуют специальные алгоритмы для просмотра рёбер и вершин в графах — так
называемые алгоритмы обхода. К их основным типам относят поиск в ширину
(breadth-first search) и в глубину (depth-first search). Как вариант, с их помощью можно
определить, насколько близко к корневому узлу находятся те или иные вершины
графа.
Массивы
Массив – это структура данных с фиксированным и упорядоченным набором
однотипных элементов (компонентов). Доступ к какому-либо из элементов массива
осуществляется по имени и номеру (индексу) этого элемента. Количество индексов
определяет размерность массива.
Сложность алгоритмов
пример - вставка в конец массива или вставка в начало списка или вставка в очередь
или стек - постоянное время
пример - вставка в начало массива - линейное время
пример - сортировки - обычно логарифмическое время
пример - что-то в цикле - обычно квадратичное время
ООП
Наследование
класс может наследовать поведения и данные от другого класса
Полиморфизм
способность одним методом обрабатывать разные типы данных
Инкапсуляция
объект содержит поведения и данные
Абстракция
контекстное понимание предмета, формализуемое в виде класса
Агрегация (Композиция)
CQRS
Command-query separation (CQS)
Принцип гласит, что метод должен быть либо командой, выполняющей какое-то
действие, либо запросом, возвращающим данные, но не одновременно. Другими
словами, задавание вопроса не должно менять ответ. Более формально, возвращать
значение можно только чистым (т.е. детерминированным и не имеющим побочных
эффектов) методом. Следует отметить, что строгое соблюдение этого принципа делает
невозможным отслеживание количества вызовов запросов.
Суть в отсутствии побочных действий
Первое что бросается в глаза это то что у вас уже две модели данных, одна для чтения
(Queries), одна для записи (Commands). И обычно это значит что у вас еще и две базы
данных. И так как мы используем CQRS + Event Sourcing, то write-база (write-модель) — это
Event Store, что-то вроде лога всех действий пользователя (на самом деле не всех, а
только тех которые важны с точки зрения бизнес-модели и влияют на построение
read-базы). А read-база — это в общем случае денормализировнное хранилище тех
данных, которые вам нужны для отображения пользователю. Почему я сказал что
read-база денормализированная? Вы конечно можете использовать любую структуру
данных в качестве read-модели, но я считаю что при использовании CQRS + Event Sourcing
не стоит сильно заморачиваться над нормализвацией read-базы, так как она может быть
полностью перестроена в любое время. И это большой плюс, особенно если вы не хотите
использовать реляционные базы данных и смотрите в сторону NoSQL.
Write-база вообще представляет собой одну коллекцию ивентов. То есть тут тоже нету
смысла использовать реляционную базу.
DI
ONION
Good Coupling
The primary proposition of this architecture is good coupling.
What is coupling ? It is the level of dependency of one thing upon another. The higher the
coupling, the lower the ability to change and evolve the system.
Dependencies should be inward and never outward. Code should depend only on the same
layer or layers more central to itself.
Behaviour Contracts
Business Logic behaviour is declared as contracts with the use of interfaces in a
Object-Oriented context.
Separation of concerns
Each layer bounds together concepts that will have a similar rate of change.
Domain Model
The very centre of the Model, this layer can have dependencies only on itself. It represents
the Entities of the Business and the Behaviour of these Entities.
Domain Services
This layer contains the implementation of the behaviour contracts defined in the Model layer.
Application Services
This layer is the bridge between external infrastructure and the domain layers. The domain
layers often need information or functionality in order to complete business functionality,
however they should not directly depend on these. Instead, the application layer needs to
depend on the the contracts defined in the Domain Services layer.
External Services
Databases, Messaging systems, Notification systems, User Interface, etc.
CI
Непрерывная интеграция (CI, англ. Continuous Integration) — практика разработки
программного обеспечения, которая заключается в постоянном слиянии рабочих копий
в общую основную ветвь разработки (до нескольких раз в день) и выполнении частых
автоматизированных сборок проекта для скорейшего выявления потенциальных
дефектов и решения интеграционных проблем. В обычном проекте, где над разными
частями системы разработчики трудятся независимо, стадия интеграции является
заключительной. Она может непредсказуемо задержать окончание работ. Переход к
непрерывной интеграции позволяет снизить трудоёмкость интеграции и сделать её
более предсказуемой за счёт наиболее раннего обнаружения и устранения ошибок и
противоречий, но основным преимуществом является сокращение стоимости
исправления дефекта, за счёт раннего его выявления.
CD
Непрерывная доставка (англ. Continuous delivery или CD, или CDE) — это подход к
разработке программного обеспечения, при котором программное обеспечение
производится короткими итерациями, гарантируя, что ПО является стабильным и
может быть передано в эксплуатацию в любое время, а передача его происходит
вручную[1]. Целью является сборка, тестирование и релиз программного обеспечения
с большей скоростью и частотой. Подход позволяет уменьшить стоимость, время и
риски внесения изменений путём более частных мелких обновлений в
продакшн-приложение.
EDA
Структура события
Событие может состоять из двух частей: заголовка события и тела события.
Плюсы
Минусы
MVC
Основная цель применения этой концепции состоит в отделении бизнес-логики
(модели) от её визуализации (представления, вида).
MVVM
Используется для разделения модели и её представления, что необходимо для их
изменения отдельно друг от друга. Например, разработчик задаёт логику работы с
данными, а дизайнер работает с пользовательским интерфейсом.
● Модель (англ. Model) (так же, как в классической MVC) представляет собой
логику работы с данными и описание фундаментальных данных, необходимых
для работы приложения.
● Представление (англ. View) — графический интерфейс (окна, списки, кнопки и т.
п.). Выступает подписчиком на событие изменения значений свойств или
команд, предоставляемых Моделью Представления. В случае, если в Модели
Представления изменилось какое-либо свойство, то она оповещает всех
подписчиков об этом, и Представление, в свою очередь, запрашивает
обновлённое значение свойства из Модели Представления. В случае, если
пользователь воздействует на какой-либо элемент интерфейса, Представление
вызывает соответствующую команду, предоставленную Моделью
Представления.
● Модель Представления (англ. ViewModel) — с одной стороны, абстракция
Представления, а с другой — обёртка данных из Модели, подлежащиx
связыванию. То есть, она содержит Модель, преобразованную к
Представлению, а также команды, которыми может пользоваться
Представление, чтобы влиять на Модель.
Признаки:
Признаки:
MVVM
MVP
MVC
В первую очередь нужно понимать, что команда git rebase помогает решить ту же
проблему, что и команда git merge. Обе команды предназначены для включения
изменений из одной ветки в другую, но делают это по-разному.
С другой стороны, это означает, что каждый раз, когда вам будет необходимо включить
вышестоящие изменения, в функциональную ветку будет попадать внешний коммит
слияния. Если работа в главной ветке ведется активно, история вашей
функциональной ветки быстро засорится.
Идея Event Sourcing в том чтобы записывать каждое событие, которое меняет
состояние приложения в базу данных. Таким образом получается что мы храним не
состояние наших сущностей, а все события которые к ним относятся. Однако мы
привыкли к тому чтобы манипулировать именно состоянием, оно храниться у нас в
базе и мы всегда можем его посмотреть.
В случае с Event Sourcing мы тоже оперируем с состоянием сущности. Но в отличии от
обычной модели мы это состоянием не храним, а воспроизводим каждый раз при
обращении.
GraphQL
В двух словах, GraphQL это синтаксис, который описывает как запрашивать данные, и,
в основном, используется клиентом для загрузки данных с сервера. GraphQL имеет три
основные характеристики:
REST
REST расшифровывается как REpresentational State Transfer. Это был термин,
первоначально введен Роем Филдингом (Roy Fielding), который также был одним из
создателей протокола HTTP. Отличительной особенностью сервисов REST является
то, что они позволяют наилучшим образом использовать протокол HTTP. Теперь
давайте кратко рассмотрим HTTP.
Ресурс
URI ресурса
Методы http
Статусы http
● 1xx - информационное
● 2xx - успешное
● 3xx - перенаправление
● 4xx - ошибка клиента
● 5xx - ошибка сервера
Принципы
● pure data
● без состояния
● многоуровневая архитектура
● единый унифицированный интерфейс
● кешируемая архитектура
● удобное представление данных
REST и Ресурсы
Важно отметить, что с REST вам нужно думать о приложении с точки зрения ресурсов:
Определите, какие ресурсы вы хотите открыть для внешнего мира
Используйте глаголы, уже определенные протоколом HTTP, для выполнения операций
с этими ресурсами.
Формат обмена данными: здесь нет никаких ограничений. JSON — очень популярный
формат, хотя можно использовать и другие, такие как XML
Транспорт: всегда HTTP. REST полностью построен на основе HTTP.
Определение сервиса: не существует стандарта для этого, а REST является гибким.
Это может быть недостатком в некоторых сценариях, поскольку потребляющему
приложению может быть необходимо понимать форматы запросов и ответов. Однако
широко используются такие языки определения веб-приложений, как WADL (Web
Application Definition Language) и Swagger.
процесс vs поток
Процессы и потоки связаны друг с другом, но при этом имеют существенные различия.
Потом браузер пытается узнать ip адрес, сначала в ряде специфических мест (файл
hosts, кеш роутера и прочее), если ничего не помогает - идет обращение в dns.
Когда ip адрес известен, можно делать http запрос, который шлется через tcp/ip.
Бэкенд формирует ответ, передает его веб-серверу, который шлет его браузеру
пакетами.
Соединение закрывается.
А браузер уже интерпретирует ответ исходя из статуса ответа, его типа, содержимого и
прочего.
Mysql vs Postqresql
Это все - первое, что пришло в голову. Кроме на Postgre можно легко и просто
реализовать почти всю или всю логику и выбирать наружу только данные ужо.
Если MySQL хватает - хорошо. Если же нужны сложные связи данных, всякие
навороченные штуки, то переход с my На postgre довольно приятен 8)
UPD: ах да, еще рекурсивные запросы, очень много раз жалел что в MySQL их нет
Масштабирование
Вертикальное масштабирование
Увеличение производительности каждого компонента системы с целью повышения
общей производительности. Добавление памяти, дисков, ядер и тд
Горизонтальное масштабирование
Партицирование
Шардирование
Теорема CAP
Теорема CAP (известная также как теорема Брюера) — эвристическое утверждение о
том, что в любой реализации распределённых вычислений возможно обеспечить не
более двух из трёх следующих свойств:
Иерархия исключений
Throwable
--- Error
--------ArithmeticError
--------AssertionError
--------CompileError
--------TypeError
----Exception
OOD
Этапы:
● Выявляем объекты
● Определяем параметры объекта и связи
● Определить варианты и способы взаимодействия
● Определяем свойства параметров
OOP vs OOD vs OOA
После выделения частей коня решено, что он будет состоять из трех частей:
сервер-служба, гуй-клиент-настройщик, веб-морда.
Тимлиду поручено сделать сервер и он начинает думать в сторону того, как будет
устроен сервер, рисует одному ему понятные стрелочки и продумывает очень
иерархию частей этого сервера и их взаимодействие.
Чистая архитектура
Зачем нужно?
● Независимость от фреймворка
● Тестируемость
● Независимость от UI
● Независимость от базы данных
● Независимость от какого-либо внешнего сервиса
Правило Зависимостей
Зависимости в исходном коде могут указывать только во внутрь. Ничто из внутреннего
круга не может знать что-либо о внешнем круге, ничто из внутреннего круга не может
указывать на внешний круг. Это касается функций, классов, переменных и даже
структур данных.
Сущности
Сущности определяются бизнес-правилами предприятия. Сущность может быть
объектом с методами или она может представлять собой набор структур данных и
функций. Они инкапсулируют наиболее общие высокоуровневые правила. Наименее
вероятно, что они изменятся при каких-либо внешних изменениях. Например, они не
должны быть затронуты при изменении навигации по страницам или правил
безопасности. Внешние изменения не должны влиять на слой сущностей.
Сценарии
В этом слое реализуется специфика бизнес-правил. Он инкапсулирует и реализует все
случаи использования системы. Эти сценарии реализуют поток данных в и из слоя
Cущностей для реализации бизнес-правил. Мы не ожидаем изменения в этом слое,
влияющих на Cущности. Мы также не ожидаем, что это слой может быть затронут
внешними изменениями. Мы, однако, ожидаем, что изменения в работе приложения
повлияет на Cценарии. Если будут какие-либо изменения в поведении приложения, то
они несомненно затронут код в данном слое.
Интерфейс-Адаптеры
Программное обеспечение в этом слое представляет собой набор адаптеров, которые
преобразуют данные из формата наиболее удобным для Сценариев и Сущностей, в
формат наиболее удобный для дальнейшего использования, например в БД. Именно
это слой, например, будет полностью содержать архитектуру MVC. Модели являются
скорее всего структурами данных, которые передаются от контроллеров к Сценариям,
а затем обратно из Сценариев к Представлениям.
Точно так же, данные преобразуются, в этом слое, из формы наиболее удобным для
Сценариев и Сущностей, в форму, наиболее удобной для постоянного хранения,
например в базе данных. Код, находящийся внутри этого круга не должен знать
что-либо о БД. Если БД — это SQL база данных, то любые SQL-инструкции не должны
быть использованы на этом уровне.
Фреймворки и драйверы
Наружный слой обычно состоит из фреймворков, БД, UI и т.д. Как правило, в этом слое
не пишется много кода, за исключением кода, который общается с внутренними
кругами. Это слой скопления деталей. Интернет — деталь, БД — деталь, мы держим
эти штуки снаружи для уменьшения их влияния.
Пересечение границ
Контроллеры и Представления взаимодействуют со Сценариями из следующего слоя.
Обратите снимание на поток управления. Она начинается в Контроллере, движется
через Сценарий, а затем завершает выполнение в Представлении. Обратите внимание
на зависимости в исходном коде. Каждая из них указывает внутрь к Сценарию.
Гексоганальная архитектура
Clean Architecture хорошо работает в паре с Bounded Context. Разные контексты могут
представлять собой разные подсистемы. Простые контексты лучше реализовывать с
помощью простого CRUD. Для контекстов с асимметричной нагрузкой хорошо
подойдет CQRS. Для подсистем, требующих Audit Log'а есть смысл использовать
Event Sourcing. Для нагруженных на чтение и запись подсистемах с ограничениями по
пропускной способности и задержкам есть смысл рассмотреть event driven — подход.
На первый взгляд это может показаться неудобным. Например я работал с
CRUD-подсистемой и мне пришла задача из CQRS-подсистемы. Придется некоторе
время смотреть на все эти Command и Query как на новые ворота. Альтернатива —
проектировать систему в едином стиле — недальновидна. Архитектура — это набор
инструментов, а каждый инструмент подходит для решения конкретной задачи.
Алгоритмы сортировки
Сортировка пузырьком
Сортировка перемешиванием
Шейкерная сортировка отличается от пузырьковой тем, что она двунаправленная:
алгоритм перемещается не строго слева направо, а сначала слева направо, затем
справа налево.
Сортировка расчёской
Сортировка расчёской — улучшение сортировки пузырьком. Её идея состоит в том,
чтобы «устранить» элементы с небольшими значения в конце массива, которые
замедляют работу алгоритма. Если при пузырьковой и шейкерной сортировках при
переборе массива сравниваются соседние элементы, то при «расчёсывании» сначала
берётся достаточно большое расстояние между сравниваемыми значениями, а потом
оно сужается вплоть до минимального.
Сначала расстояние между элементами будет равняться размеру массива,
поделённому на 1,247; на каждом последующем шаге расстояние будет снова
делиться на фактор уменьшения — и так до окончания работы алгоритма.
Сортировка вставками
При сортировке вставками массив постепенно перебирается слева направо. При этом
каждый последующий элемент размещается так, чтобы он оказался между
ближайшими элементами с минимальным и максимальным значением.
Сортировка выбором
Сначала нужно рассмотреть подмножество массива и найти в нём максимум (или
минимум). Затем выбранное значение меняют местами со значением первого
неотсортированного элемента. Этот шаг нужно повторять до тех пор, пока в массиве
не закончатся неотсортированные подмассивы.
Быстрая сортировка
Этот алгоритм состоит из трёх шагов. Сначала из массива нужно выбрать один
элемент — его обычно называют опорным. Затем другие элементы в массиве
перераспределяют так, чтобы элементы меньше опорного оказались до него, а
большие или равные — после. А дальше рекурсивно применяют первые два шага к
подмассивам справа и слева от опорного значения.
Сортировка слиянием
Сортировка слиянием пригодится для таких структур данных, в которых доступ к
элементам осуществляется последовательно (например, для потоков). Здесь массив
разбивается на две примерно равные части и каждая из них сортируется по
отдельности. Затем два отсортированных подмассива сливаются в один.
Пирамидальная сортировка
При этой сортировке сначала строится пирамида из элементов исходного массива.
Пирамида (или двоичная куча) — это способ представления элементов, при котором от
каждого узла может отходить не больше двух ответвлений. А значение в родительском
узле должно быть больше значений в его двух дочерних узлах.
Последовательный поиск
просто перебор O(n)
Индексно-последовательный поиск
ищем по индексной таблице, потом углубляемся в основную
O(N + n/N)
Бинарный поиск
При бинарном поиске искомый ключ сравнивается с ключом среднего элемента в
массиве. Если они равны, то поиск успешен. В противном случае поиск
осуществляется аналогично в левой или правой частях массива.
Поиск в глубину
Поиск в ширину
Виды тестов
Анонимные функции
Callable — это специальный псевдотип данных в PHP, означающий «нечто, что может
быть вызвано как функция».
Unit of work
Unit of Work - это паттерн определяющий логическую транзакцию т.е. атомарную
синхронизацию изменений в объектах, помещённых в объект UoW с хранилищем
(базой данных).
Data Mapper
Data Mapper — это программная прослойка, разделяющая объект и БД. Его
обязанность — пересылать данные между ними и изолировать их друг от друга. При
использовании Data Mapper'а объекты не нуждаются в знании о существовании БД.
Они не нуждаются в SQL-коде, и (естественно) в информации о структуре БД. Так как
Data Mapper - это разновидность паттерна Mapper, сам объект-Mapper неизвестен
объекту.
Active Record
Схема Active Record — это подход к доступу к данным в базе данных. Таблица базы
данных или представление обёрнуты в классы. Таким образом, объектный экземпляр
привязан к единственной строке в таблице. После создания объекта новая строка
будет добавляться к таблице на сохранение. Любой загруженный объект получает
свою информацию от базы данных. Когда объект обновлён, соответствующая строка в
таблице также будет обновлена. Класс обёртки реализует методы средства доступа
или свойства для каждого столбца в таблице или представлении.
Может быть антипаттерном, если объект умеет себя сохранять и содержать бизнес
логику одновременно.
ORM
Итератор
Генератор
Генератор позволяет вам писать код, использующий foreach для перебора набора
данных без необходимости создания массива в памяти, что может привести к
превышению лимита памяти, либо потребует довольно много времени для его
создания. Вместо этого, вы можете написать функцию-генератор, которая, по сути,
является обычной функцией, за исключением того, что вместо возврата единственного
значения, генератор может возвращать (yield) столько раз, сколько необходимо для
генерации значений, позволяющих перебрать исходный набор данных.
Главное преимущество генераторов - это их простота. Гораздо меньше шаблонного
кода надо написать, по сравнению с реализацией объекта класса Iterator, и этот код
гораздо более простой и понятный. К примеру, эта функция и класс делают одно и то
же.
Однако за эту простоту, впрочем, приходится платить: генераторы могут быть только
однонаправленными итераторами. Их нельзя перемотать назад после старта
итерации. Это также означает, что один и тот же генератор нельзя использовать
несколько раз: генератор необходимо пересоздавать каждый раз, снова вызвав
функцию генератора.
Корутины
Главное, что корутины добавляют к вышеописанной функциональности — это
возможность отправлять значения генератору. Это делает из привычного монолога
генератора полноценный диалог, где вызывающая сторона может также что-то
сообщать генератору.
Стрелочные функции
Стрелочные функции поддерживают те же возможности, что и анонимные функции, за
исключением того, что использование переменных из родительской области всегда
выполняется автоматически.
php5.4
php5.5
finnally, генераторы
php 5.6
...$strings
php 7.0
оптимизация, операторы ??, ⇔
Типы скалярных параметров и подсказки (hints) по возвращаемым типам
добавлен новый интерфейс Throwable
Анонимные классы
php 7.1
nullable types, [] = as alternative construct to list() =, void return type.
php 7.2
Оптимизирована работа встроенной функции in_array() с помощью поиска хеша в
перевернутом массиве.
Добавлена возможность перегружать абстрактные функции
использовать type hints с типом данных объекта
php 7.3
Добавление функций array_key_first() и array_key_last(), countable
Поддержка конечных запятых в вызовах функций и методов
php 7.4
Предварительная загрузка
Типизированные свойства классов
Присваивающий оператор объединения с null (??=)
оператор Spread в массивах
В PHP 7.4 появляется ковариантность (порядок от конкретного к общему) и
контравариантность (обратный порядок) для типов возвращаемых данных и
параметров.
php 8
JIT
Аннотации/Атрибуты (Attributes)
Именованные параметры
Оператор безопасного null (Nullsafe operator)
$country = $session?->user?->getAddress()?->country;
Оператор выбора match
Адекватное приведение строки в число
Constructor Property Promotion
Объединения типов, тип mixed
PSR
● 1 - code style
● 3 - Logger Interface
● 4 - Autoloading Standard
● 6 - Caching Interface
● 7 - HTTP Message Interface
● 11 - Container Interface\
● 12 - improve code style
● 13 - Hypermedia Links
● 14 - Event Dispatcher
● 15 - HTTP Handlers
● 16 - Simple Cache
● 17 - HTTP Factories
● 18 - HTTP Client
https://github.com/php-fig
ES6
● arrows
● classes
● enhanced object literals
● template strings
● destructuring
● default + rest + spread
● let + const
● iterators + for..of
● generators
● unicode
● modules
● module loaders
● map + set + weakmap + weakset
● proxies
● symbols
● subclassable built-ins
● promises
● math + number + string + array + object APIs
● binary and octal literals
● reflect api
● tail calls
ES7
● Array.prototype.includes()
● Exponentiation operator
ES8
● Async Functions
● Shared memory and atomics
● Object.values/Object.entries
● String padding
● Object.getOwnPropertyDescriptors()
● Trailing commas in function parameter lists and calls
ES9
● Asynchronous Iteration
● Rest/Spread Properties
● RegExp named capture groups
● RegExp Unicode Property Escapes
● RegExp Lookbehind Assertions
● s (dotAll) flag for regular expressions
● Promise.prototype.finally()
● Template Literal Revision
ES10
● String.matchAll()
● Array.flat() & Array.flatMap()
● Dynamic Import
● Object.fromEntries()
● TrimStart() and TrimEnd()
● Symbol.prototype.description()
● Optional Catch Binding
● Well Formed JSON.stringify()
● Array Sort Stability
● Enhanced toString()
● Standardized “globalThis” Object
ES11
● Optional Chaining
● Nullish Coalescing
● Private Fields
● Static Fields
● Top Level Await
● Promise.allSettled
● Dynamic Import
● MatchAll
● globalThis
● BigInt
ES12
● String replaceAll()
● Приватные методы
● Приватные аксессоры
● WeakRef
● Финализаторы
● Promise.any() и AggregateError
● Оператор логического присваивания
● Оператор логического присваивания с ||
● Оператор логического присваивания с ??
Типы данных
Скалярные типы:
● bool
● int
● float (иногда встречается название double что для php не имеет разницы)
● string
Смешанные типы:
● array
● object
● callable
● iterable
Специальные типы:
● resource
● null
Сравнение объектов
MyISAM vs Innodb
на родительскую).
Медленнее,
ибо есть
Операция Insert Быстрее
оверхед на
транзакцию, но
это цена
надежности
Работает Работает
Если преобладают операции чтения (SELECT)
быстрее медленнее
Нет (доступен
начиная с
Поддержка полнотекстового поиска Да
версии MySQL
5.6.4)
Данные при
Каждой настройках по
таблице умолчанию
Файловое хранение таблиц
отдельный хранятся в
файл больших
совместно
используемых
файлах
всякого преобразования.
Крашится По логам
таблица восстановить
github flow
● Создайте ветвь
● Фиксируйте изменения
● Откройте запрос на слияние
● Проверьте и обсудите код
● Проверьте в бою
● Вливайте
GitFlow
SemVer
SOA
В его основе лежат несколько основных идей – переиспользование сервисов и
корпоративная шина. Разработчики стремятся разбить систему на сервисы таким
образом, чтобы их можно было использовать повторно. Взаимодействие и
маршрутизация осуществляется через корпоративную шину ESB.
Состав:
MSA
Микросервисы в отличие от SOA, наоборот, избегают повторного использования,
применяя философию - предпочтительнее дублирование, а не зависимость от других
сервисов. Повторное использование предполагает связанность, а архитектура
микросервисов в значительной степени старается ее избегать. Это достигается за счет
разбиения системы на сервисы по ограниченным контекстам (бизнес областям).
Модели OSI
WebRTC
Web Real-Time Communication (WebRTC) это не один протокол, это целая коллекция
стандартов, протоколов и JavaScript API, которые все вместе обеспечивают
peer-to-peer видео-аудио коммуникации в реальном времени, а также могут быть
использованы для передачи любых бинарных данных. Обычно пирами выступают
браузеры, но это может быть и мобильное приложение, например. Для того чтобы
организовать p2p общение между клиентами требуется поддержка браузером
различных видов кодирования видео и аудио, поддержка множества сетевых
протоколов, обеспечение взаимодействия железа с браузером (через слои ОС):
вебкамер, звуковых карт. Вся эта мешанина технологий скрыта за абстракцией
JavaScript API для удобства разработчика.
WebSocket
innodb_buffer_pool_size
Если Вы используете только InnoDB таблицы, устанавливайте это значение
максимально возможным для Вашей системы. Буфер InnoDB кеширует и данные и
индексы. Поэтому значение этого ключа стоит устанавливать в 70%...80% всей
доступной памяти.
innodb_log_file_size
Эта опция влияет на скорость записи. Она устанавливает размер лога операций (так
операции сначала записываются в лог, а потом применяются к данным на диске). Чем
больше этот лог, тем быстрее будут работать записи (т.к. их поместится больше в файл
лога). Файлов всегда два, а их размер одинаковый. Значением параметра задается
размер одного файла:
innodb_file_per_table
Если включить эту опцию, Innodb будет сохранять данные всех таблиц в отдельных
файлах (вместо одного файла по умолчанию). Прироста в производительности не
будет, однако есть ряд преимуществ:
При удалении таблиц, диск будет освобождаться. По умолчанию общий файл данных
может только расширяться, но не уменьшаться.
Использование компрессионного формата таблиц потребует включить этот параметр.
innodb_flush_method
Этот параметр определяет логику сброса данных на диск. В современных системах
при использовании RAID и резервных узов, вы будете выбирать между O_DSYNC и
O_DIRECT:
innodb_flush_log_at_trx_commit
Изменение этого параметра может повысить пропускную способность записи данных в
базу в сотни раз. Он определяет, будет ли Mysql сбрасывать каждую операцию на диск
(в файл лога).
query_cache_size
Значение этого параметра определяет сколько памяти стоит использовать под кеш
запросов. Самый правильный подход — не полагаться на этот механизм. На практике
он работает очень неэффективно. Так, весь кеш запросов для определенной таблицы
сбрасывается всякий раз, когда в таблицу вносится хотя бы одно изменение. Это
может привести к тому, что включение кеширования даже замедлит базу данных.
max_connections
Не следует изменять значение этого параметра на старте. Однако, если вы получаете
ошибки "Too many connections", эту опцию стоит поднимать. Она определяет
максимальное количество одновременных соединений с базой данных:
Событие composer
Командные события
● pre-install-cmd: происходит до того, как команда install будет выполнена с
имеющимся файлом блокировки.
● post-install-cmd: возникает после того, как команда install была выполнена с
присутствующим файлом блокировки.
● pre-update-cmd: происходит до выполнения команды update или до
выполнения команды install без наличия файла блокировки.
● post-update-cmd: происходит после выполнения команды update или после
того, как команда install была выполнена без присутствия файла блокировки.
● post-status-cmd: возникает после выполнения команды status.
● pre-archive-cmd: происходит до выполнения команды archive.
● post-archive-cmd: происходит после выполнения команды archive.
● pre-autoload-dump: происходит до того, как автозагрузчик сбрасывается, либо
во время install/update, либо с помощью команды dump-autoload.
● post-autoload-dump: возникает после того, как автозагрузчик был сброшен,
либо во время install/update, либо с помощью команды dump-autoload.
● post-root-package-install: происходит после установки корневого пакета во
время команды create-project.
● post-create-project-cmd: происходит после выполнения команды create-project.
События установщика
● pre-dependencies-solving: происходит до разрешения зависимостей.
● post-dependencies-solving: происходит после устранения зависимостей.
События пакета
● pre-package-install: происходит до установки пакета.
● post-package-install: происходит после установки пакета.
● pre-package-update: происходит до обновления пакета.
● post-package-update: происходит после обновления пакета.
● pre-package-uninstall: происходит до удаления пакета.
● post-package-uninstall: происходит после удаления пакета.
События плагина
● init: происходит после инициализации экземпляра Composer.
● command: встречается перед выполнением любой команды Composer
Command на CLI. Он предоставляет вам доступ к входным и выходным
объектам программы.
● pre-file-download: происходит до загрузки файлов и позволяет вам
манипулировать объектом RemoteFilesystem до загрузки файлов на основе
загружаемого URL.
Корневой объект JSON в composer.json должен иметь свойство, называемое "scripts",
которое содержит пары именованных событий и соответствующие сценарии каждого
события. Скрипты события могут быть определены либо как строка (только для одного
сценария), либо как массив (для одного или нескольких сценариев).
Composition Root
Говоря о Внедрении Зависимостей мы не можем не прийти к такому понятию, как
Composition Root (далее я буду назвать это "Точка Сборки"). Это тот самый "кто-то",
кому делегированы обязанности по созданию зависимостей и их внедрению.
В Точке Сборки все зависимости явно определяются, соответствующие объекты
создаются и внедряются туда, где их ждут. Здесь различия между Локатором Служб и
DI-контейнером минимальны. И тот и другой позволяют создавать новые объекты,
хранить созданные объекты, извлекать хранимые объекты. Я бы даже взялся
утверждать, что в этом месте принципиальных различий между ними нет.
Главное отличие
Сервис локатор обычно передаётся как зависимость, и у него на каждый создаваемый
объект может быть отдельный метод создания. Это нарушает принцип разделения
интерфейсов, так как мы передаём его в класс радил одного-дву методов, а получаем
зависимость от интерфейса с 100500 методов.
UML нотация
Элементы диаграммы
Диаграмма классов является ключевым элементом в объектно-ориентированном
моделировании. На диаграмме классы представлены в рамках, содержащих три
компонента:
● В верхней части написано имя класса. Имя класса выравнивается по центру
и пишется полужирным шрифтом. Имена классов начинаются с заглавной
буквы. Если класс абстрактный — то его имя пишется полужирным курсивом.
● Посередине располагаются поля (атрибуты) класса. Они выровнены по
левому краю и начинаются с маленькой буквы.
● Нижняя часть содержит методы класса. Они также выровнены по левому
краю и пишутся с маленькой буквы.
Видимость
Для задания видимости членов класса (то есть — любым атрибутам или методам), эти
обозначения должны быть размещены перед именем участника.
● + Публичный (Public)
● - Приватный (Private)
● # Защищённый (Protected)
● / Производный (Derived) (может быть совмещён с другими)
● ~ Пакет (Package)
Области действия
UML определяет два типа областей действия для членов: экземпляр и классификатор,
последние имеют подчёркнутые имена.[5]
Взаимосвязи
Взаимосвязи объектов классов
Взаимосвязи классов
Общая взаимосвязь
Команды
Терминология
Порты
80 - http
443 - https
Dockerfile
Docker-compose
docker-compose up -d
docker-compose down -v --remove-orphans
docker-compose logs -f
Перцентиль vs Процент
Перцентиль – это способ посмотреть на ваши данные в отношении ко всем другим
значениям набора данных. Например, если вы хотите определить 10% самых активных
покупателей за прошлый месяц, по сути, вы хотите увидеть всех покупателей выше
границы в 90%.
Но в том же самом тесте может быть и обратная ситуация: результат Ивана равен
90-ому процентилю. Это значит, что Иван написал тест лучше, чем 90% студентов. Или
по другому: только 10% (20 человек) набрали более 70 правильных ответов.
Следовательно, тест был весьма трудным. Преимущество метода еще и в том, что
разбивкой на процентили можно сравнивать тесты с разным числом участников.
load average
Load Average — это среднее значение загрузки системы за некоторый период времени
(1, 5 и 15 минут).
В общем виде Load Average это среднее количество ожидающих ресурсов ЦПУ
процессов за один из трех промежутков времени. Так же нам известно, что это
значение в нормальном состоянии находится в диапазоне от 0 до 1, и единица
соответствует 100% загрузке одноядерной системы без перегруза.
Едино правильного ответа на этот вопрос нет — все зависит от базы данных.
Проблема этого запроса заключается в том, что колонка order_code не указана в
выражении GROUP BY и при этом для нее не определена агрегатная функция. То
есть по отношению к колонке order_code мы не знаем группировать ее или
группировать по ней.
Если этот запрос будет выполняться в MySQL, то колонка order_code добавится в
выражение GROUP BY автоматически и запрос выполнится нормально.
При создании составного индекса сначала строится обычный индекс для его первой
колонки, а потом уже на основе него строится индекс для второй колонки и так дальше.
Другими словами, колонки, по которым поиск выполняется чаще всего, должны стоять
в составном индексе первыми.
Фактически обе эти команды вызовут удаление всех строк из таблицы под названием
table_name, но вот произойдет это совсем по-разному:
Оба эти типа используются для хранения текстовой информации ограниченной длины,
а различия между ними следующие:
Таким образом, в формате VARCHAR стоит хранить строчные данные, которые точно
не придется переводить (например, адреса электронной почты). Для других случаев
больше подойдет NVARCHAR.
Выражения UNION и UNION ALL — это очень надежные поставщики лишних или
недостающих строк в результате запроса. Оба эти выражения используются, чтобы
объединить результаты нескольких независимых друг от друга запросов. А
разница между ними заключается в том, что, если в результатах запросов есть
одинаковые строки, то UNION удалит дубликаты, оставив только одну из таких строк.
В то же время UNION ALL, как можно догадаться из названия, просто объединит
результаты запросов, не обращая внимания на дубликаты.
WHERE HAVING
● create
● alter
● drop
● truncate
Операторы манипуляции данными (англ. Data Manipulation Language, DML)
DML используется для работы с уже существующими данными, содержащимися в базе
данных. С помощью этих операторов пользователи могут получать данные из базы и
совершать над ними какие-то манипуляции.
● select
● insert
● update
● delete
● grant
● revoke
● commit
● rollback
● savepoint
● begin
● transaction
SQL: Что такое ограничение по умолчанию?
𝑠𝑒𝑙𝑒𝑐𝑡 𝑚𝑎𝑥(𝑒_𝑠𝑎𝑙𝑎𝑟𝑦) 𝑓𝑟𝑜𝑚 𝑒𝑚𝑝𝑙𝑜𝑦𝑒𝑒 𝑤ℎ𝑒𝑟𝑒 𝑒_𝑠𝑎𝑙𝑎𝑟𝑦 𝑛𝑜𝑡 𝑖𝑛 (𝑠𝑒𝑙𝑒𝑐𝑡 𝑚𝑎𝑥(𝑒_𝑠𝑎𝑙𝑎𝑟𝑦) 𝑓𝑟𝑜𝑚 𝑒𝑚𝑝𝑙𝑜𝑦𝑒𝑒)
Внешний ключ это атрибут или набор атрибутов, ссылающийся на первичный ключ в
какой-нибудь другой таблице. В общем, он используется для связи между двумя
таблицами.
Индексы помогают ускорить поиск в базе данных. Если в выражении WHERE не задан
индекс никакого столбца, SQL-сервер в поиске соответствия будет проверять каждую
строку во всей таблице. Если у вас много данных, эта операция может оказаться
довольно медленной.
SQL PL/SQL
SQL это структурированный язык Это язык программирования для
запросов к базам данных. баз данных, использующий SQL.
SQL это отдельный запрос, который PL/SQL это блок кодов,
используется для выполнения используемый для написания всей
команд DML и DDL. процедуры или функции.
SQL это декларативный язык, PL/SQL это процедурный язык,
ориентированный на данные. ориентированный на приложение.
Используется главным образом для Используется для создания
манипуляций с данными. приложения.
Предоставляет возможность Не предоставляет возможности
взаимодействия с сервером базы взаимодействия с сервером базы
данных. данных.
Не может содержать в себе код Может содержать SQL, поскольку
PL/SQL. сам является расширением SQL.
SQL: Как вы понимаете символьные функции?
Символьные функции используются для манипуляций с символами. К ним относятся:
● UPPER
● LOWER
● INITCAP
● CONCAT
● LENGTH
● SUBSTRING
Поскольку первичный ключ уникален для каждой записи, мы добавляем это поле в
качестве AUTO_INCREMENT поля, таким образом при каждой вставке новой записи
номер будет увеличиваться автоматически.
● Реляционные
● Flat File — базы данных с двумерными файлами, в которых содержатся
записи одного типа и отсутствует связь с другими файлами, как в реляционных.
● Иерархические подразумевают наличие записей, связанных друг с другом по
принципу отношений один-к-одному или один-ко-многим.
● Сетевые похожи на иерархические, но в этом случае «ребёнок» может иметь
несколько «родителей» и наоборот.
● Объектно-ориентированные СУБД работают с базами данных, которые
состоят из объектов, используемых в ООП. Объекты группируются в классы и
называются экземплярами, а классы в свою очередь взаимодействуют через
методы.
● Объектно-реляционные обладают преимуществами реляционной и
объектно-ориентированной моделей.
● Многомерная модель является разновидностью реляционной и использует
многомерные структуры. Часто представляется в виде кубов данных.
● Гибридные состоят из двух и более типов баз данных. Используются в том
случае, если одного типа недостаточно для обработки всех запросов.
Для сортировки данных в порядке возрастания (ASC) или убывания (DESC) или
случайный (RAND).
INNER JOIN: возвращает строки, когда есть совпадение в обеих таблицах (default)
LEFT JOIN: возвращает все строки из левой таблицы, даже если в правой таблице нет
совпадений.
RIGHT JOIN: возвращает все строки из правой таблицы, даже если в левой таблице
нет совпадений.
FULL OUTER JOIN: Он объединяет результаты как левого, так и правого внешних
соединений.
Объединенная таблица будет содержать все записи из обеих таблиц и заполнять NULL
для отсутствия совпадений с обеих сторон.
SELF JOIN: используется для объединения таблицы в себя, как если бы таблица была
двумя таблицами, временно переименовывая по крайней мере одну таблицу в
SQL-заявлении.
CARTESIAN JOIN: возвращает декартово произведение наборов записей из двух или
более объединенных таблиц.
Это специальные символы, которые нужны для замены каких-либо знаков в запросе.
Они используются вместе с оператором LIKE, с помощью которого можно
отфильтровать запрашиваемые данные.
SQL-псевдонимы нужны для того, чтобы дать временное имя таблице или столбцу. Это
нужно, когда в запросе есть таблицы или столбцы с неоднозначными именами. В этом
случае для удобства в составлении запроса используются псевдонимы.
SQL-псевдоним существует только на время запроса.
Если остаток от деления id на 2 равен нулю, перед нами чётное значение, и наоборот.
𝑆𝐸𝐿𝐸𝐶𝑇 𝑒𝑚𝑎𝑖𝑙, 𝐶𝑂𝑈𝑁𝑇(𝑒𝑚𝑎𝑖𝑙) 𝐹𝑅𝑂𝑀 𝑐𝑢𝑠𝑡𝑜𝑚𝑒𝑟𝑠 𝐺𝑅𝑂𝑈𝑃 𝐵𝑌 𝑒𝑚𝑎𝑖𝑙 𝐻𝐴𝑉𝐼𝑁𝐺 𝐶𝑂𝑈𝑁𝑇(𝑒𝑚𝑎𝑖𝑙) > 1;
𝑆𝐸𝐿𝐸𝐶𝑇 * 𝐹𝑅𝑂𝑀 𝑤𝑜𝑟𝑘𝑒𝑟𝑠𝑊𝐻𝐸𝑅𝐸 𝑠𝑎𝑙𝑎𝑟𝑦 > (𝑆𝐸𝐿𝐸𝐶𝑇 𝐴𝑉𝐺 (𝑠𝑎𝑙𝑎𝑟𝑦) 𝐹𝑅𝑂𝑀 𝑤𝑜𝑟𝑘𝑒𝑟𝑠);
SQL: Даны таблицы workers и departments. Найдите все
департаменты без единого сотрудника
𝑆𝐸𝐿𝐸𝐶𝑇 𝑑𝑒𝑝𝑎𝑟𝑡𝑚𝑒𝑛𝑡_𝑛𝑎𝑚𝑒
𝐹𝑅𝑂𝑀 𝑤𝑜𝑟𝑘𝑒𝑟𝑠 𝑤
𝑅𝐼𝐺𝐻𝑇 𝐽𝑂𝐼𝑁 𝑑𝑒𝑝𝑎𝑟𝑡𝑚𝑒𝑛𝑡𝑠 𝑑 𝑂𝑁 (𝑤. 𝑑𝑒𝑝𝑎𝑟𝑡𝑚𝑒𝑛𝑡_𝑖𝑑 = 𝑑. 𝑑𝑒𝑝𝑎𝑟𝑡𝑚𝑒𝑛𝑡_𝑖𝑑)
𝑊𝐻𝐸𝑅𝐸 𝑓𝑖𝑟𝑠𝑡_𝑛𝑎𝑚𝑒 𝐼𝑆 𝑁𝑈𝐿𝐿;
IN:
EXISTS:
now()
Если вы забыли или потеряли ваш пароль для рута, то запустите базу данных с
командой “skip-grants-table”. После того, как вы установите новый пароль,
перезагрузите базу данных в обычном режиме и введите новый пароль.
𝑆𝐸𝐿𝐸𝐶𝑇 𝑉𝐸𝑅𝑆𝐼𝑂𝑁()
𝑆𝑒𝑙𝑒𝑐𝑡 𝑒𝑚𝑝𝑙𝑜𝑦𝑒𝑒𝐼𝑑 𝑓𝑟𝑜𝑚 (𝑆𝑒𝑙𝑒𝑐𝑡 𝑟𝑜𝑤𝑛𝑜, 𝑒𝑚𝑝𝑙𝑜𝑦𝑒𝑒𝑡𝐼𝑑 𝑓𝑟𝑜𝑚 𝑒𝑚𝑝𝑙𝑜𝑦𝑒𝑒) 𝑤ℎ𝑒𝑟𝑒 𝑚𝑜𝑑(𝑟𝑜𝑤𝑛𝑜, 2) = 1
Здесь всё просто. Каждая таблица InnoDB имеет кластерный ключ. Каждая. Без
исключения.
Составные индексы в бд
Основная идея колоночных СУБД — это хранение данных не по строкам, как это
делают традиционные СУБД, а по колонкам. Это означает, что с точки зрения
SQL-клиента данные представлены как обычно в виде таблиц, но физически эти
таблицы являются совокупностью колонок, каждая из которых по сути представляет
собой таблицу из одного поля. При этом физически на диске значения одного поля
хранятся последовательно друг за другом — приблизительно так:
[A1, A2, A3], [B1, B2, B3], [C1, C2, C3] и т.д.
PHP-FPM
FPM (FastCGI Process Manager, менеджер процессов FastCGI) является
альтернативной реализацией PHP FastCGI с несколькими дополнительными
возможностями обычно используемыми для высоконагруженных сайтов.
CGI
CGI (от англ. Common Gateway Interface — «общий интерфейс шлюза») —
стандарт интерфейса, используемого для связи внешней программы с
веб-сервером. Программу, которая работает по такому интерфейсу совместно с
веб-сервером, принято называть шлюзом, хотя многие предпочитают названия
«скрипт» (сценарий) или «CGI-программа». По сути позволяет использовать консоль
ввода и вывода для взаимодействия с клиентом.
Сам интерфейс разработан таким образом, чтобы можно было использовать любой
язык программирования, который может работать со стандартными устройствами
ввода-вывода. Такими возможностями обладают даже скрипты для встроенных
командных интерпретаторов операционных систем, поэтому в простых случаях могут
использоваться даже командные скрипты.
Все скрипты, как правило, помещают в каталог cgi (или cgi-bin) сервера, но это не
обязательно: скрипт может располагаться где угодно, но при этом большинство
веб-серверов требует специальной настройки.
FastCGI
Интерфейс FastCGI — клиент-серверный протокол взаимодействия веб-сервера и
приложения, дальнейшее развитие технологии CGI. По сравнению с CGI является
более производительным и безопасным.
Dummy is passed around, but never actually called, or if it's called it responds with a default
answer (mostly null). It mainly exists to satisfy a list of arguments.
Stub
Stubs are used with query like methods - methods that return things, but it's not important if
they're actually called.
Mock
Mocks are used with command like methods - it's important that they're called, and we don't
care much about their return value (command methods don't usually return any value).
Diff
stubs verify state and the mocks verify behavior.
Иногда эти термины stubs и mock путают: разница в том, что стаб ничего не
проверяет, а лишь имитирует заданное состояние. А мок — это объект, у которого
есть ожидания. Например, что данный метод класса должен быть вызван
определенное число раз. Иными словами, ваш тест никогда не сломается из-за
«стаба», а вот из-за мока может.
Здесь есть один важный момент, который необходимо усвоить: блокировки S и X — это
2 разные блокировки. Это не значит что блокировка S, это какое-то подмножество
блокировки X. Это две разных сущности.
BEGIN;
SELECT * FROM `testlock` WHERE id=1 LOCK IN SHARE MODE; /* GET S LOCK */
SELECT SLEEP(5);
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK */
COMMIT;
BEGIN;
SELECT * FROM `testlock` WHERE id=1 FOR UPDATE; /* TRY TO GET X LOCK -
DEADLOCK AND ROLLBACK HERE */
COMMIT;
Как же с этим бороться? Офф. сайт Mysql советует комититься почаще, а так же
перепроверять код ошибки и перепроводить откатившуюся транзакцию. Мне
кажется есть вариант получше — сразу получать блокировку типа X. Тогда на
третьем шаге нашего рецепта Транзакция№1 смогла бы получить свою законную
блокировку и спокойно завершиться
Напоследок скажу что определить причину deadlock поможет команда SHOW ENGINE
INNODB STATUS, которая показывает какие блокировки кто держит и какие ожидает
Составной индекс по полям (A, B) всегда может использоваться вместо индекса (A), но
не может использоваться вместо индекса (B). Ну, если это стандартный B-Tree индекс.
Тем не менее, поиск по простому индексу (A) будет чуть быстрее, чем по составному
(A, B), из-за бо́льшего числа записей в одном ключевом узле дерева. Но на интах вы
этого не заметите.
MySQL обычно использует тот индекс, который находит наименьшее количество строк.
Индекс применяется для столбцов, которые сравниваются с помощью следующих
операторов: =, >, >=, <, <=, BETWEEN и LIKE с префиксом, не содержащим
шаблонного символа, такого как something%.
Если использование индекса требует от MySQL прохода более чем по 30% строк в
данной таблице (в таких случаях просмотр таблицы, по всей видимости, окажется
намного быстрее, так как потребуется выполнить меньше операций поиска). Следует
учитывать, что если подобный запрос использует LIMIT по отношению только к
извлекаемой части строк, то MySQL будет применять индекс в любом случае, так как
небольшое количество строк можно найти намного быстрее, чтобы вернуть результат.
Если диапазон изменения индекса может содержать величины NULL при
использовании выражений ORDER BY ... DESC.
Доменные сокеты UNIX знают, что они выполняются в одной и той же системе, поэтому
они могут избежать некоторых проверок и операций (например, маршрутизации); что
делает их быстрее и легче, чем IP-сокеты. Поэтому, если вы планируете
взаимодействовать с процессами на одном хосте, это лучший вариант, чем IP-сокеты.
Доменные сокеты UNIX знают, что они выполняются в одной и той же системе, поэтому
они могут избежать некоторых проверок и операций (например, маршрутизации);
что делает их более быстрыми и легкими, чем сокеты IP.
Когда рефакторить
Правило трёх:
● Рефакторинг помогает понять чужой код. Если код, в который нужно добавить
новую фичу, недостаточно ясный, рефакторинг позволяет сделать его
очевидней для вас и для того, кто будет работать с ним в будущем.
● Рефакторинг облегчает написание нового кода. После рефакторинга
добавление новой фичи происходит значительно более гладко и занимает
меньше времени.
Во время код-ревью
● Когда вы делаете ревью новой фичи, возможно это последний шанс почистить
код перед тем, как он окажется доступным публично.
● Лучше всего проводить такое ревью вместе с автором кода. В этом случае, вы
будете предлагать автору изменения, а потом вместе решать, насколько сложно
произвести то или иное изменение. При этом, небольшие изменения можно
будет осуществлять очень быстро.
Как рефакторить
Точечное обновление:
● Как только обновление / обновления происходят в событии публикации /
событиях в очереди JMS/AMQP/Database / очереди файловой системы/Amazon
SQS и т. д. либо полный продукт, либо основной идентификатор объекта(я бы
рекомендовал просто ID)
● Затем потребитель очереди должен вызвать веб-службу, чтобы получить
полный объект, если только первичный ID помещен в очередь, или просто взять
сам объект и отправить соответствующие изменения в базу данных Elastic
search/NoSQL.
Главное отличие от «фабрики» — это то, что она используется, когда создание
занимает один шаг, а «строитель» применяется при множестве шагов.
AUTO_INCREMENT vs UUID
Преимущества:
Недостатки:
SOAP vs REST
SOAP — это формат протокола, основанный на XML, тогда как REST — это
архитектурный подход.
На верхнем уровне SOAP ограничивает структуры ваших сообщений, тогда как REST
— это архитектурный подход, ориентированный на использование HTTP в качестве
транспортного протокола.
Специфика SOAP — это формат обмена данными. С SOAP это всегда SOAP-XML,
который представляет собой XML, включающий:
● — Envelope (конверт) – корневой элемент, который определяет сообщение и
пространство имен, использованное в документе,
● — Header (заголовок) – содержит атрибуты сообщения, например: информация
о безопасности или о сетевой маршрутизации,
● — Body (тело) – содержит сообщение, которым обмениваются приложения,
● — Fault – необязательный элемент, который предоставляет информацию об
ошибках, которые произошли при обработке сообщений. И запрос, и ответ
должны соответствовать структуре SOAP.
OWASP
ID PARENT_ID
1 NULL
2 1
3 1
4 3
5 4
Вариант с подзапросом:
Применение индексов
id — pk
text - текст
status — статусы от 1 до 10
Существуют индексы:
3 Select * from somename where text like "%test" - не применит никакой индекс
4 Select * from somename where text like "test%" and status=2 - применит idx_2
5 Select * from somename where text like “%test" and status=2 - применит idx_3
7 Select * from somename where number>1000 and status=2 - применит idx_1 + where
8 Select * from somename where status>5 and number=1 - применит idx_1
9 Select * from somename where number>1000 and status>5 - частично применит idx_1