如何使用具有标签和lat,lng坐标的位置对事件建模?

时间:2017-08-24 22:39:16

标签: sql postgresql database-design postgis

假设在此位置发生特殊事件:

{
  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)来执行查询,例如"查找___英里内的所有事件"。

1 个答案:

答案 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。