У меня есть 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
дополнительные поля, например city
(и country
?).(На самом деле, это будет отдельный объект «многие ко многим» (список городов <= =>), чтобы избежать хаоса пользователей, оптимизировать SQL
поисковых запросов и легко добавлять новый город в production database
, я прав?)
Solution2 : когда пользователь вводит Italy
, клиент отправляет этот запрос бэкэнду.После этого бэкэнд-анализ и выборка longitude
и latitude
для запроса Italy
(я предполагаю, что там будут некоторые ошибки, например, strange query
).Затем бэкэнд начинает поиск списков (мест), которые расположены рядом с полученной геолокацией.Чем ближе, тем лучше рейтинг поиска
Solution3 : ваше решение ... =)
Вот как работает поисковая система airbnb, у них нет списка городов с жестким кодом
![airbnb solution](https://i.stack.imgur.com/dGwaa.png)