Я пытаюсь смоделировать базу данных, которая может использовать гибкость 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, я нигде не нашел его.
Есть ли возможные узкие места или проблемы с решением?