Como criar uma tabela a partir de tabelas existentes (aplicando novos esquemas) no postgis DB?


9

Eu tenho uma tabela que é ativada geoespacialmente; que contêm fronteiras mundiais. Eu quero dividi-lo em diferentes esquemas (global, europa etc.). Meu pensamento é usar algo que se parece com isso:

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

Qual é o correto para criar tabelas a partir de tabelas existentes, levando em consideração novos esquemas e ativando-os geoespacialmente? Preciso criar previamente as novas tabelas usando meu modelo postgis padrão?

Respostas:


21

Geralmente, você pode criar uma nova tabela geoespacial como esta:

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);

No entanto, ao fazer isso, você está segregando seu banco de dados (não normalizando-o). Isso significa que há redundância; portanto, se houver uma atualização para qualquer informação em uma tabela, será difícil atualizar em outra. Além disso, você não seria capaz de realizar consultas em todo o mundo, apenas sub-regiões. Você pode considerar o uso de VIEWs para criar tabelas virtuais de partições da tabela principal:

-- 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);

Sua resposta realmente respondeu à minha pergunta e me deu uma melhor compreensão das obras internas dos bancos de dados postgresql / postgis! Obrigado!
nickves 17/05
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.