Разработка базы данных для фильтрации мест по геолокации - PullRequest
0 голосов
/ 20 января 2019

У меня есть 2 сущности в моем PostgreSQL:

@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
}

Каков наилучший способ фильтрации listings(places) по city/county, если я храню 100% latitude и longitude?

Пример запроса на поиск: waiter offers in Italy

Solution1 : хранить в Listing entity дополнительные поля, например citycountry?).(На самом деле, это будет отдельный объект «многие ко многим» (список городов <= =>), чтобы избежать хаоса пользователей, оптимизировать SQL поисковых запросов и легко добавлять новый город в production database, я прав?)

Solution2 : когда пользователь вводит Italy, клиент отправляет этот запрос бэкэнду.После этого бэкэнд-анализ и выборка longitude и latitude для запроса Italy (я предполагаю, что там будут некоторые ошибки, например, strange query).Затем бэкэнд начинает поиск списков (мест), которые расположены рядом с полученной геолокацией.Чем ближе, тем лучше рейтинг поиска

Solution3 : ваше решение ... =)

Вот как работает поисковая система airbnb, у них нет списка городов с жестким кодом

airbnb solution

1 Ответ

0 голосов
/ 20 января 2019

Вы можете попробовать https://postgis.net

Добавлена ​​поддержка географических объектов, позволяющая выполнять запросы местоположения в SQL.

SELECT superhero.name
FROM city, superhero
WHERE ST_Contains(city.geom, superhero.geom)
AND city.name = 'Gotham';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...