我正在尝试对一个数据库进行建模,该数据库可以使用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
(ID),并可以获得属于它的所有城市。但是我们需要在城市和大陆之间建立某种联系。我的想法就像在数据库结构中一样:
continent: {
continentName, //the id
countries, //array of ids of countries
cities //array of ids of cities
}
这样,我可以编写一个解析器来从查询的父对象中获取cities
,并从指定ID的城市集合中进行查询。
但是如果我想做这样的事情怎么办:
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数据库进行建模后,就再也找不到它了。
任何可能的瓶颈或解决方案问题?
您要解决的问题很困难。
我认为最好的方法是将问题分解为多个较小的问题:
创建一个描述世界各个地区的集合,这些地区将与WGS84坐标(或特定于行星的坐标系)的几何形状相关联
创建像PointOfInterest
这样的城市的集合,它们将只是WGS84坐标(有点像经度和纬度)。
然后,您需要一种查询几何形状的相交,包含和并集的方法。
您还需要能够分辨出一个点是否在形状中以及什么点在给定的形状中。
将涉及一些动态编程,因为据我所知,没有坐标系统可在整个宇宙中工作。
研究PostGIS,GDAL和https://github.com/sshuair/awesome-gis
祝你好运:)