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