Data Model - moevm/nosql2018-mongo_routing GitHub Wiki

Нереляционная модель данных (MongoDB)

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

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

Way - хранит данные о путях.

  • id (ObjectID - 12 бит) - идентификатор пути;
  • nodes [] (ArrayOfObjectID - 12*n) - id точек, которые задают путь;
  • tags {} (String - 32 бит) - теги пути
  • coordinates [] (Double 64*2 бит) - координаты точки

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

  • Среднее количество тегов = 100;

  • Среднее количество nodes = 100

  • Среднее количество relation = 100

  • Size (way) = 12+12100+32100 = 16412 бит

Size = 16412*n

Реляционная модель данных

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

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

6 коллекций: 1-ая Way - хранит данные о путях.

  • id () - идентификатор пути;
  • tags id - id тегa пути

2-ая Node - хранит точки

  • id - идентификатор точки;
  • x - координата х
  • y - координата у
  • tags id - id тегa пути

3-я Relation - хранит отношения

  • id - идентификатор точки;
  • tags id - id тегa пути

4-ая Member - хранит данные об участниках

  • id - идентификатор участника;
  • relation id - идентификатор отношения
  • type - хранит тип
  • ref - хранит ссылку на id участника отношения
  • role - роль участника отношения

5-ая NodesWay

  • id - идентификатор
  • way id - идентификатор пути;
  • node - точки;

6-ая Tags

  • id - идентификатор
  • tags id - идентификатор тега
  • key - ключ тега
  • val - значение тега

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

  • Среднее количество тегов = 100;

  • Среднее количество nodes = 100

  • Среднее количество relation = 1000000

  • Среднее количество member = 10000000

  • Size (nodes) = 152

  • Size (way) = 88

  • Size (NodesWay) = 36

  • Size (Way) = 24

  • Size (Relarion) = 24

  • Size (Member) = 100

Size = (10088 + 12 + 100(88 + 88100) + 100100) * n

Запросы к бд:

'{ "insert" : "nodes", "ordered" : true, "$db" : "test", "documents" : [{ "_id" : 242978990, "geometry" : { "type" : "Point", "coordinates" : [53.8071477, 30.9732332] }, "tags" : [{ "addr:country" : "BY" }, { "addr:district" : "Чаусский район" }, { "addr:region" : "Могилёвская область" }, { "int_name" : "Čavusy" }, { "name" : "Чаусы" }, { "name:be" : "Чавусы" }, { "name:be-tarask" : "Чавусы" }, { "name:de" : "Tschawussy" }, { "name:en" : "Chavusy" }, { "name:fr" : "Tchavoussy" }, { "name:lt" : "Čavusai" }, { "name:pl" : "Czausy" }, { "name:prefix" : "город" }, { "name:ru" : "Чаусы" }, { "name:uk" : "Чауси" }, { "place" : "town" }, { "population" : "10505" }, { "population:date" : "2018-01-01" }, { "source:population" : "Белстат" }, { "wikidata" : "Q955113" }, { "wikipedia" : "ru:Чаусы" }, { "wikipedia:de" : "Tschawussy" }, { "wikipedia:en" : "Chavusy" }, { "wikipedia:fr" : "Tchavoussy" }, { "wikipedia:pl" : "Czausy" }] }] }
'{ "insert" : "ways", "ordered" : true, "$db" : "test", "documents" : [{ "_id" : 205321810, "tags" : [{ "addr:housenumber" : "8" }, { "addr:street" : "2-й Строительный переулок" }, { "building" : "yes" }, { "building:levels" : "1" }], "points" : [{ "_id" : 2152973027, "geometry" : { "type" : "Point", "coordinates" : [53.8118113, 30.9579473] } }, { "_id" : 2152973030, "geometry" : { "type" : "Point", "coordinates" : [53.8118708, 30.9580087] } }, { "_id" : 2152973026, "geometry" : { "type" : "Point", "coordinates" : [53.8117938, 30.9582221] } }, { "_id" : 2152973024, "geometry" : { "type" : "Point", "coordinates" : [53.8117344, 30.9581606] } }, { "_id" : 2152973027, "geometry" : { "type" : "Point", "coordinates" : [53.8118113, 30.9579473] } }] }] }'
db.node.find(  
   {  
     location:  
       { $near:  
          {  
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },  
            $minDistance: 1000,  
            $maxDistance: 5000  
          }  
       }  
   }  
)

db.way.find(  
   {  
     nodes.location:  
       { $near:  
          {  
            $geometry: { type: "Point",  coordinates: [ -73.9667, 40.78 ] },  
            $minDistance: 1000,  
            $maxDistance: 5000  
          }  
       }  
   }  
)

db.relation.find({member:{ref: 1}})