Проектирование структуры базы данных

Содержание

Слайд 2

Правильно называть – СУБД В разговорной речи часто СУБД = БД (DB)
БД —

Правильно называть – СУБД В разговорной речи часто СУБД = БД (DB)
хранит данные, отдает/обновляет по запросу
БД — это обычно сервис, доступный по сети
БД — сложная внутри, простая в использовании

ЧТО ТАКОЕ БАЗА ДАННЫХ?

Слайд 3

Солянка алгоритмов и структур данных
Hash-таблицы
Деревья поиска
Бинарный поиск
Чтение из файла по offset
и многое

Солянка алгоритмов и структур данных Hash-таблицы Деревья поиска Бинарный поиск Чтение из
другое…

БД — ЭТО НЕ МАГИЯ

Слайд 4

Администрирование БД != Использование БД

ИСПОЛЬЗОВАТЬ ПРОСТО, НО ЕСТЬ НЮАНСЫ

Администрирование БД != Использование БД ИСПОЛЬЗОВАТЬ ПРОСТО, НО ЕСТЬ НЮАНСЫ

Слайд 5

КЛАССИФИКАЦИЯ БД

КЛАССИФИКАЦИЯ БД

Слайд 6

МНОГО РАЗНЫХ ЦЕЛЕЙ — МНОГО РАЗЛИЧНЫХ БАЗ ДАННЫХ

МНОГО РАЗНЫХ ЦЕЛЕЙ — МНОГО РАЗЛИЧНЫХ БАЗ ДАННЫХ

Слайд 7

Распределенные
Централизованные

ПО МАСШТАБАМ

Распределенные Централизованные ПО МАСШТАБАМ

Слайд 8

В оперативной памяти
На жестких дисках

ПО СРЕДЕ ХРАНЕНИЯ

В оперативной памяти На жестких дисках ПО СРЕДЕ ХРАНЕНИЯ

Слайд 9

Распределенный кеш (данные могут потеряться)
Полнотекстовый поиск
Хранилища под метрики (специальная математика)
Хранилища под географию

Распределенный кеш (данные могут потеряться) Полнотекстовый поиск Хранилища под метрики (специальная математика)
(геометрия)
Графовые БД
In-memory хранилища (очень быстро, но очень дорого)

ПО ТИПУ ЗАДАЧ

Слайд 10

Реляционные
NoSQL:
Документные: MongoDB)
Колоночные: HBase, Cassandra
Ключ-значение: Amazon DynamoDB)

SQL VS NOSQL

Реляционные NoSQL: Документные: MongoDB) Колоночные: HBase, Cassandra Ключ-значение: Amazon DynamoDB) SQL VS NOSQL

Слайд 11

ТРЕБОВАНИЯ К БД

ТРЕБОВАНИЯ К БД

Слайд 12

Нельзя прочитать/записать половину записи («мама мыла ра»)

ATOMICITY

Нельзя прочитать/записать половину записи («мама мыла ра») ATOMICITY

Слайд 13

Данные не должны теряться после успешного сохранения
Как? Репликация, рейд дисков, operation log,

Данные не должны теряться после успешного сохранения Как? Репликация, рейд дисков, operation log, … DURABILITY

DURABILITY

Слайд 14

После успешного или неуспешного выполнения запроса данные должны быть согласованы
Если Фред переводит

После успешного или неуспешного выполнения запроса данные должны быть согласованы Если Фред
Барни 100$, то после:
— либо у Фреда -100$ и у Барни +100$
— либо у Фреда -0$ и у Барни +0$

CONSISTENCY

Слайд 15

Параллельно выполняемые запросы не должны оказывать влияние на результат
Один запрос распределяет материальную

Параллельно выполняемые запросы не должны оказывать влияние на результат Один запрос распределяет
помощь в размере X студентам группы A, другой запрос переводит одного из студентов в группу B

ISOLATION

Слайд 16

