Модель данных - 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.