Comment créer une table à partir de tables existantes (en appliquant de nouveaux schémas) dans la base de données postgis?

9

J'ai une table qui est géospatialement activée; qui contiennent des frontières mondiales. Je veux le décomposer en différents schémas (global, europe etc.). Ma pensée est d'utiliser quelque chose qui ressemble à ceci:

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

Quel est le bon pour créer une table à partir de tables existantes en tenant compte des nouveaux schémas et en les rendant géospatialement activés? Dois-je créer au préalable les nouvelles tables à l'aide de mon modèle de postgis par défaut?

nickves
la source

Réponses:

21

En général, vous pouvez créer une nouvelle table géospatiale comme ceci:

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

Cependant, ce faisant, vous séparez votre base de données (vous ne la normalisez pas). Cela signifie qu'il a une redondance, donc s'il y a une mise à jour pour n'importe quelle information dans une table, il est difficile de la mettre à jour dans une autre. De plus, vous ne seriez pas en mesure d'effectuer des requêtes sur le monde entier, juste sur les sous-régions. Vous pourriez envisager d'utiliser des VUES pour créer des tables virtuelles de partitions de la table principale:

-- 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
la source
Votre réponse a vraiment répondu à ma question et m'a permis de mieux comprendre le fonctionnement interne des bases de données postgresql / postgis! Je vous remercie!
nickves