Как ссылаться на несколько уровней вверх / вниз в нормализованной базе данных nosql? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь смоделировать базу данных, которая может использовать гибкость graphql, но хочу сделать ее нормализованной.

Представьте себе эту реляционную структуру:

planet
  continent
    country
      city

Но я быЯ хотел бы создать четыре разные коллекции, чтобы сохранить его в норме.

Чтобы лучше описать, схема для него будет выглядеть следующим образом:

type Planet {
  planetName: String
}
type Continent {
  continentName: String
}
type Country {
  countryName: String
}
type City {
  cityName: String
}

type Query {
  planets: [Planet]
  continents: [Continent]
  countries: [Country]
  cities: [City]
}

Отлично, я могу запросить для каждого отдельного элемента, и получитьвсе они.

Но что, если я хотел бы получить, например, все города континента?

Мне нужно уточнить следующие фрагменты:

type Continent {
  continentName: String
  cities: [City]
}
type City {
  cityName: String
}
type Query {
  planets: [Planet]
  continents: [Continent]
  countries: [Country]
  cities: [City]
}

Теперь, если мы запросим, ​​мы получим continentName (идентификатор), и мы могли бы получить все города, принадлежащие ему. Но нам нужно установить какую-то связь между городом и континентом. Моя идея заключалась в том, чтобы сделать что-то похожее на структуру базы данных:

continent: {
  continentName, //the id
  countries, //array of ids of countries
  cities //array of ids of cities
}

Таким образом, я могу написать распознаватель для получения cities из родительского объекта запроса и запроса из коллекции городовуказанные идентификаторы.

Но что, если я хотел бы сделать что-то вроде этого:

type Query {
  cities(continentName: String): [City]
}

Итак, собери все города, принадлежащие континенту. Я мог бы пойти и запросить конкретный континент, получить все принадлежащие ему города и получить указанные города, но это заняло бы много времени.

Что если бы я структурировал данные следующим образом:

continent: {
  continentName, //the id
  planetName //id of the belonging planet
},
city: {
  cityName, //the id
  countryName, // id of the belonging country
  continentName, //id of the belonging continent
  planetName //id of the belonging planet
}

С помощью описанной выше структуры я могу подключаться и запрашивать данные во вложенном формате независимо от того, на каком уровне, на каком уровне и в каком направлении. Это кажется идеальным решением, но, читая моделирование баз данных noSQL, я нигде не нашел его.

Есть ли возможные узкие места или проблемы с решением?

...