Skip to content

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

Anton Toropygin edited this page Nov 11, 2023 · 8 revisions

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

Графическое представление

patient {

_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
    }
],

}


doctor {

_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
    }
]

}


appointments {

_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
}

}


administrator {

_id: ObjectID,
name: String,
surname: String,
email: String,
password: String

}


equipment {

_id: ObjectID,
name: String,
lastService: Date (dd/mm/yyyy),
status: String

}


serviceRequest {

_id: ObjectID,
name: String,
requestDate: Date (dd/mm/yyyy)

}


statistic {

_id: ObjectID,
date: Date,
val: Double

}


procedure {

_id: ObjectID,
name: String,
price: Double

}

Описание назначений коллекций, типов данных и сущностей

БД содержит следующие коллекции:

patient - коллекиция, для хранения данных пациентов.

  • _id - уникальный идентификатор пациента;
  • info - объект для хранения персональной информации пациента
    • name - имя пациента
    • surname - фамилия пациента
    • email - почта
    • password - пароль
    • birthdate - дата рождения
    • contact - контактный телефон
    • patientCard - карта пациента
    • bloodGroup - группа крови пациента
  • images - список снимков пациента
    • date - датя снятия снимка
    • name- название снимка
    • img - сам снимок в в бинарном виде
  • history - список записей посещений пациента в клинике
    • date - дата посещения
    • procedure - процедура
      • name - название процедуры
      • price - стоимость процедуры
    • doctor - информация о докторе
      • name - имя
      • surname - фамилия
    • helped - булевое значение, которое говорит об удовлетворенности пациента лечением

doctor - коллекция, для хранения данных докторов.

  • _id - уникиальный идентификатор доктора
  • info - объект для хранения персноальной информации доктора
    • name - имя
    • surname - фамилия
    • email - почта
    • password - пароль
    • contact - контактный телефон
    • experience - стаж
  • history - список для хранения истории лечений доктора
    • date - дата лечения
    • procedure - название процедуры
    • patient - паициент, которого лечили
      • name - имя пациента
      • surname - фамилия пациента


appointments - коллекция для хранения предстоящих встреч.

  • _id - уникальный идентификатор
  • date - дата и время встречи
  • procedure - процедура
  • patient - данные пациента, который записался на эту встречу
    • name - имя пациента
    • surname - фамилия
    • birthdate - возраст
    • contact - контактный телефон
    • patientCard - карта
    • bloodGroup - группа крови
  • doctor - данные о докторе, который назначен на эту встречу
    • name - имя доктора
    • surname - фамилия


administrator - коллекция, для хранения администраторов. В этой коллекции хранятся данные об аккаунте администратора.

  • _id - уникальный идентификатор аккаунта админа
  • name - имя;
  • surname - фамилия;
  • email - эл. почта;
  • password - пароль;


equipment - коллекция, для хранения оборудований клиники.

  • _id - уникальный идентификатор оборудования
  • name - название оборудования;
  • lastService - дата последнего обслуживания;
  • status - статус (используется, в починке);


serviceRequest - коллекция, для хранения запросов на ремонт оборудования.

  • _id - уникальный идентификатор запроса на ремонт
  • name - название оборудования;
  • requestDate - дата создания запроса на ремонт;


statistic - коллекция для хранения статистики

  • _id - уникальный идентификатор операции
  • date - дата совершения операции
  • val - сумма (положительная или отрицательная)


procedure - коллекция для хранения доступных процедур/услуг клиники

  • _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 байт


Коллекция appointments. Пусть в среднем приходится 10 записей на каждого пациента x. Тогда

$$ 10x*(12 + 8 + 20 + 58 + 30) = 1280x \ байт$$

  • _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 байт


Коллекция administrator. Пусть в среднем 1 аккаунт администратора. Тогда:

$$ 12 + 15 + 15 + 30 + 12 = 84 байта $$

  • _id - ObjectID V = 12 байт
  • name - String V = 15 байт
  • surname - String V = 15 байт
  • email - String V = 30 байт
  • password - String V = 12 байт


Коллекция equipment. Пусть в среднем 20 оборудований в клинике. Тогда:

$$ 20*(12 + 50 + 8 + 2) = 1440 байт $$

  • _id - ObjectID V = 12 байт
  • name - String V = 50 байт
  • lastService - Date V = 8 байт
  • status - Boolean V = 2 байта


Коллекция serviceRequest. Пусть в среднем 10 запросов на ремонт оборудования. Тогда:

$$ 10*(12 + 50 + 8) = 700 байт $$

  • _id - ObjectID V = 12 байт
  • name - String V = 50 байт
  • requestDate - Date V = 8 байт


Коллекция statistic. Пусть в среднем на 1 пациента приходится 10 записей операций платежа. Тогда:

$$ 10x(8 + 12 + 8) = 280x байт $$

  • _id - ObjectID V = 12 байт
  • date - Date V = 8 байт
  • val - Double V = 8 байт


Коллекция procedure. Пусть в среднем в клинике доступно 20 процедур/услуг, на которые можно записаться. Тогда

$$ 20*(12 + 20 + 8) = 800 байт $$

  • _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) = 15002081x$$



Избыточность модели (отношение между фактическим объемом модели и “чистым” объемом данных).

В БД дублируются данные о докторе о пациенте в историях лечений/посещений клиники, также у новых пациентов список снимков может быть вообще пустым. Тогда получаем: $$ 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

Описание назначений коллекций, типов данных и сущностей

Разница от нереляционной версии:

  • наличие отдельной таблицы Image для хранения снимков
  • отдельная таблица History для хранения истории

Поля и типы данных полей идентичны.

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

Таблица Patient

Допустим, что у каждого пациента в среднем 3 снимка и 5 записей в истории посещения. Тогда для хранения x пациентов понадобится

$$x*(12 + 100 + 35000000 + 568) = 15000452x$$ байта.

Таблица Image

Таблица Statistic

Таблица Appointments

Таблица ServiceRequest

Таблица Equipment

Таблица Procedure

Таблица History

Таблица Doctor

Таблица Administrator

Clone this wiki locally