按地理位置过滤地点的数据库设计
Database design for filtering places by geolocation
我的 PostgreSQL
中有 2 个实体:
@Entity()
export class Listing extends BaseEntity {
@PrimaryGeneratedColumn() id: number
@Column({ type: 'varchar', length: 255 })
title: string // For example, 'Best restaurant for work and english learning'
@Column({ type: 'double precision', nullable: true })
latitude: number // For example: 41.87194
@Column({ type: 'double precision', nullable: true })
longitude: number // For example: 12.56738
// Solution 1
// @ManyToMany(() => City, city => city.listing)
// city: City
@OneToMany(() => Offer, offer => offer.listing)
offerList: Offer[]
}
@Entity()
export class Offer extends BaseEntity {
@PrimaryGeneratedColumn() id: number
@Column({ type:'text' })
position: string // For example: 'cashier'
@Column({ type:'int' })
wage: number // For example: 6
@ManyToOne(() => Listing, listing => listing.offerList)
listing: Listing
}
如果我 100% 存储 latitude
和 longitude
,用 city/county
过滤 listings(places)
的最佳方法是什么?
搜索请求示例:waiter offers in Italy
解决方案 1:存储在 Listing entity
个附加字段中,例如 city
(和 country
?)。
(实际上,它将是单独的多对多(城市 <= => 列表)实体以避免用户混乱,优化 SQL
搜索请求并轻松将新城市添加到 production database
,我说得对吗? )
解决方案2:当用户键入Italy
时,客户端将此查询发送到后端。在后端解析并为 Italy
查询获取 longitude
和 latitude
之后(我假设会有一些错误,比如 strange query
)。然后后端开始搜索位于接收到的地理位置附近的列表(地点)。越接近搜索排名越好
解决方案 3:您的解决方案... =)
这是 airbnb 搜索引擎的工作原理,他们没有硬编码城市列表
你可以试试https://postgis.net
它增加了对地理对象的支持,允许在 SQL 中 运行 进行位置查询。
SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';
我的 PostgreSQL
中有 2 个实体:
@Entity()
export class Listing extends BaseEntity {
@PrimaryGeneratedColumn() id: number
@Column({ type: 'varchar', length: 255 })
title: string // For example, 'Best restaurant for work and english learning'
@Column({ type: 'double precision', nullable: true })
latitude: number // For example: 41.87194
@Column({ type: 'double precision', nullable: true })
longitude: number // For example: 12.56738
// Solution 1
// @ManyToMany(() => City, city => city.listing)
// city: City
@OneToMany(() => Offer, offer => offer.listing)
offerList: Offer[]
}
@Entity()
export class Offer extends BaseEntity {
@PrimaryGeneratedColumn() id: number
@Column({ type:'text' })
position: string // For example: 'cashier'
@Column({ type:'int' })
wage: number // For example: 6
@ManyToOne(() => Listing, listing => listing.offerList)
listing: Listing
}
如果我 100% 存储 latitude
和 longitude
,用 city/county
过滤 listings(places)
的最佳方法是什么?
搜索请求示例:waiter offers in Italy
解决方案 1:存储在 Listing entity
个附加字段中,例如 city
(和 country
?)。
(实际上,它将是单独的多对多(城市 <= => 列表)实体以避免用户混乱,优化 SQL
搜索请求并轻松将新城市添加到 production database
,我说得对吗? )
解决方案2:当用户键入Italy
时,客户端将此查询发送到后端。在后端解析并为 Italy
查询获取 longitude
和 latitude
之后(我假设会有一些错误,比如 strange query
)。然后后端开始搜索位于接收到的地理位置附近的列表(地点)。越接近搜索排名越好
解决方案 3:您的解决方案... =)
这是 airbnb 搜索引擎的工作原理,他们没有硬编码城市列表
你可以试试https://postgis.net
它增加了对地理对象的支持,允许在 SQL 中 运行 进行位置查询。
SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';