Модель данных - moevm/nosql2h20-patients-mongo GitHub Wiki
MONGO
4 сущности: “Заболевший”, “Контакты”, “Сопутствующие заболевания”, “Динамика болезни”.
Заболевший:
Телефон
ФИО
Дата рождения
Город
Страна
Контакты:
Телефон контакта
Сопутствующие заболевания:
Сопутствующее заболевание
Динамика болезни:
Симптом
Дата
В каждом документе есть поля Number – string, name – string, DateOfBirth – date, City – string, Country – string, Contacts, Diseases – массивы строк. Dynamics – вложенный документ В Contacts есть поле string (номера контактировавшего). В Dynamics есть поля Symptom – string (симптом), date (дата проявления симптома). В Diseases есть поле Disease – string (болезнь). Оценка объема Пусть строки в среднем используют 25 байт. Дата занимает 8 байт. Contacts имеет k контактов, Dynamics – m симптомов. Diseases – l болезней. Тогда i-ый документ занимает памяти:
Vi = 25*4+8+25k+33m+25l=108+25(k+l)+33m
Тогда чистый объем:
V = (108+25(k+l)+33m)N
Если принять n, k, l за 1, то получим: V=191N.
Фактический объем:
Добавляется поле _id.
Vi = 25*4+8+25k+33m+25l=108+25(k+l)+33m+12(_id).
V = (108+25(k+l)+33m+12)N
Если принять n, k, l за 1, то получим V=203N.
Отношение фактического объема к чистому:
(108+25(k+l)+33m+12)/(108+25(k+l)+33m)
Или
203/191
Запросы:
Добавить больного: db.test.insertOne({"number":"+123456789", "name":"Навальный Алексей Анатольевич", "dateOfBirth": new Date("1976-06-04"), “city” :”Moscow”, “country”:”Russia”, "contacts":["Luntik","Medvedev Dmitriy Anatolevich"],"symptoms":[{"symptom":"Кома",“date”:new Date("2019-03-10")},{"symptom":"nasmork","date":new Date("2020-03-10")}],"diseases":["сахар","астма"]})
Вывести всех больных: db.test.find({})
Вывести все контакты больного с именем “FIO”: db.test.find({“name”:”FIO”},{_id:0, contacts:1})
Вывести все сопутствующие болезни больного с именем “FIO”: db.test.find({“name”:”FIO”},{_id:0, diseases:1})
Вывести имя по номеру телефона +1234: db.test.find({“number”:”+1234”},{_id:0, name:1})
Вывести количество больных: db.test.count()
Вывести количество больных из России: db.test.count({country : “Russia”})
SQL
4 сущности: “Заболевший”, “Контакты”, “Сопутствующие заболевания”, “Динамика болезни”.
База данных будет иметь следующий вид:
Таблица “Заболевший” будет связана с таблицами “Контакты”, “Сопутствующие заболевания”, “Динамика болезни” по полю “телефон” (оно же является id) связью один ко многим.
Посчитаем размер сущности “Заболевший”, “Контакты”, “Сопутствующие заболевания”, “Динамика болезни”.
Vz = 25+25+8+25+25 = 108 байт - объем одной “строки” таблицы “заболевший”
Vk = 25+25 = 50 байт - объем одной “строки” таблицы “Контакты”
Vsz = 25+25 = 50 байт - объем одной “строки” таблицы “Сопутствующие заболевания”
Vdb = 25+25+8 = 58 байт - объем одной “строки” таблицы “Динамика болезни”
Если у нас Contacts имеет k контактов, Dynamics – m симптомов. Diseases – l болезней, тогда объем байт на хранение одного зараженного Vpat будет:
Vpat = Vz+Vk*k+Vsz*l+Vdb*m = 108+50k+50l+58m байт.
Тогда суммарный объем на хранение N зараженных:
Vsum = NVpat = N(108+50k+50l+58m) байт. Таким образом получаем зависимость объема базы данных от количества строк.
Подставим параметры k, l, m и положим их равными 1. Тогда получим
Vsum=266N
На добавление нового контакта, симптома или сопутствующего заболевания необходимо дополнительно соответственно 50, 58 и 50 байт для одного зараженного.
Тогда отношение фактического объема к чистому:
(108+50k+50l+58m)/(108+25(k+l)+33m)
Или
266/191
Запросы: Добавление в таблицу Contacts
INSERT INTO Contacts VALUES(...)
Добавление в таблицу Diseases
INSERT INTO Diseases VALUES(...)
Вывести имя пациента по номеру телефона
SELECT Patient.name from Patient where (patient.number=[number])
Вывести всех пациентов, их контакты, сопутствующие заболевания и динамику болезни
SELECT Patient.number, Patient.name, Patient.city, Patient.country Contacts.contact_number,
Dynamics.symptom,Dynamics.date, Diseases.disease FROM Patient
LEFT JOIN Contacts
ON Contacts.contact_number = Patient.number
LEFT JOIN Dynamics
ON Dynamics.number = Patient.number
LEFT JOIN Diseases
ON Diseases.number = Patient.number
По сравнению с NoSQL бд, для SQL требуется больше памяти на хранение поля “телефон”, которое используется для связи таблиц. Соответственно, темп рост затрат по памяти для SQL модели будет больше, чем для NoSQL.