-
Notifications
You must be signed in to change notification settings - Fork 0
Модель данных
{
"_id": ObjectId(), // Уникальный идентификатор пользователя
"owner_mail": "string", // Почта пользователя
}
{
"_id": ObjectId(), // Уникальный идентификатор пользователя
"email": "string", // Почта пользователя
"form_id_for_edit": [ObjectId()] // Уникальный идентификатор формы, которую пользователь может изменять
}
{
"_id": ObjectId(), // Уникальный идентификатор кортежа ответов
"form_id": ObjectId(), // Уникальный идентификатор формы
"answers_id": integer, // Идентификатор кортежа ответов (от яндекса)
"creation_date": ISODate(), // Дата ответа на форму
"answers": [{
"question": "string", // Вопрос
"answer": "string" // Ответ
}]
}
{
"_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)
- _id (ObjectId): 12 байт
- owner_mail: 320 байт
Итого для формы: (12 + 320) * F = 332 * F байта
- _id (ObjectId): 12 байт
- mail: 320 байт
- form_id_for_edit: по 12 байт на каждую форму
Итого для пользователя: 12 + 320 + 12 * N = (332 + 12 * N) байта
- _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) байта
{
-
_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:
- Ответы пользователя и логи ссылаются на таблицу.
- Форма ссылается на пользователя (владельца формы).
- Пользователи ссылаются на формы, к которым имеют права на редактирование.
Итак, избыточность рассчитывается как: (1540886 * P)/(320 + 320 * 2 + (478 * 25 + (16 + 2500 * 10) * 20)*3) * P = = 514542/1537770 = 1.002
Рост модели зависит от параметров:
- Q - количество вопросов в форме (линейная)
- N - количество редакторов у формы (линейная)
- H - количество пройденный опросов (квадратичная: порождает логи)
- F - количество форм у одного владельца (кубическая зависимость: форма порождает ответы на форму, логи)
!Sql
Назначение: хранение информации о пользователе
-
Идентификатор (user_id) - integer, 4 байта
-
Почта(email) - varchar(50) - занимает 50 байт
Назначение: хранение информации о форме, связь формы и ответов на неё, связь с пользователями
-
Идентификатор (form_id) - integer, 4 байта
-
Дата создания формы (creation_date) - timestamp занимает 8 байт
-
Дата обновления формы (update_date) - занимает 8 байт
-
Идентификатор создателя (owner_id) integer, занимает 4 байта
Назначение: таблица для связи многое ко многим - у формы может быть много редакторов, и у редакторов может быть много форм
-
Идентификатор формы (form_id) - integer, 4 байта
-
Идентификатор редактора (redactor_id) - integer, 4 байта
Назначение: хранит все действия, которые совершались над таблицей (логи)
-
Тип события, которое произошло (event_type) - varchar, в среднем 6 байт
-
Почта пользователя, который совершил изменение (edit_email) - varchar(50), 50 байт
-
Время произошедшего события (edit_time) - timestamp, в памяти занимает 8 байт
-
Произошедшее событие (edit_action) - varchar, в среднем 20 байт
-
Идентификатор формы (form_id) - integer, 4 байта
Назначение: хранит информацию об ответе на один из вопросов опроса
-
Идентификатор (answer_id) - integer, 4 байта
-
Идентификатор результата прохождения всего опроса (user_answer_id) - integer, 4 байта
-
Заданный вопрос (question) - varchar, в среднем 30 байт
-
Ответ на заданный вопрос (answer) - varchar, в среднем 30 байт
-
Назначение: хранит одно прохождение формы пользователем
-
Идентификатор (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 количество форм, прошедших опрос:
Избыточными данными у таблиц можно считать можно считать внешние ключи:
- redactor_has_form: 8 байт
- Form: 4 байта
- Log: 4 байта
- Answer: 4 байта
- User_answer: 4 байта
Вычисляем чистый объём данных:
Далее рассчитываем избыточность данных:
Модель будет расти линейно при создании объекта Form. При этом очень важно количество вопросов и количество прошедших опрос людей, так как это сильно влияет на объём созданных данных. При создании объекта Form, также будет создаваться объект Log.