Как создать таблицу из существующих таблиц (применяя новые схемы) в БД postgis?


9

У меня есть таблица, которая геопространственно включена; которые содержат мировые границы. Я хочу разбить его на разные схемы (глобальные, европейские и т. Д.). Моя мысль состоит в том, чтобы использовать что-то похожее на это:

CREATE TABLE europe.borders
  AS (SELECT *
         FROM wo_borders
         WHERE admin_lvl2='eu' ); //just an example!

Как правильно создавать таблицы из существующих таблиц, принимая во внимание новые схемы и делая их геопространственными? Должен ли я заранее создавать новые таблицы, используя мой шаблон postgis по умолчанию?

Ответы:


21

Как правило, вы можете создать новую геопространственную таблицу следующим образом:

SELECT *
INTO europe.borders
FROM wo_borders
WHERE admin_lvl2 = 'eu';

-- Define a primary key
ALTER TABLE europe.borders ADD PRIMARY KEY (gid);

-- Spatially enable it
SELECT Populate_Geometry_Columns('europe.borders'::regclass);

Однако, делая это, вы разделяете свою базу данных (не нормализуя ее). Это означает, что он имеет избыточность, поэтому, если в одной таблице есть обновление для какой-либо информации, его трудно обновить в другой. Кроме того, вы не сможете выполнять запросы по всему миру, только по субрегионам. Вы можете рассмотреть возможность использования VIEW для создания виртуальных таблиц разделов основной таблицы:

-- Make an index on your column used to query the view
CREATE INDEX wo_borders_admin_lvl2_idx ON wo_borders USING btree (admin_lvl2);

-- Now the view
CREATE OR REPLACE VIEW europe.borders_view AS
 SELECT *
 FROM wo_borders
 WHERE admin_lvl2 = 'eu';

-- Spatially enable it
SELECT Populate_Geometry_Columns('europe.borders_view'::regclass);

Ваш ответ действительно ответил на мой вопрос и дал мне лучшее понимание внутренней работы баз данных postgresql / postgis! Спасибо!
nickves
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.