4 votos

¿Es posible tener una sola columna de clave externa hace referencia a dos o más tablas diferentes?

En Spatialite (3.0.1), con un normal (no espacial) de la tabla, me gustaría relacionarlo con los dos diferentes tablas espaciales, con geometrías diferentes tipos (multipolígonos y polilíneas), utilizando la misma como una columna de clave externa, y la restricción a sus claves principales.

La idea general sería, mientras que la inserción de un nuevo registro en la no-espacial de la tabla, uno puede elegir que se refieren a una línea o un polígono de dos distintas tablas espaciales.

Ejemplo:

CREATE TABLE sp1_polygons
  poly_id TEXT NOT NULL PRIMARY KEY;

SELECT AddGeometryColumn(
  'sp1_polygons', 'geometry',
  27493, 'MULTIPOLYGON', 'XY');

CREATE TABLE sp2_lines
  poly_id TEXT NOT NULL PRIMARY KEY;

SELECT AddGeometryColumn(
  'sp2_lines', 'geometry',
  27493, 'MULTILINESTRING', 'XY');

CREATE TABLE t1 (
  t1_id INTEGER NOT NULL PRIMARY KEY,
  geo_id TEXT NOT NULL,
  CONSTRAINT fk_sp1
    FOREIGN KEY (geo_id) 
    REFERENCES sp1 (sp1_id)),
  CONSTRAINT fk_sp2
    FOREIGN KEY (geo_id) -- Equal to before
    REFERENCES sp2 (sp2_id));

En mi caso en particular, la no-espacial de la tabla representan las acciones de gestión (cosecha, siembra, corte, fijación, etc...) en una granja, mientras que las tablas espaciales representan homogeneus parcelas (polígonos) que se administra (tierras de cultivo, bosques, vegetación natural), o homogeneus líneas (corrientes de agua, naturales, vallas, etc...).

19voto

GriffinHeart Puntos 187

AFAIK, no hay ningún problema en tener dos restricciones de clave externa, con una columna haciendo referencia a dos columnas diferentes en dos mesas extranjeras. Sin embargo, eso significa que cada fila en la tabla con las limitaciones que debe hacer referencia a una entrada existente en ambas de las otras tablas. Así que usted no será capaz de relacionarse con algunas de las filas de la t1 a la sp1_lines, y algunos sp1_polygons. Cada entrada en t1 será necesario disponer de un geo_id que en realidad existe en ambas tablas espaciales.

Es posible, por otro lado, para crear un desencadenador que comprueba que el nuevo.geo_id existes en cualquiera de las líneas de la tabla O la tabla de polígonos. Algo así como:

CREATE TRIGGER "test_geo_id" BEFORE INSERT ON "t1"
FOR EACH ROW BEGIN

SELECT RAISE(ROLLBACK, 'No geo_id in either lines or polygons')
WHERE (SELECT count(l.id), count(p.id) FROM
sp1_lines AS l, sp1_polygons AS p 
WHERE l.id = NEW.geo_id OR p.id=NEW.geo_id) < 1

END

Pero, yo creo que tiene otro defecto de diseño en los cuadros descritos anteriormente: ¿Cómo asegurar que un valor de id en sp1_lines no se duplica en sp1_polygons?

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X