Jak utworzyć tabelę z istniejących tabel (stosując nowe schematy) w Postgis DB?

9

Mam tabelę, która jest włączona geoprzestrzennie; które zawierają granice świata. Chcę rozbić to na różne schematy (globalny, europejski itp.). Moją myślą jest użycie czegoś, co wygląda następująco:

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

Co jest poprawne, aby utworzyć tabele z istniejących tabel, biorąc pod uwagę nowe schematy i włączając je geoprzestrzennie? Czy muszę wcześniej utworzyć nowe tabele przy użyciu mojego domyślnego szablonu postgis?

nickves
źródło

Odpowiedzi:

21

Zasadniczo możesz utworzyć nową tabelę geoprzestrzenną w następujący sposób:

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

Jednak robiąc to, segregujesz bazę danych (unormalizujesz ją). Oznacza to, że ma nadmiarowość, więc jeśli w jednej tabeli znajduje się aktualizacja jakiejkolwiek informacji, trudno ją zaktualizować w innej. Co więcej, nie będziesz w stanie wykonywać zapytań na całym świecie, tylko na podregionach. Możesz rozważyć użycie VIEWs do stworzenia wirtualnych tabel partycji głównej tabeli:

-- 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);
Mike T.
źródło
Twoja odpowiedź naprawdę odpowiedziała na moje pytanie i pozwoliła mi lepiej zrozumieć wewnętrzne prace baz danych postgresql / postgis! Dziękuję Ci!
nickves