我的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%存储listings(places)
和city/county
时,用latitude
过滤longitude
的最佳方法是什么?
搜索请求示例:waiter offers in Italy
解决方案1 :存储在Listing entity
的其他字段中,例如city
(和country
?)。
(实际上,它将是独立的多对多(城市<= =>列表)实体,以避免用户混乱,优化SQL
的搜索请求,并轻松地向production database
中添加新城市,对吗? )
解决方案2 :当用户键入Italy
时,客户端将此查询发送到后端。在后端解析之后,为longitude
查询获取latitude
和Italy
(我想有些错误,例如strange query
)。然后,后端开始搜索位于接收到的地理位置附近的列表(地点)。越接近,搜索排名越好
解决方案3 :您的解决方案... =)
airbnb搜索引擎的工作原理如下,没有硬编码城市列表
答案 0 :(得分:1)
您可以尝试https://postgis.net
它增加了对地理对象的支持,允许在SQL中运行位置查询。
SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';