Postgis:tabla con varias geometrías

El particionamiento de listas (list partitioning) en PostgreSQL/PostGIS es un método de particionamiento declarativo que permite dividir una tabla grande en varias subtablas, según los valores discretos de una columna (por ejemplo: por región, tipo, año, etc.).

Esto resulta especialmente útil en SIG cuando se desea gestionar capas de gran tamaño (por ejemplo, una tabla con millones de objetos geográficos divididos por país, o por tipo de zona).

¿Qué es la partición de listas?

Es una técnica que :

  • Crea una tabla principal (la tabla padre),
  • Y varias particiones (tablas hijas), cada una de las cuales contiene filas correspondientes a un valor específico de una columna.

Ejemplos de uso en SIG:

  • Partición de una tabla de edificios por tipo (residencial, industrial, público, etc.)
  • División de una tabla de zonas por municipios o islas (Mauricio, Rodrigues, etc.).
  • Partición de una tabla de carreteras por tipo de vía (autopista, carretera, vía verde, etc.)

Ventajas

  • Consultas más rápidas si la cláusula WHERE filtra por tipo
  • Menos bloqueos de escritura
  • Mantenimiento más sencillo (se puede archivar o separar una partición)
  • Puede combinarse con la gestión del vacío, índices locales, disparadores específicos de partición, etc.

Limitaciones

  • La columna de partición debe estar bien elegida (valores discretos, no demasiados)
  • Una fila sólo puede ir a una partición
  • Restricciones e índices deben ser definidos en cada partición (desde PostgreSQL 13, algunos pueden ser heredados)

¿Qué pasa con los diferentes tipos de geometría (punto, línea, polígono)?

En PostGIS, puede utilizar tablas particionadas para almacenar diferentes tipos de geometría en particiones separadas. PostgreSQL soporta particionamiento de listas (LIST PARTITIONING), que es muy adecuado para separar entidades geográficas según su tipo (punto, línea, polígono).

1. Creación de la tabla principal

La tabla principal es una tabla particionada en función del tipo de geometría.

crear la tabla principal

CREATE TABLE formation.objets_geographiques (

    id SERIAL,

    nom TEXT NOT NULL,

    geom GEOMETRY NOT NULL,

    type_geom TEXT NOT NULL,

    PRIMARY KEY (type_geom, id)  -- Ajout de type_geom dans la clé primaire

) PARTITION BY LIST (type_geom);

Aquí, la columna type_geom se utiliza como clave de partición.

2. Creación de particiones para cada tipo de geometría

Se crean particiones específicas para cada tipo de geometría (POINT, LINESTRING, POLYGON).

creación de particiones

CREATE TABLE formation.objets_points

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘POINT’);

CREATE TABLE formation.objets_lignes

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘LINESTRING’);

CREATE TABLE formation.objets_polygones

PARTITION OF formation.objets_geographiques

FOR VALUES IN (‘POLYGON’);

table partitionnée dans postgis

3. Añadir una restricción de tipo de geometría

Para asegurarnos de que cada partición contiene sólo el tipo correcto de geometría, añadimos una restricción CHECK.

añadir restricciones

ALTER TABLE formation.objets_points ADD CONSTRAINT chk_geom_point

CHECK (GeometryType(geom) = ‘POINT’);

ALTER TABLE formation.objets_lignes ADD CONSTRAINT chk_geom_linestring

CHECK (GeometryType(geom) = ‘LINESTRING’);

ALTER TABLE formation.objets_polygones ADD CONSTRAINT chk_geom_polygon

CHECK (GeometryType(geom) = ‘POLYGON’);

4. Inserción de datos

Los datos se redirigirán automáticamente a la partición correcta en función del valor de type_geom.

inserción de datos

INSERT INTO formation.objets_geographiques (nom, geom, type_geom)

VALUES

    (‘École’, ST_GeomFromText(‘POINT(57.5 -20.2)’, 4326), ‘POINT’),

    (‘Route côtière’, ST_GeomFromText(‘LINESTRING(57.5 -20.2, 57.6 -20.3)’, 4326), ‘LINESTRING’),

    (‘Parc national’, ST_GeomFromText(‘POLYGON((57.5 -20.2, 57.6 -20.3, 57.7 -20.1, 57.5 -20.2))’, 4326), ‘POLYGON’);

5. Creación de índices en las particiones

Se pueden crear índices GIST o SP-GiST en cada partición para mejorar el rendimiento de las consultas espaciales.

creación de índices

CREATE INDEX idx_geom_points ON formation.objets_points USING GIST (geom);

CREATE INDEX idx_geom_lignes ON formation.objets_lignes USING GIST (geom);

CREATE INDEX idx_geom_polygones ON formation.objets_polygones USING GIST (geom);

Ventajas de la partición en PostGIS

  • Mejora el rendimiento de las consultas espaciales al reducir el volumen de datos analizados.
  • Facilita la gestión y organización de los objetos geográficos.
  • Simplifica el mantenimiento (por ejemplo, la eliminación de una partición específica sin afectar a las demás).

6. Consulta para recuperar un tipo específico

Si sólo desea recuperar polígonos, PostgreSQL consulta directamente la partición correcta.

consulta de datos

SELECT * FROM formation.objets_geographiques WHERE type_geom = ‘POLYGON’;

Esto mejora la eficacia de las consultas al evitar el escaneo de datos innecesarios.

Conclusión

La partición por tipo de geometría en PostGIS permite una gestión eficaz de los datos espaciales, al tiempo que optimiza el rendimiento de las consultas y el almacenamiento.

Si cet article vous a intéressé et que vous pensez qu'il pourrait bénéficier à d'autres personnes, n'hésitez pas à le partager sur vos réseaux sociaux en utilisant les boutons ci-dessous. Votre partage est apprécié !

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *