假设在此位置发生特殊事件:
{
label: 'Mountain View',
lat: 37.4224764,
lng: -122.0842499
}
您如何存储此信息以及原因?
1)单人表
events: id place_label coordinates(point)
2)两个单独的表格
events: id place_id
places: place_id label coordinates(point)
3)使用jsonb数据类型的单个表
events: id place(jsonb)
或其他方式?
最终目标是使用地理空间扩展(例如EarthDistance,PostGIS)来执行查询,例如"查找___英里内的所有事件"。
答案 0 :(得分:1)
执行两个单独的表,否则您会遇到查询较大的表中多边形点所需的缺点。
CREATE TABLE places
(
id_place serial PRIMARY KEY,
name text,
geom geography(POINT)
);
CREATE INDEX ON places USING gist(geom);
CREATE TABLE events
(
id_event serial PRIMARY KEY,
id_place int REFERENCES place,
start_ts timestamp
);
最终目标是使用地理空间扩展(例如EarthDistance,PostGIS)来执行查询,例如"查找___英里内的所有事件"。
SELECT *
FROM events AS e
JOIN places AS p USING (id_place)
WHERE ST_DWithin(p.geom, ST_MakePoint(long,lat)::geography, miles*1609);
miles
(long,lat)
内的所有事件。我不会使用earthdistance
,我只会使用PostGIS。