Re: Consulta teoria SQL (FK a dos tablas).

From: "Silvio Quadri" <silvioq(at)gmail(dot)com>
To: "Terry Yapt" <yapt(at)technovell(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta teoria SQL (FK a dos tablas).
Date: 2008-06-13 12:22:42
Message-ID: 61dc71dc0806130522j5192b821hd1ceb5c887367b85@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El día 11 de junio de 2008 12:58, Terry Yapt <yapt(at)technovell(dot)com> escribió:
> Hola a todos, a ver que opinais....
>
> Una cuestión básica, supongamos el siguiente esquema de tablas:
>
> http://www.technovell.com/mailinglist/supuestoIIX061101.jpg
>
> Donde un elemento de la tabla UNIDADES, puede ser un elemento UNICO (no
> estar incluido en ningún grupo) o bien estar incluido dentro de un grupo.
> La tabla entradas, es para las entradas de artículos. Puede entrar un
> artículo UNICO (Foreign Key a Unidades) o un artículo de Grupo (foreign Key
> de Grupos). Y he aquí el problema.
>
> Dicho esquema, está incompleto, pues la tabla entradas, tendría que tener
> una FK a la tabla UNIDADES _* Y *_ otra a la tabla GRUPOS. Pues de las
> dos tablas nos pueden venir entradas. Pero creo que esto no es posible, pues
> una de las dos FK (la que no se cumpliese) se quejaria en el momento de
> efectuar la carga de datos en la tabla ENTRADAS.
>
> Datos de ejemplo
> (Tabla Grupos):
> * _Tornillo*s*_
>
> (Tabla unidades):
> * Tornillo (pertenece a grupo _Tornillo*s*)._
> * Clavo
>
> (Tabla Entradas):
> * Tornillo, 01/01/2008, Entrada de UN Tornillo.
> * Clavo, 01/01/2008, Entrada de UN Clavo.
> * _Tornillo*s*, _01/01/2008, Entrada de UN grupo de Tornillos.
>
> Como se solucionaría, teoricamente, este problema ?????
>
> No sé si me he explicado correctamente.
>
> ======= Por si a alguien le interesa probar algo ================
> -- DROP TABLE Entradas
> DROP TABLE IF EXISTS "Entradas" CASCADE;
>
> -- CREATE TABLE Entradas
> CREATE TABLE "Entradas" (
> "CodigoUnidad" varchar(10) NOT NULL,
> "FechaEntrada" date NOT NULL,
> "Descripcion" varchar(150),
> CONSTRAINT "pk_Entradas" PRIMARY KEY("CodigoUnidad","FechaEntrada")
> );
>
>
> -- DROP TABLE Grupos
> DROP TABLE IF EXISTS "Grupos" CASCADE;
>
> -- CREATE TABLE Grupos
> CREATE TABLE "Grupos" (
> "CodigoGrupo" varchar(10) NOT NULL,
> "DescripcionGrupo " varchar(50),
> CONSTRAINT "pk_Grupos" PRIMARY KEY("CodigoGrupo")
> );
>
>
> -- DROP TABLE Unidades
> DROP TABLE IF EXISTS "Unidades" CASCADE;
>
> -- CREATE TABLE Unidades
> CREATE TABLE "Unidades" (
> "CodigoUnidad" varchar(10) NOT NULL,
> "DescripcionUnidad " varchar(50),
> "PerteneceAGrupo " varchar(10),
> CONSTRAINT "pk_Unidades" PRIMARY KEY("CodigoUnidad"),
> CONSTRAINT "Ref_Unid_Grup" FOREIGN KEY ("PerteneceAGrupo ")
> REFERENCES "Grupos"("CodigoGrupo")
> MATCH SIMPLE
> ON DELETE NO ACTION
> ON UPDATE NO ACTION
> NOT DEFERRABLE
> );
>
> ==================================================
>
> --
> TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net
>

-- CREATE TABLE Entradas
CREATE TABLE "Entradas" (
"CodigoUnidad" varchar(10) NULL,
"CodigoGrupo" varchar(10) NULL,
"FechaEntrada" date NOT NULL,
"idEntrada" int ,
"Descripcion" varchar(150),
CONSTRAINT "pk_Entradas" PRIMARY KEY("FechaEntrada", "idEntrada")
);

Si declarás la tabla de esta forma, (con unidad y grupo en nulos y
agregando un campo a la PK) ya es suficiente. El control de integridad
referencial no se realiza en los campos nulos y no hacen faltan
triggers adicionales.
Silvio

Silvio

--
Silvio Quadri

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Juan Carlos Barranco de Paz 2008-06-13 12:56:50 RE: Rendimiento sin COMMIT
Previous Message Alvaro Herrera 2008-06-13 12:12:56 Re: Copia y restauracion de base de datos de GForge