Модель данных - moevm/nosql2h19-indoor GitHub Wiki
Модель данных содержит следующие сущности:
-
Комната:
- Идентификатор комнаты
- Владелец комнаты
- Коордионаты комнаты(X и Y)
- Этаж комнаты
-
Путь:
- Идентификатор пути
- Коордионаты комнаты(X и Y)
- Этаж комнаты
- Room -- хранит сведения о комнате
- Way -- хранит сведения о пути до нужной комнаты
Пусть UID занимает 12 Б, символ - 4 Б, целое число - 8 Б.
- Room: 12 + 4l + 3 * 8, где l - длина строки
- Way: 12 + 3 * 8, где l - длина строки
Расчетная формула чистого размера:
N(Room(12 + 4l + 3 * 8) + Way(12 + 3 * 8)), где N - число возможных путей. Возьмем l = 10, Way = 3, Room = 12 Получаем чистый размер без учета загрузки изображения: s1 = 1020N Посчитаем размер с учетом вложенных документов:
- Way: 76
- Room: 36
- Chain 24 Получаем фактический размер БД: s2 = N(24 + 12 * 76 + 3 * 36) = 1044N
Oтношение и разность чистого и фактического объемов:
s2/s1 = 1.02 s2 - s1 = 20N
На путь приходится около 20 байт дублирующих данных, а фактический объем БД больше размера данных в 1.02 раз
Линейная зависимость: 1044N
MATCH (n:Room)
WHERE n.Floor > 2
RETURN n.Owner, n.Floor;
MATCH (n:Way)-[a:Chunk]-(b:Way)
WITH abs(n.X-b.X) AS X, abs(n.Y-b.Y) AS Y
RETURN n.ID, b.ID, sqrt(X*X+Y*Y);
- Таблица Room -- хранит сведения о комнате
- Таблица Way -- хранит сведения о пути до нужной комнаты
- Таблица Chain -- хранит сведения о связях Поля X, Y, Floor реализует связь многие-ко-многим
- Room 32
- Way 28
- Chain 8
Линейная зависимость: 480N
select Room.Owner as Owner, Room.Floor as Floor
from Room
where Floor > 2
group by Owner
select (*) from Room
where Room.Floor == 2 and (Room.X < 20 and Room.X > 0) and (Room.Y < 20 and Room.Y > 0)
group by Owner
SQL требует больше памяти, нежели Neo4J в нашем случае. Так же преимуществом Neo4J является способ хранения данных в одной коллекции, благодаря чему легко получить доступ к данным по одному запросу, не используя несколько таблиц, в отличие от SQL