Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: Juan Carlos Barranco de PazDate: 2008-06-13 12:56:50
Subject: RE: Rendimiento sin COMMIT
Previous:From: Alvaro HerreraDate: 2008-06-13 12:12:56
Subject: Re: Copia y restauracion de base de datos deGForge

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group