Skip to content

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

Stepanenko Denis edited this page Oct 21, 2024 · 14 revisions

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

MongoDB

Графическое представление в виде ER-диаграммы

image

!Nosql

Описание коллекций

forms

{
"_id": ObjectId(),                  // Уникальный идентификатор пользователя
"owner_mail": "string",             // Почта пользователя 
}

users

{
 "_id": ObjectId(),                 // Уникальный идентификатор пользователя
 "email": "string",                 // Почта пользователя
 "form_id_for_edit": [ObjectId()]   // Уникальный идентификатор формы, которую пользователь может изменять            
} 

user_answers

{
"_id": ObjectId(),                  // Уникальный идентификатор кортежа ответов
"form_id": ObjectId(),              // Уникальный идентификатор формы
"answers_id": integer,              // Идентификатор кортежа ответов (от яндекса)
"creation_date": ISODate(),         // Дата ответа на форму
"answers": [{
    "question": "string",           // Вопрос
    "answer": "string"              // Ответ
}]
}

logs

{
"_id": ObjectId(),                  // Уникальный идентификатор логов
"form_id ": ObjectId(),             // Уникальный идентификатор формы   
"event_type": "string",             // Тип лога
"edit_email": "string",             // Почта пользователя
"edit_time": ISODate(),             // Время изменения
"edit_action": "string"             // Действие
} 

Оценка объема информации, хранимой в модели

Средний размер объектов каждой сущности:

Предположительный объем данных:

  • В среднем на одной форме вопросов - 10 (Q)
  • В среднем у формы редакторов - 2 (N)
  • В среднем проходят опрос человек - 20 (H)
  • В среднем кол-во форм - 3 (F)

forms:

  • _id (ObjectId): 12 байт
  • owner_mail: 320 байт

Итого для формы: (12 + 320) * F = 332 * F байта

users:

  • _id (ObjectId): 12 байт
  • mail: 320 байт
  • form_id_for_edit: по 12 байт на каждую форму

Итого для пользователя: 12 + 320 + 12 * N = (332 + 12 * N) байта

logs:

  • _id (ObjectId): 12 байт
  • form_id (ObjectId): 12 байт
  • event_type: 50 байт
  • edit_email: 320 байт
  • edit_time: 8 байт
  • edit_action: 100 байт

Итого для логов: (320 + 100 + 50 + 12 + 12 + 8) * (H + 5) = 502 * (H + 5) байта

user_answers:

{

  • _id (ObjectId): 12 байт

  • form_id (ObjectId): 12 байт

  • answers_id: 8 байт

  • creation_date: 8 байт

  • answers: [{

      question: 1500 байт

      answer: 1000 байт }] } Итого: (12 + 12 + 8 + (1500 + 1000) * Q) * H = (32 + (1500 + 1000) * Q) * H байт

(F * (320 + 502 * (H + 5) + (32 + (1500 + 1000) * Q) * H) + (332 + 12 * N)) * P = (3 * (320 + 502 * (20 + 5) + (32 + (1500 + 1000) * 10) * 20) + (332 + 12 * 2)) * P = 1540886 * P

Избыточность данных

В модели присутствуют ссылающие друг на друга id:

  1. Ответы пользователя и логи ссылаются на таблицу.
  2. Форма ссылается на пользователя (владельца формы).
  3. Пользователи ссылаются на формы, к которым имеют права на редактирование.

Итак, избыточность рассчитывается как: (1540886 * P)/(320 + 320 * 2 + (478 * 25 + (16 + 2500 * 10) * 20)*3) * P = = 514542/1537770 = 1.002

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

Рост модели зависит от параметров:

  1. Q - количество вопросов в форме (линейная)
  2. N - количество редакторов у формы (линейная)
  3. H - количество пройденный опросов (квадратичная: порождает логи)
  4. F - количество форм у одного владельца (кубическая зависимость: форма порождает ответы на форму, логи)

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

PostgreSQL

Графическое представление в виде ER-диаграммы

image

!Sql

Описание коллекций

User

Назначение: хранение информации о пользователе

  • Идентификатор (user_id) - integer, 4 байта

  • Почта(email) - varchar(50) - занимает 50 байт

Form

Назначение: хранение информации о форме, связь формы и ответов на неё, связь с пользователями

  • Идентификатор (form_id) - integer, 4 байта

  • Дата создания формы (creation_date) - timestamp занимает 8 байт

  • Дата обновления формы (update_date) - занимает 8 байт

  • Идентификатор создателя (owner_id) integer, занимает 4 байта

redactor_has_form

Назначение: таблица для связи многое ко многим - у формы может быть много редакторов, и у редакторов может быть много форм

  • Идентификатор формы (form_id) - integer, 4 байта

  • Идентификатор редактора (redactor_id) - integer, 4 байта

Log

Назначение: хранит все действия, которые совершались над таблицей (логи)

  • Тип события, которое произошло (event_type) - varchar, в среднем 6 байт

  • Почта пользователя, который совершил изменение (edit_email) - varchar(50), 50 байт

  • Время произошедшего события (edit_time) - timestamp, в памяти занимает 8 байт

  • Произошедшее событие (edit_action) - varchar, в среднем 20 байт

  • Идентификатор формы (form_id) - integer, 4 байта

Answer

Назначение: хранит информацию об ответе на один из вопросов опроса

  • Идентификатор (answer_id) - integer, 4 байта

  • Идентификатор результата прохождения всего опроса (user_answer_id) - integer, 4 байта

  • Заданный вопрос (question) - varchar, в среднем 30 байт

  • Ответ на заданный вопрос (answer) - varchar, в среднем 30 байт

User_answer

  • Назначение: хранит одно прохождение формы пользователем

  • Идентификатор (answer_form_id) - integer, 4 байта

  • Дата отправки ответа (creation_date) - timestamp, 8 байт

  • Идентификатор формы (form_id) - integer, 4 байта

Оценка объема информации, хранимой в модели

Вычисляем средний размер объектов каждой сущности

  • User: 4 + 50 = 54 байта
  • Form: 4 + 8 + 8 + 4 = 24 байта
  • redactor_has_form: 4 + 4 = 8 байт
  • Log: 6 + 50 + 8 + 20 + 4 = 88 байт
  • Answer: 4 + 4 + 30 + 30 = 68 байт
  • User_answer: 4 + 4 + 8 = 16 байт

Считаем, что у каждый формы в среднем 10 вопросов, количество пользователей нашего сервиса, к примеру - 3, редакторов у каждой формы - 2, в среднем 20 человек проходят опрос, возьмём за N количество форм, прошедших опрос:

$V(N) = N * ((20 * 16) + (68 * 200) + 88 + 24 + (8 * 2)) = 14048 * N$ байта

Избыточность данных

Избыточными данными у таблиц можно считать можно считать внешние ключи:

  • redactor_has_form: 8 байт
  • Form: 4 байта
  • Log: 4 байта
  • Answer: 4 байта
  • User_answer: 4 байта

Вычисляем чистый объём данных:

$V(N) = N * ((12 * 20) + (64 * 200) + 84 + 20 + 0)) = 13144 * N$ байта

Далее рассчитываем избыточность данных:

$\frac{V(N)}{V_{clean}(N)} = \frac{14048 * N}{13144 * N} \approx 1,06877662812$

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

Модель будет расти линейно при создании объекта Form. При этом очень важно количество вопросов и количество прошедших опрос людей, так как это сильно влияет на объём созданных данных. При создании объекта Form, также будет создаваться объект Log.