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

时间:2019-01-20 16:16:28

标签: sql search database-design geolocation database-schema

我的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查询获取latitudeItaly(我想有些错误,例如strange query)。然后,后端开始搜索位于接收到的地理位置附近的列表(地点)。越接近,搜索排名越好

解决方案3 :您的解决方案... =)

airbnb搜索引擎的工作原理如下,没有硬编码城市列表

airbnb solution

1 个答案:

答案 0 :(得分:1)

您可以尝试https://postgis.net

它增加了对地理对象的支持,允许在SQL中运行位置查询。

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';