Skip to content

Модель данных

polinaKoroleva05 edited this page Oct 20, 2024 · 12 revisions

Реляционная модель.

er.png

Назначение сущностей.

Для дальнейшего расчета объема памяти, будем считать длину строк n = 150, т.к. строки фигурируют в полях с именем пользователя, логином, паролем, типом события, описанием события, адресом и названием склада, которые не требуют большой длины.

Склад.

Хранение информации о складе, на котором расположены ячейки. Поля:

  • int id_storage (4)
  • text Адрес (n)
  • text Название (n)

Ячейка.

Хранение информации о характеристиках и состоянии ячейки.

  • int id_cell (4)
  • int id_storage (4)
  • int Номер ячейки (4)
  • int Номер яруса (4)
  • bool Свободна (1)
  • datetime Время окончания аренды (8)
  • char Размер (1)

Событие.

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

  • int id_event (4)
  • int id_cell (4)
  • int id_user (4)
  • text Тип события (n)
  • text Описание (n)
  • datetime Время (8)

Пользователь.

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

  • int id_user (4)
  • text ФИО (n)
  • int Роль (4)
  • text Логин (n)
  • text Пароль (n)
  • datetime Дата регистрации (8)
  • float Задолженность (4)

Оценка объема информации.

Рассчитаем размер каждой сущности:

  • Склад: 4 + 150*2 = 304 байта
  • Ячейка: 4*3 + 2 + 8 = 22 байта
  • Событие: 4*3 + 150*2 + 8 = 320 байт
  • Пользователь: 4*3 + 150*3 + 8 = 470 байт

Для расчета формулы, определим, что на каждом складе должно быть как минимум:

  • 100 ячеек
  • каждую ячейку нужно хотя бы раз обслужить, забронировать и освободить => 300 событий
  • 3 рабочих, 1 директор склада, 100 клиентов, 1 сис.админ => 105 пользователей

*владелец бизнеса не включен в формулу, т.к. он всегда 1.

Формула, зависящая от количества складов s:

$V(s) = ( 304 + 22*100 + 320*300 + 470*105 )*s = 147 854*s$

Избыточность.

Избыточные поля в модели:

  • id_storage в сущности Склад
  • id_storage, id_cell в сущности Ячейка
  • id_event, id_cell, id_user в сущности Событие
  • id_user в сущности Пользователь

За вычетом избыточных полей, объем коллекции будет составлять:

$V_{чист}(s) = ( 300 + 14*100 + 312*300 + 466*105 )*s = 144 230 *s$

Отношение между фактическим объемом базы и чистым объемом составляет:

$\frac{V(s)}{V_{чист}(s)} = \frac{147 854*s}{144 230 *s} = 1.025$

Зависимость избыточности от кол-ва складов можно выразить формулой:

$V(s) - V_{чист}(s) = 147 854*s - 144 230 *s = 3 624 * s$

Направление роста модели.

Создание объекта одной сущности не требует создания объектов других сущностей. Поэтому скорость роста модели имеет простую зависимость от каждой сущности.

Ранжировка сущностей по влиянию на скорость роста модели:

  1. Пользователь (наибольший рост модели)
  2. Событие
  3. Склад
  4. Ячейка (наименьший рост модели)

Примеры данных.

Таблица Склад Storage.

id_storage adress title
29031 г. Санкт-Петербург ул. Кузнецовская д. 16к1 Электросила
19384 г. Санкт-Петербург ул. Задворная д. 15 Волковская
46237 г. Санкт-Петербург ул. Гренадерская д. 34 Выборгская

Таблица Ячейка Cell.

id_cell cell_number floor is_free date_free size
34232 23 2 true null M
78932 5 1 false 2024-12-01 16:00:00 S
92648 201 5 false 2025-01-13 23:15:00 L

Таблица Событие Event.

id_event id_cell id_user type_action descript created_at
22394 78932 91822 reserve null 2024-10-24 11:13:02
67438 34232 78221 release null 2024-10-24 16:57:16
68927 78932 91822 open null 2024-10-24 17:00:16
83211 67322 10001 failure Отломалась ручка дверцы 2024-11-03 11:01:23

Таблица Пользователь User.

id_user FIO role login password created_at arrear
91822 Иванов Андрей Викторович 5 ivanov@mail.ru 3hjfs3jhd33kllssl 2023-10-03 16:01:00 0.00
78221 Петров Олег Игоревич 5 petrov@mail.ru 42ijscnnjd38njjhj 2024-11-10 08:04:57 200.00
10001 Смирнов Дмитрий Васильевич 1 smir32@mail.ru hjf3lmvn6c948df 2020-03-05 12:58:23 0.00

Примеры запросов.

Авторизация

SELECT role
  FROM User
 WHERE id = @id
   AND password = @password

Регистрация

INSERT INTO User(FIO, login, password, created_at, arear)
     VALUES (@FIO, @login, @password, NOW(), 0.00)

Аренда ячейки

INSERT INTO Event(id_cell, id_user, type_action, descript, created_at)
     VALUES (@id_cell, @id_user, "reserve", null, NOW())

UPDATE Cell
   SET is_free = false, date_free = @date_free
 WHERE id = @id_cell;

Обслуживание ячейки

INSERT INTO Event(id_cell, id_user, type_action, descript, created_at)
     VALUES (@id_cell, @id_user, 'service', null, NOW())

Построение статистики кол-ва обслуживаний проведенных каждым работником

WITH Services (id_user, count_of_services) AS (
SELECT id_user, COUNT(*)
    FROM Event
   WHERE type_action = 'service'
GROUP BY id_user
)

SELECT fio, count_of_services
FROM User
JOIN Services ON Services.id_user = User.id_user;

Импорт данных о складах

COPY Storage FROM '/dataset.scv' DELIMITER ',' CSV HEADER;

Экспорт данных о событиях

COPY Event TO '/export.csv' DELIMITER ',' CSV HEADER;

Нереляционная модель.

Назначение сущностей.

Оценка объема информации.

Избыточность.

Направление роста модели.

Примеры данных.

Примеры запросов.

Сравнение моделей.

Вывод.