-
Notifications
You must be signed in to change notification settings - Fork 2
Модель данных
_id: ObjectID,
info: {
name: String,
surname: String,
email: String,
password: String,
birthdate: Date (dd/mm/yyyy),
contact: String,
patientCard: String,
bloodGroup: String
},
images: [
{
date: Date (dd/mm/yyyy),
name: String,
img: BinaryData
}
],
history: [
{
date: Date (hh:min, dd/mm/yyyy),
procedure: {
name: String,
price: Double
},
doctor: {
name: String,
surname: String
},
helped: Boolean
}
],
}
_id: ObjectID,
info: {
name: String,
surname: String,
email: String,
password: String,
contact: String,
experience: String
},
history: [
date: Date (hh:min, dd/mm/yyyy),
procedure: String,
patient: {
name: String,
surname: String
}
]
}
_id: ObjectID,
date: Date (hh:min, dd/mm/yyyy),
procedure: String,
patient: {
name: String,
surname: String,
birthdate: Date (dd/mm/yyyy),
contact: String,
patientCard: String,
bloodGroup: String
},
doctor: {
name: String,
surname: String
}
}
_id: ObjectID,
name: String,
surname: String,
email: String,
password: String
}
_id: ObjectID,
name: String,
lastService: Date (dd/mm/yyyy),
status: String
}
_id: ObjectID,
name: String,
requestDate: Date (dd/mm/yyyy)
}
_id: ObjectID,
date: Date,
val: Double
}
_id: ObjectID,
name: String,
price: Double
}
- _id - уникальный идентификатор пациента;
- info - объект для хранения персональной информации пациента
- name - имя пациента
- surname - фамилия пациента
- email - почта
- password - пароль
- birthdate - дата рождения
- contact - контактный телефон
- patientCard - карта пациента
- bloodGroup - группа крови пациента
- images - список снимков пациента
- date - датя снятия снимка
- name- название снимка
- img - сам снимок в в бинарном виде
- history - список записей посещений пациента в клинике
- date - дата посещения
- procedure - процедура
- name - название процедуры
- price - стоимость процедуры
- doctor - информация о докторе
- name - имя
- surname - фамилия
- helped - булевое значение, которое говорит об удовлетворенности пациента лечением
- _id - уникиальный идентификатор доктора
- info - объект для хранения персноальной информации доктора
- name - имя
- surname - фамилия
- email - почта
- password - пароль
- contact - контактный телефон
- experience - стаж
- history - список для хранения истории лечений доктора
- date - дата лечения
- procedure - название процедуры
- patient - паициент, которого лечили
- name - имя пациента
- surname - фамилия пациента
- _id - уникальный идентификатор
- date - дата и время встречи
- procedure - процедура
- patient - данные пациента, который записался на эту встречу
- name - имя пациента
- surname - фамилия
- birthdate - возраст
- contact - контактный телефон
- patientCard - карта
- bloodGroup - группа крови
- doctor - данные о докторе, который назначен на эту встречу
- name - имя доктора
- surname - фамилия
administrator - коллекция, для хранения администраторов. В этой коллекции хранятся данные об аккаунте администратора.
- _id - уникальный идентификатор аккаунта админа
- name - имя;
- surname - фамилия;
- email - эл. почта;
- password - пароль;
- _id - уникальный идентификатор оборудования
- name - название оборудования;
- lastService - дата последнего обслуживания;
- status - статус (используется, в починке);
- _id - уникальный идентификатор запроса на ремонт
- name - название оборудования;
- requestDate - дата создания запроса на ремонт;
- _id - уникальный идентификатор операции
- date - дата совершения операции
- val - сумма (положительная или отрицательная)
- _id - уникальный идентификатор процедуры
- name - название,
- price - цена
Коллекция patient. Допустим, что у каждого пациента в среднем 3 снимка и 5 записей в истории посещений. Тогда, для хранния x пациентов понадобится:
$$ x*(12 + 100 + 35000000 + 568) = 15000452x \ байта $$
- _id - тип ObjectID V = 12 байт
- info - тип Object V = 15 + 15 + 30 + 12 + 8 + 12 + 6 + 2 = 100 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- email - String V = 30 байт
- password - String V = 12 байт
- birthdate - Date V = 8 байт
- contact - String V = 12 байт
- patientCard - String V = 6 байт
- bloodGroup - String V = 2 байта
- images - Array V_i = 8 + 20 + 5000000 = 5 МБайт
- date - Date V = 8 байт
- name - String V = 20 байт
- img - Binary Data (допустим, что средний размер снимка 5 Мб) V = 5 МБайт
- history - Array V_i = 8 + 28 + 30 + 2 = 68 байт
- date - Date V = 8 байт
- procedure - Object V = 20 + 8 = 28 байт
- name - String V = 20 байт
- price - Double V = 8 байт
- doctor - Object V = 15 + 15 = 30 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- helped - Boolean V = 2 байта
Коллекция doctor. Пусть на каждые 10 пациентов приходится 1 доктор и у каждого доктора в истории лечений в среднем 10 записей. Тогда:
$$ (x/10 + 1)(12 + 94 + 1058) = 686 * (x/10 + 1) = 686 + 68.6x = 686 + 69x \ байт$$ где [x/10] - целая часть от деления x на 10 (округление вниз)
- _id - ObjectID V = 12 байт
- info - Object V = 15 + 15 + 30 + 12 + 12 + 10 = 94 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- email - String V = 30 байт
- password - String V = 12 байт
- contact - String V = 12 байт
- experience - String V = 10 байт
- history - Array V_i = 8 + 20 + 30 = 58 байт
- date - Date V = 8 байт
- procedure - String V = 20 байт
- patient - Object V = 15 + 15 = 30 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- _id - ObjectID V = 12 байт
- date - Date V = 8 байт
- procedure - String V = 20 байт
- patient - Object V = 15 + 15 + 8 + 12 + 6 + 2 = 58 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- birthdate - Date V = 8 байт
- contact - String V = 12 байт
- patientCard - String V = 6 байт
- bloodGroup - V = 2 байта
- doctor - Object V = 15 + 15 = 30 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- _id - ObjectID V = 12 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- email - String V = 30 байт
- password - String V = 12 байт
- _id - ObjectID V = 12 байт
- name - String V = 50 байт
- lastService - Date V = 8 байт
- status - Boolean V = 2 байта
- _id - ObjectID V = 12 байт
- name - String V = 50 байт
- requestDate - Date V = 8 байт
$$ 10x(8 + 12 + 8) = 280x байт $$
- _id - ObjectID V = 12 байт
- date - Date V = 8 байт
- val - Double V = 8 байт
Коллекция procedure. Пусть в среднем в клинике доступно 20 процедур/услуг, на которые можно записаться. Тогда
- _id - ObjectID V = 12 байт
- name - String V = 20 байт,
- price - Double V = 8 байт
Тогда получим следующий объем данных, для хранения x пациентов. $$ V(x) = 15000452x + 686 + 69x + 1280x + 84 + 1440 + 700 + 280x + 800 = 15002081x + 3710$$
Если сделать грубую оценку, то получится:
В БД дублируются данные о докторе о пациенте в историях лечений/посещений клиники, также у новых пациентов список снимков может быть вообще пустым. Тогда получаем: $$ V(x)=7500452x + 686 + 69x + 1280x + 84 + 1440 + 700 + 280x + 800 = 7501971x + 3710 $$
Отбросим свободный член, чтобы сравнить с фактическим объемом: $$ V(x) = 7502081 $$ Отношение между фактическим и "чистым" объемом данных: $$ \frac{15002081x}{7502081} = 1.9 $$
Как и раньше, выразим через количество пациентов и получим: $$ V(x) = 15000452x + 686 + 69x + 1280x + 84 + 1440 + 700 + 280x = 15002081x + 2910$$ Отсюда видно, что рост модели при увеличении количества объектов каждой сущности линеен и зависит от количества пациентов.
- регистрация нового пациента
db.patient.insert({
_id: ObjectID(),
info: {
name,
surname,
email,
password,
birthdate,
contact,
patientCard,
bloodGroup
},
images: [],
history: [],
})
- поиск аккаунта пациента для входа в систему
db.patient.find({
info: {
email,
password
}
})
- поиск всех предстоящих встреч
db.appointments.find({})
- поиск предстоящих встреч определенного пациента
db.appointments.find({
patient: {
name,
surname
}
})
- поиск предстоящих встреч определенного доктора
db.appointments.find({
doctor: {
name,
surname
}
})
- подсчет прибыли
db.statistic.aggregate(
{$group: {
_id: "_id",
profit: {$sum: "$val"}
}}
)
- просмотр оборудований клиники
db.equipment.find({})
- просмотр оборудований, которые ремонтируются:
db.serviceRequest.find({})
Разница от нереляционной версии:
- наличие отдельной таблицы Image для хранения снимков
- отдельная таблица History для хранения истории
Поля и типы данных полей идентичны.
Допустим, что у каждого пациента в среднем 3 снимка и 5 записей в истории посещения. Тогда для хранения x пациентов понадобится