按地理位置过滤地点的数据库设计

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% 存储 latitudelongitude,用 city/county 过滤 listings(places) 的最佳方法是什么?

搜索请求示例:waiter offers in Italy

解决方案 1:存储在 Listing entity 个附加字段中,例如 city(和 country?)。 (实际上,它将是单独的多对多(城市 <= => 列表)实体以避免用户混乱,优化 SQL 搜索请求并轻松将新城市添加到 production database,我说得对吗? )

解决方案2:当用户键入Italy时,客户端将此查询发送到后端。在后端解析并为 Italy 查询获取 longitudelatitude 之后(我假设会有一些错误,比如 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';