Запрос 1: Распределение матпомощи X для группе A
var count = students.Count(s

Запрос 1: Распределение матпомощи X для группе A var count = students.Count(s
=> s.Group == "A");
var sumPerStudent = X / count;
foreach (var s in students.Where(s => s.Group == "A"))
s.Money += sumPerStudent;
Запрос 2: Перевод студента в группу B из группы A
students.SingleOrDefault(s => s.Id == Id)?.Group = "B";

ISOLATION

Слайд 17

Параллельно выполняемые запросы не должны оказывать влияние на результат
Один запрос распределяет материальную

Параллельно выполняемые запросы не должны оказывать влияние на результат Один запрос распределяет
помощь в размере X студентам группы A, другой запрос переводит одного из студентов в группу B
Сложно хорошо изолировать запросы, каждая СУБД гарантирует некоторый уровень изоляции

ISOLATION

Слайд 18

Atomicity
Consistency
Isolation
Durability
Желаемый набор требований Сложно обеспечить, особенно в распределенных БД

ACID

Atomicity Consistency Isolation Durability Желаемый набор требований Сложно обеспечить, особенно в распределенных БД ACID

Слайд 19

БД должна быть доступна 99.(9)% времени

AVAILABILITY

БД должна быть доступна 99.(9)% времени AVAILABILITY

Слайд 20

Распределенная БД должна быть устойчива к brain-split

PARTITION TOLERANCE

Распределенная БД должна быть устойчива к brain-split PARTITION TOLERANCE

Слайд 21

Распределенная БД должна быть устойчива к brain-split

PARTITION TOLERANCE

Распределенная БД должна быть устойчива к brain-split PARTITION TOLERANCE

Слайд 22

Распределенная БД должна быть устойчива к brain-split

PARTITION TOLERANCE

Распределенная БД должна быть устойчива к brain-split PARTITION TOLERANCE

Слайд 23

В распределенной системе невозможно обеспечить одновременное выполнение:
Consistency (Целостности)
Availability (Доступности)
Partition Tolerance (Устойчивости к

В распределенной системе невозможно обеспечить одновременное выполнение: Consistency (Целостности) Availability (Доступности) Partition
сбоям узлов)
ДОКАЗАНО МАТЕМАТИКАМИ

CAP-ТЕОРЕМА БРЮЕРА

Слайд 24

Система рассчитывает, что сеть надежна, либо не распределенная

ПРИМЕР C+A

Система рассчитывает, что сеть надежна, либо не распределенная ПРИМЕР C+A

Слайд 25

Система с несколькими мастер-базами, которые обновляются синхронно
Всегда доступна на чтение, но запрещает

Система с несколькими мастер-базами, которые обновляются синхронно Всегда доступна на чтение, но
запись при разрывах сети

ПРИМЕР C+PT

Слайд 26

Система с несколькими серверами, каждый из которых может принимать данные, но не

Система с несколькими серверами, каждый из которых может принимать данные, но не
обязуется в тот же момент распространять их по всему кластеру
Система переживает падения части серверов, но когда они входят в строй, они будут выдавать старые данные

ПРИМЕР A+PT

Слайд 27

Теорема доказана с конкретными формулировками понятий C, A и PT
Можно попытаться ослабить

Теорема доказана с конкретными формулировками понятий C, A и PT Можно попытаться
формулировки, получив что-то жизнеспособное

ОБХОД CAP-ТЕОРЕМЫ

Слайд 28

Брюер предложил оказаться от Consistency, но мягко:
Basically Available
Soft state
Eventual consistency

BASE

Брюер предложил оказаться от Consistency, но мягко: Basically Available Soft state Eventual consistency BASE

Слайд 29

Basically Available
= Availability в CAP
Soft state состояние меняется даже без внешних воздействий, чтобы прийти

Basically Available = Availability в CAP Soft state состояние меняется даже без
к согласованности
Eventual consistency реплики сходятся к одинаковому состоянию и в конце концов станут согласованными

BASE

Слайд 30

BASE ВМЕСТО ACID

BASE ВМЕСТО ACID

Слайд 31

Обычно, самое важное:
Данные не должны теряться (ACID)
Данные должны быть согласованы (ACID, CAP,

Обычно, самое важное: Данные не должны теряться (ACID) Данные должны быть согласованы
BASE)
Устойчива к brain-split (CAP)
Как это достигается — за рамками этого блока

ТРЕБОВАНИЯ К БД

Слайд 32

БД должна работать быстро
Это сильно зависит в том числе и от

БД должна работать быстро Это сильно зависит в том числе и от
того, как ей пользоваться и как спроектировать данные в ней
Об этом далее!

ТРЕБОВАНИЯ К БД

Слайд 33

ПРОЕКТИРОВАНИЕ СТРУКТУРЫ БД

ПРОЕКТИРОВАНИЕ СТРУКТУРЫ БД

Слайд 34

О чем поговорим:
Коллекции, поиск по индексам
Примеры на БД «MongoDB»

ТОЛЬКО ОСНОВЫ

О чем поговорим: Коллекции, поиск по индексам Примеры на БД «MongoDB» ТОЛЬКО ОСНОВЫ

Слайд 35

Документная
Масштабируемая
Гибкая

MONGODB

Документная Масштабируемая Гибкая MONGODB

Слайд 36

Users:
{”Login”: ”Ciceron”, ”Role”: ”Owner”}
{”Login”: ”Popper”, ”Role”: ”Admin”, ”BanHammer”: ”true”}
{”Login”: ”Freid”, ”Role”: ”User”,

Users: {”Login”: ”Ciceron”, ”Role”: ”Owner”} {”Login”: ”Popper”, ”Role”: ”Admin”, ”BanHammer”: ”true”} {”Login”:
”Status”: ”Ban”}
{”Login”: ”ImmanuelKant”, ”Role”: ”User”}

Messages:
{”Author”: ”Freid”, ”Text”: ”Hi all”, ”Timestamp”: ”2019-02-21”}

КОЛЛЕКЦИИ

Слайд 37

А как их искать?
Найти пользователя с заданным логином
А быстро?

КАК ХРАНИТЬ ДОКУМЕНТЫ?

А как их искать? Найти пользователя с заданным логином А быстро? КАК ХРАНИТЬ ДОКУМЕНТЫ?

Слайд 38

Рядом с файлом данных коллекции хранить HashTable:
Login → смещение в файле данных,

Рядом с файлом данных коллекции хранить HashTable: Login → смещение в файле
по которому записан пользователь с таким Login

ПОИСК ПО ТОЧНОМУ СОВПАДЕНИЮ

Слайд 39

Найти все сообщения с января по февраль
Любая ordered структура

ПОИСК ПО ДИАПАЗОНУ

Найти все сообщения с января по февраль Любая ordered структура ПОИСК ПО ДИАПАЗОНУ

Слайд 40

Может быть много индексов у одной коллекции
Занимает дополнительное место
Замедляет операции обновления данных
Создаются

Может быть много индексов у одной коллекции Занимает дополнительное место Замедляет операции
под запросы, которые придётся выполнять часто

ИНДЕКСЫ

Слайд 41

Пользователь ввел логин и пароль, нужно его аутентифицировать
ForumDB:
Users:
Index on Login

ЗАДАЧА «ФОРУМ»

Пользователь ввел логин и пароль, нужно его аутентифицировать ForumDB: Users: Index on Login ЗАДАЧА «ФОРУМ»

Слайд 42

Пользователь прошел по ссылке на конкретное сообщение, нужно его отобразить
ForumDB:
Users:
Index on Login
Messages:
Index

Пользователь прошел по ссылке на конкретное сообщение, нужно его отобразить ForumDB: Users:
on MessageId

ЗАДАЧА «ФОРУМ»

Слайд 43

Показать список самых популярных сообщений
ForumDB:
Users:
Unordered index on Login
Messages:
Unordered index on MessageId
Ordered index

Показать список самых популярных сообщений ForumDB: Users: Unordered index on Login Messages:
on LikesCount

ЗАДАЧА «ФОРУМ»

Слайд 44

1
2
3
4
50
60
70

ORDERED INDEX ≈ СОРТИРОВАННЫЙ СПИСОК

1 2 3 4 50 60 70 ORDERED INDEX ≈ СОРТИРОВАННЫЙ СПИСОК

Слайд 45

Задан порядок (collation)
Поиск левой / правой границы O(logN)
Переход к предыдущему/следующему в среднем

Задан порядок (collation) Поиск левой / правой границы O(logN) Переход к предыдущему/следующему
O(1)
Поиск i-ого O(logN)

ORDERED INDEX — ОБЫЧНО ДЕРЕВО

2

60

50

70

1

3

4

Слайд 46

1
2
3
4
50
60
70
skip 1, take 3, с конца

SKIP/TAKE

1 2 3 4 50 60 70 skip 1, take 3, с конца SKIP/TAKE

Слайд 47

SKIP/TAKE

2

60

50

70

1

3

4

skip 1, take 3, с конца

SKIP/TAKE 2 60 50 70 1 3 4 skip 1, take 3, с конца

Слайд 48

1, cat
2
3
4
50
60, cat
70

ФИЛЬТРАЦИЯ

1, cat 2 3 4 50 60, cat 70 ФИЛЬТРАЦИЯ

Слайд 49

ФИЛЬТРАЦИЯ

2

60, cat

50

70

1, cat

3

4

ФИЛЬТРАЦИЯ 2 60, cat 50 70 1, cat 3 4

Слайд 50

ORDERED INDEX + ФИЛЬТРАЦИЯ

Топ М сообщений = взять первое и M раз

ORDERED INDEX + ФИЛЬТРАЦИЯ Топ М сообщений = взять первое и M
перейти к следующему: O(M + logN)
Топ M без картинок = взять первое и, пропуская картинки, переходить к следующему, пока не наберем M в результат: O(M + K + logN), K – количество сообщений с картинками в первых M + K сообщениях. Если мы знаем, что К мало, то хорошо

Слайд 51

Показать последние T сообщений из заданного треда обсуждений
Тредов много
Могут обратиться как к

Показать последние T сообщений из заданного треда обсуждений Тредов много Могут обратиться
старому треду, так и к новому

ЗАДАЧА «ФОРУМ»

Слайд 52

СОСТАВНЫЕ ИНДЕКСЫ

TopicId, PublicationDate
1, 2019-02-10
1, 2019-02-15
6, 2019-01-01
6, 2019-02-02
7, 2019-02-18
9, 2019-01-05

Найти последние сообщения в

СОСТАВНЫЕ ИНДЕКСЫ TopicId, PublicationDate 1, 2019-02-10 1, 2019-02-15 6, 2019-01-01 6, 2019-02-02
топике 6:
Найти левую границу (6, Date.MaxValue), и взять M предыдущих значений, пока TopicId=6

Слайд 53

ForumDB:
Users:
Unordered index on Login
Messages:
Unordered index on MessageId
Ordered index on Likes
Ordered index on

ForumDB: Users: Unordered index on Login Messages: Unordered index on MessageId Ordered
TopicId, PublicationDate

СОСТАВНОЙ ИНДЕКС

Слайд 54

Стратегия поиска в БД
Стратегия проектирования структуры БД
Стратегия выбора БД

ВЫВОДЫ ПО ПРОЕКТИРОВАНИЮ

Стратегия поиска в БД Стратегия проектирования структуры БД Стратегия выбора БД ВЫВОДЫ ПО ПРОЕКТИРОВАНИЮ

Слайд 55

Максимально сильно сузить выборку с помощью поиска по индексу до малого числа

Максимально сильно сузить выборку с помощью поиска по индексу до малого числа
документов
Отфильтровать оставшееся
Идеально, если поиски будут происходить по точечному, известному ключу

СТРАТЕГИЯ ПОИСКА В БД

Слайд 56

Заранее выяснить какие запросы БД должна уметь обрабатывать эффективно
Понять, какие будут коллекции
Спланировать,

Заранее выяснить какие запросы БД должна уметь обрабатывать эффективно Понять, какие будут
где нужны индексы
А где можно просто отфильтровать, опираясь на знание природы данных и сэкономить на индексах

СТРАТЕГИЯ ПРОЕКТИРОВАНИЯ СТРУКТУРЫ БД

Слайд 57

Понимать специфику своих потребностей
Понимать ограничения и сильные стороны разных СУБД
Возможно, даже использовать

Понимать специфику своих потребностей Понимать ограничения и сильные стороны разных СУБД Возможно,
несколько СУБД в одном проекте
Это умение приходит с опытом и кругозором
Не поддавайтесь хайпу
Вы не Google

СТРАТЕГИЯ ВЫБОРА БД

Слайд 58

ПРАКТИКА ПРОЕКТИРОВАНИЯ БД

ПРАКТИКА ПРОЕКТИРОВАНИЯ БД

Слайд 59

СЕРВИС ДЛЯ ОТЕЛЕЙ

public interface IHotelRepository
{
HotelId AddHotel(string name);
void RemoveHotel(HotelId hotelId);

СЕРВИС ДЛЯ ОТЕЛЕЙ public interface IHotelRepository { HotelId AddHotel(string name); void RemoveHotel(HotelId
RoomId AddRoom(HotelId hotelId, RoomDescription roomDescription);
void RemoveRoom(RoomId roomId);
void RentRoom(RoomId roomId, DateTime from, DateTime to, Guest[] guests);
Guest[] GetArrivedGuests(DateTime day);
(From, To, Guest[])[] GetRoomSchedule( RoomId roomId, DateTime from, DateTime to);
RoomDescription[] GetFreeRooms(HotelId hotelId, DateTime from, DateTime to);
}
Проектировать будем тут: http://bit.ly/db-shpora

Слайд 60

Фиксируем результат проектирования в документе
Описываем коллекцию как набор полей
Если над полем надо

Фиксируем результат проектирования в документе Описываем коллекцию как набор полей Если над
построить индекс, явно пишем об этом в колонке атрибутов поля
Указываем, какой индекс: ordered/unordered
Отмечаем поле для первичного ключа
Запросы описываем словами Коротко и ясно, как и где происходит запрос

КАК ПРОЕКТИРОВАТЬ БД?

Слайд 61

Нам понадобится коллекция «отели»
Пусть у каждого отеля будет уникальный индекс
Флаг «удалено»
Где хранить

Нам понадобится коллекция «отели» Пусть у каждого отеля будет уникальный индекс Флаг
комнаты?
Сделаем еще коллекцию «комнаты»
Флаг «доступности» комнаты, ведь комната может быть закрыта на ремонт

КОЛЛЕКЦИЯ КОМНАТ

Слайд 62

RoomId AddRoom(
HotelId hotelId,
RoomDescription roomDescription);
Добавить комнату в коллекцию «комнаты»
Привязать комнату к отелю

ПРИМЕР: ДОБАВЛЕНИЕ

RoomId AddRoom( HotelId hotelId, RoomDescription roomDescription); Добавить комнату в коллекцию «комнаты» Привязать
КОМНАТЫ

Слайд 63

void RentRoom(
RoomId roomId,
DateTime from,
DateTime to,
Guest[] guests);
http://bit.ly/db-shpora
Скопируйте лист преподавателя

void RentRoom( RoomId roomId, DateTime from, DateTime to, Guest[] guests); http://bit.ly/db-shpora Скопируйте
и переименуйте его вашими фамилиями

ЗАДАЧА: БРОНИРОВАНИЕ КОМНАТ

Слайд 64

Guest[] GetArrivedGuests(DateTime day)

ЗАДАЧА: ОТЧЕТНОСТЬ В МВД

Guest[] GetArrivedGuests(DateTime day) ЗАДАЧА: ОТЧЕТНОСТЬ В МВД

Слайд 65

Можно попросить СУБД отдать не весь документ, а только отдельные его поля

Можно попросить СУБД отдать не весь документ, а только отдельные его поля = проекцию ПРОЕКЦИИ
= проекцию

ПРОЕКЦИИ

Слайд 66

(From, To, Guest[])[] GetRoomSchedule(
RoomId roomId,
DateTime from,
DateTime to);
Запрос должен работать быстро!

ЗАДАЧА:

(From, To, Guest[])[] GetRoomSchedule( RoomId roomId, DateTime from, DateTime to); Запрос должен
ИСТОРИЯ КОМНАТЫ

Слайд 67

Можно ли одновременно искать с условиями на From и на To?
С нашей

Можно ли одновременно искать с условиями на From и на To? С
моделью упорядоченного индекса НЕТ!
Но можно изобрести структуру данных для индекса, которая сможет. Например, K-d дерево, R-дерево, квадродерево.
Только, скорее всего, в СУБД она не реализована

СОСТАВНОЙ ИНДЕКС VS ДВА ИНДЕКСА

Слайд 68

RoomDescription[] GetFreeRooms(
HotelId hotelId,
DateTime from,
DateTime to);

ЗАДАЧА: СВОБОДНЫЕ КОМНАТЫ

RoomDescription[] GetFreeRooms( HotelId hotelId, DateTime from, DateTime to); ЗАДАЧА: СВОБОДНЫЕ КОМНАТЫ

Слайд 69

(RoomId, To)
(HotelId, To)
А нельзя ли вместо двух, иметь один такой?
(HotelId, RoomId, To)

НУЖНО

(RoomId, To) (HotelId, To) А нельзя ли вместо двух, иметь один такой?
ЛИ ОБА СОСТАВНЫХ?

Слайд 70

HotelId, RoomId, To
1, 100, 2019-01-10
2, 200, 2019-01-02
2, 200, 2019-01-05
2, 201, 2019-01-03

2, 299,

HotelId, RoomId, To 1, 100, 2019-01-10 2, 200, 2019-01-02 2, 200, 2019-01-05
2019-01-10
3, 300, 2019-01-01

НУЖНЫ ОБА СОСТАВНЫХ!

(HotelId, RoomId, To) заменит (RoomId, To)

(HotelId, RoomId, To) НЕ заменит (HotelId, To)

Слайд 71

Один «родитель», много «детей»
Полностью в родителе Guests в Rent
Идентификаторы в родителе RoomIds в Hotel
Идентификатор

Один «родитель», много «детей» Полностью в родителе Guests в Rent Идентификаторы в
родителя в ребенке RoomId в Rents

ХРАНЕНИЕ СВЯЗИ «ОДИН-МНОГО»

Слайд 72

В реляционных БД принято «нормализовать», хранить связи в отдельной таблице с записями вида

В реляционных БД принято «нормализовать», хранить связи в отдельной таблице с записями
(Id, ParentId, ChildId)
Предыдущие подходы к хранения связи «Один-Много» — «денормализация»

НОРМАЛИЗАЦИЯ

Слайд 73

ОТЛИЧИЯ РЕЛЯЦИОННЫХ БД

ОТЛИЧИЯ РЕЛЯЦИОННЫХ БД

Слайд 74

MONGO VS SQL

Хранит коллекцию документов
Структура документов не фиксирована

Табличная структура
Поля заранее зафиксированы, изменение

MONGO VS SQL Хранит коллекцию документов Структура документов не фиксирована Табличная структура
их состава – отдельная процедура

Слайд 75

MONGO VS SQL

Документы могут иметь произвольную вложенность
Денормализация для уменьшения числа запросов
Простые клиенты,

MONGO VS SQL Документы могут иметь произвольную вложенность Денормализация для уменьшения числа
простая конвертация объектов в BSON и обратно

В ячейках таблицы примитивные значения
Принято нормализировать таблицы
Умные ORM, собирающие нормализованные данные обратно в объекты

Слайд 76

MONGO VS SQL

uniq – индексы в рамках шарда
Распределенная система

Транзакции, триггеры, ограничения, каскадные

MONGO VS SQL uniq – индексы в рамках шарда Распределенная система Транзакции,
операции и прочее, завязанное на локальность
Локальная система

Слайд 77

ПРАКТИКА ИСПОЛЬЗОВАНИЯ БД

ПРАКТИКА ИСПОЛЬЗОВАНИЯ БД

Слайд 78

ЗАДАЧА: GAME

2 игрока
Несколько туров
Уже реализована
Хранит всё в памяти

ЗАДАЧА: GAME 2 игрока Несколько туров Уже реализована Хранит всё в памяти

Слайд 79

Зарегистрировать нового пользователя
Отредактировать / удалить пользователя
Создать планируемую игру
Добавить пользователя в игру
Начать /

Зарегистрировать нового пользователя Отредактировать / удалить пользователя Создать планируемую игру Добавить пользователя
закончить игру
Сделать пользователем ход в игре
Показать текущую информацию по игре
Заново проиграть историю игры

СЦЕНАРИИ

Слайд 80

Пользователь:
логин, имя, статистика, …
Игра:
игроки, статус, номер тура, текущий счёт, …
Тур:

Пользователь: логин, имя, статистика, … Игра: игроки, статус, номер тура, текущий счёт,

в какой игре, номер тура, кто как ходил, кто выиграл

СУЩНОСТИ

Слайд 81

Game – реализация предметной области
Tests – тесты
ConsoleApp – реализация логики приложения

DEMO GAME

Game – реализация предметной области Tests – тесты ConsoleApp – реализация логики приложения DEMO GAME

Слайд 82

Создание БД
Создание документа
Поиск документа
Индексы

DEMO MONGODB COMPASS

Создание БД Создание документа Поиск документа Индексы DEMO MONGODB COMPASS

Слайд 83

https://github.com/kontur-web-courses/db/blob/main/README.md

ФОРМУЛИРОВКА ЗАДАНИЯ

https://github.com/kontur-web-courses/db/blob/main/README.md ФОРМУЛИРОВКА ЗАДАНИЯ

Слайд 84

Bson-based язык запросов MongoDB
Специализированные методы репозиториев
Отвязывание сущностей БД от классов, реализующих логику

Bson-based язык запросов MongoDB Специализированные методы репозиториев Отвязывание сущностей БД от классов,
предметной области (Automapper)

БОНУС-ИДЕИ

Имя файла: Проектирование-структуры-базы-данных.pptx
Количество просмотров: 47
Количество скачиваний: 1