-
Notifications
You must be signed in to change notification settings - Fork 2
Модель данных
_id: ObjectID,
prof_info: {
email: String,
password: String,
},
card: {
name: String,
surname: String,
birthdate: Date (dd/mm/yyyy),
contact: String,
bloodGroup: String
},
images: [
{
date: Date (dd/mm/yyyy),
name: String,
img: BinaryData
}
]
}
_id: ObjectID,
name: String,
surname: String,
email: String,
password: String,
contact: String,
experience: String
}
date: Date (hh:min, dd/mm/yyyy),
procedure: {
name: String,
price: Double
},
patientCard: {
name: String,
surname: String,
birthdate: Date (dd/mm/yyyy),
contact: String,
bloodGroup: String
}
doctor: {
name: String,
surname: String
},
helped: {
rate: String,
feedback: String
}
}
_id: ObjectID,
date: Date (hh:min, dd/mm/yyyy),
procedure: {
name: String,
price: Double
},
patientCard: {
name: String,
surname: String,
birthdate: Date (dd/mm/yyyy),
contact: 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,
equipmentID: ObjectID,
requesterID: ObjectID,
description: String,
requestDate: Date (dd/mm/yyyy)
}
_id: ObjectID,
date: Date,
val: Double
}
_id: ObjectID,
name: String,
price: Double
}
- _id - уникальный идентификатор пациента;
- prof_info - информация о профиле
- email - почта
- password - пароль
- card - мед. карта пациента
- name - имя пациента
- surname - фамилия пациента
- birthdate - дата рождения
- contact - контактный телефон
- bloodGroup - группа крови пациента
- images - список снимков пациента
- date - датя снятия снимка
- name- название снимка
- img - сам снимок в в бинарном виде
- _id - уникиальный идентификатор доктора
- name - имя
- surname - фамилия
- email - почта
- password - пароль
- contact - контактный телефон
- experience - стаж
- _id - ID записи в истории
- date - дата лечения
- procedure - объект хранящий информацию о процедуре
- name - название
- price - цена
- patientCard - медкарта пациента
- name - имя
- surname - фамилия
- birthdate - дата рождения
- contact - контактный телефон
- bloodGroup - группа крови пациента
- doctor - информация о докторе, лечившем пациента
- name - имя
- surname - фамилия
- helped - отзыв пациента
- rate - оценка
- feedback - текст отзыва
- _id - уникальный идентификатор
- date - дата и время встречи
- procedure - процедура
- patientCard - данные пациента, который записался на эту встречу
- name - имя пациента
- surname - фамилия
- birthdate - возраст
- contact - контактный телефон
- bloodGroup - группа крови
- doctor - данные о докторе, который назначен на эту встречу
- name - имя доктора
- surname - фамилия
administrator - коллекция, для хранения администраторов. В этой коллекции хранятся данные об аккаунте администратора.
- _id - уникальный идентификатор аккаунта админа
- name - имя;
- surname - фамилия;
- email - эл. почта;
- password - пароль;
- _id - уникальный идентификатор оборудования
- name - название оборудования;
- lastService - дата последнего обслуживания;
- status - статус (используется, в починке);
- _id - уникальный идентификатор запроса на ремонт
- equipemntID - ID оборудования
- requesterID - тот, кто оставил заявку
- description - краткое описание заявки и/или причина
- requestDate - дата создания запроса на ремонт;
- _id - уникальный идентификатор операции
- date - дата совершения операции
- val - сумма (положительная или отрицательная)
- _id - уникальный идентификатор процедуры
- name - название,
- price - цена
Коллекция patient. Допустим, что у каждого пациента в среднем 3 снимка и 5 записей в истории посещений. Тогда, для хранния x пациентов понадобится:
- _id - тип ObjectID V = 12 байт
- prof_info - тип Object V = 30 + 12 = 42
- email - String V = 30 байт
- password - String V = 12 байт
- card - тип Object V = 15 + 15 + 8 + 12 + 2 = 52 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- birthdate - Date V = 8 байт
- contact - String V = 12 байт
- 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 МБайт
- _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 байт
$$ V(x) = 5x(12 + 8 + 28 + 52 + 30 + 51) = 675x $$
- _id - ObjectID V = 12 байт
- date - Date V = 8 байт
- procedure - Object V = 20 + 8 = 28 байт
- String V = 20 байт,
- Double V = 8 байт
- patientCard - Object V = 15 + 15 + 8 + 12 + 2 = 52 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- birthdate - Date V = 8 байт
- contact - String V = 12 байт
- bloodGroup - String V = 2 байта
- doctor - Object V = 15 + 15 = 30 байт
- name - String V = 15 байт
- surname - String V = 15 байт
- helped - Object V = 1 + 50 = 51 байт
- rate - String V = 1 байт
- feedback - String V = 50 байт
- _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 байт
- equipemntID - ObjectID V = 12 байт
- requester - ObjectID V = 12 байт
- description - 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) = 15000106x + 106 + 69x + 675x + 1280x + 84 + 1440 + 700 + 280x + 800 = 15002756x + 2887 $$
Если сделать грубую оценку, то получится:
$$ V(x) = 15002756x $$
В БД дублируются данные о докторе о пациенте в историях лечений/посещений клиники, у новых пациентов список снимков может быть вообще пустым, а также некоторые пациенты могут не оставлять отзывов. Тогда получаем: $$ V(x)=7500452x + 106 + 69x + 420x + 1280x + 84 + 1440 + 940 + 280x + 800 = 7501716x + 2887 $$
Отбросим свободный член, чтобы сравнить с фактическим объемом: $$ V(x) = 7501716x $$ Отношение между фактическим и "чистым" объемом данных: $$ \frac{15002756x}{7502081} = 1.9 $$
Как и раньше, выразим через количество пациентов и получим: $$ V(x) = 15002756x + 2647 $$ Отсюда видно, что рост модели при увеличении количества объектов каждой сущности линеен и зависит от количества пациентов.
- регистрация нового пациента
db.patient.insert({
_id: ObjectID(),
prof_info: {
email,
password
}
card: {
name,
surname,
birthdate,
contact,
bloodGroup
},
images: []
})
- поиск аккаунта пациента для входа в систему
db.patient.find({
prof_info: {
email,
password
}
})
- поиск всех предстоящих встреч
db.appointments.find({})
- поиск предстоящих встреч определенного пациента
db.appointments.find({
patientCard: {
name,
surname
}
})
- поиск предстоящих встреч определенного доктора
db.appointments.find({
doctor: {
name,
surname
}
})
- подсчет прибыли
db.statistic.aggregate(
{$group: {
_id: "_id",
profit: {$sum: "$val"}
}}
)
- просмотр оборудований клиники
db.equipment.find({})
- просмотр оборудований, которые ремонтируются:
db.serviceRequest.aggregate({[
{
$lookup: {
from: "equipment",
localField: "equipmentID",
foreignField: "_id",
as: "eq_id"
},
{$unwind: "$eq_id"},
{
$lookup: {
from: "administrator",
localField: "requesterID",
foreignField: "_id",
as: "req_id"
},
}
}
]})
Разница от нереляционной версии:
- наличие отдельной таблицы Image для хранения снимков
- отдельная таблица History для хранения истории
Поля и типы данных полей идентичны.
- _id - тип INT V = 8 байт
- name - VARCHAR V = 15 байт
- surname - VARCHAR V = 15 байт
- email - VARCHAR V = 30 байт
- password - VARCHAR V = 12 байт
- birthdate - Date V = 8 байт
- contact - VARCHAR V = 12 байт
- bloodGroup - VARCHAR V = 2 байта
Таблица Image. Пусть в среднем у каждого пациента 3 снимка. Тогда выразим через количество пациентов x
$$ x3(8 + 8 + 12 + 5000000 + 8) = 15000108x$$
- _id - тип INT V = 8 байт
- date - Date V = 8 байт
- name - VARCHAR V = 12 байт
- img - Binary Data (допустим, что средний размер снимка 5 Мб) V = 5 МБайт
- patient_id Int V = 8 байт
$$ 10x(8+8+20) = 360x $$
- _id - тип INT V = 8 байт
- date - Date V = 8 байт
- val - VARCHAR V = 20 байт
$$ 10x(8+8+8+8+8)=450x $$
- _id - тип INT V = 8 байт
- date - Date V = 8 байт
- procedure_id - Int V = 8 байт
- patient_id - Int V = 8 байт
- doctor_id - Int V = 8 байт
- _id - тип INT V = 8 байт
- equipment_id - Int V = 8 байт
- requester_id - Int V = 8 байт
- requestDate - Date V = 8 байт
- _id - тип INT V = 8 байт
- name - VARCHAR V = 50 байт
- lastService - Date V = 8 байт
- status - VARCHAR V = 10 байт
- _id - тип INT V = 8 байт
- name - VARCHAR V = 20 байт
- price - Double V = 8 байт
$$ 5x(8+8+8+8+8+1+50)=480x $$
- _id - тип INT V = 8 байт
- date - Date V = 8 байт
- procedure_id - Int V = 8 байт
- patient_id - Int V = 8 байт
- doctor_id - Int V = 8 байт
- treat_rate - VARCHAR V = 1 байт
- treat_feedback - VARCHAR V = 50 байт
- _id - тип INT V = 8 байт
- name - VARCHAR V = 15 байт
- surname - VARCHAR V = 15 байт
- email - VARCHAR V = 30 байт
- password - VARCHAR V = 12 байт
- birthdate - Date V = 8 байт
- contact - VARCHAR V = 12 байт
- experience - Int V = 8 байт
- _id - тип INT V = 8 байт
- name - VARCHAR V = 15 байт
- surname - VARCHAR V = 15 байт
- email - VARCHAR V = 30 байт
- password - VARCHAR V = 12 байт
Тогда получим следующий объем данных, для хранения x пациентов. $$ V(x) = 102x + 15000108x + 360x + 450x + 320 + 1520 + 720 + 480x + 108 +11x + 80 = 15001511x + 2748 $$
$$ V(x) = 102x + 15000108x + 360x + 450x + 320 + 1520 + 720 + 480x + 108 +11x + 80 = 15001511x + 2748 $$ Рост модели линеен.
- регистрация нового пациента
INSERT INTO Patient VALUES (1, "Ivan", "Ivanov", "[email protected]", "qwe123asdfzx", "12.12.2000", "+74523418754", "1+")
- поиск аккаунта пациента для входа в систему
SELECT * FROM Patient WHERE email=email, password=password;
- поиск всех предстоящих встреч
SELECT * FROM Appointment;
- поиск предстоящих встреч определенного пациента
SELECT *
FROM Patient
INNER JOIN Appointment ON Patient.id=Appointment.patient_id
WHERE Patient.name=name AND Patient.surname=surname;
- поиск предстоящих встреч определенного доктора
SELECT *
FROM Doctor
INNER JOIN Appointment ON Doctor.id=Appointment.doctor_id
WHERE Doctor.name=name AND Doctor.surname=surname;
- подсчет прибыли
SELECT SUM(val) FROM Statistic;
- просмотр оборудований клиники
SELECT * FROM Equipment;
- просмотр оборудований, которые ремонтируются:
SELECT * FROM ServiceRequest
JOIN Equipment ON Equipment.id=equipment_id
JOIN Administrator ON Administrator.id=requester_id
;
- NoSQL требует больше памяти, по сравнению с SQL, так в нем дублируются некоторые данные. SQL выигрывает по памяти, так как вместо того, чтобы хранить сами объекты целиком (как NoSQL), он хранит только id определенного элемента из другой таблицы.
- По удобству запросов выигрывает NoSQL, так как ввиду дублирования данных в некоторых сущностях, нам не приходится JOIN-ить с другими коллекциями. Для некоторых запросов SQL приходится JOIN-ить несколько таблиц, что может сказать в скорости доступа.
NoSQL требует больше памяти, но удобен и быстр в запросах, в то время как SQL требует меньше памяти и не совсем удобен в запросах, из-за того что приходится JOIN-ить таблицы. Для данной задачи NoSQL подходит лучше, чем SQL.