Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

¿relación entre tablas si o no?

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: ¿relación entre tablas si o no? Responder citando

Hola y muchas gracias de antemano.
Tengo un problema con una tabla de una base de datos desarrollada con el interbase.
Mi problema es el siguiente. en mi base de datos tengo unas cuantas tablas relacionadas entre si con lo de foreign key (clave) on update cascade on delete cascade, eso me va muy bien, pero hay a veces en el que ese campo de la T1 que se relaciona con otro de la T2 puede ser nulo. Lo he intentado solucionar quitando lo de foreign key T2(campo), pero si hago esto, no me funciona lo de delete cascade y lo de updeta cascade. No se como puedo solucionarlo Crying or Very sad

Chao y muchas gracias Very Happy
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Que tal Waldi,

Si dices que el campo(llave) de la T1 puede ser nulo, entonces probablemente tengas un mal diseño en la base de datos. Recuerda que una de las principales razones de las llaves son identificar a los registros y si intentas asignar nulo pues rompes con las reglas.

Si puedes agregar parte de la estructura de las tablas y que datos son los que guardas tal vez podamos encontrar solución a tu problema.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Buenas Buildero, perdón si no me explico bien, pero es un poco complicado.
Estas son mis dos tablas, el problema surge porque en la tabla bobina puedo tener un conductor(el campo NombreC), pero otras veces a lo mejor no lo tengo con lo cual el valor de ese campo puede ser nulo.
Lo que habia hecho era no crear una relación entre las tablas, pero me surge el problema de on delete cascade y update cascade.
Mi pregunta es si existe una manera de que esten relacionadas para que cuando borre o actualice un conductor, se modifique el campo NombreC de la tabla bobina. Pero encima quiero que en determinadas ocasiones pueda insertar elementos en la tabla bobina sin necesidad de que el campo NombreC no sea nulo. Creo que pido mucho Laughing

/*--------------Crear una tabla de nombre Conductor----------*/

create table conductor (
NombreC cnombre not null,
TipoC cnombre not null,
Pcu Decimal(15,10),
R Decimal(15,10),
primary key(NombreC)
);
/*--------------------crear una tabla de nombre bobina-------------*/

create table bobina(
NombreB cnombre not null primary key,
DEmbobinado Decimal(15,10),
NombreN cnombre not null,//dato de tabla núcleo
NombreM cnombre not null,//dato de material
NombreC cnombre //dato tabla conductor
foreign key (NombreM) references material(NombreM) on delete cascade on update cascade,
foreign key (NombreN) references nucleo(NombreN) on delete cascade on update cascade
);

Espero ser claro con la explicación y muchas gracias por las posibles soluciones, Laughing
Volver arriba
Mensaje    Asunto: Responder citando

En efecto, desde mi muy particular punto de vista tienes mal diseñada tus tablas.

Si de antemano sabes que "NombreC" puede ser nulo entonces no puede ser tu llave primaria. Si aún tienes dudas respecto al correcto diseño de bases de datos te recomiendo una leida a la teoria.

El diseño que te propongo es el siguiente:

Código:

/*--------------Crear una tabla de nombre Conductor----------*/

create table conductor (
       IdConductor integer not null,    -->Nuevo campo de tipo entero (llave)
       NombreC cnombre,
       TipoC cnombre not null,
       Pcu Decimal(15,10),
       R Decimal(15,10),
       primary key(IdConductor)
);

/*--------------------crear una tabla de nombre bobina-------------*/

create table bobina(
       IdBobina integer not null,  --> Nuevo campo de tipo entero (llave)
       NombreB cnombre,
       DEmbobinado Decimal(15,10),
       IdNucleo integer not null,//dato de tabla núcleo
       IdMaterial integer not null,//dato de material
       IdConductor integer //dato tabla conductor
       
       foreign key (IdMaterial) references material(IdMaterial) on delete cascade on update cascade,
      foreign key (IdNucleo) references nucleo(IdNucleo) on delete cascade on update cascade
      foreign key (IdConductor) references conductor(IdConductor) on delete cascade on update cascade
);


Observa que ahora si no especificas un nombre de conductor no importa, pero siempre existirá un valor para la clave (IdConductor). Normalmente es un autonumerico, este valor lo debes controlar, normalemnete se usan generadores para asignar este valor y para asignarlo debes hacerlo a través de un disparador. Si tienes dudas sobre esto puedes checarte la ayuda de Interbase.

Otra cosa que debes tomar en cuenta es que si creas una llave de tipo cadena, el ordenar y buscar por este tipo de llaves puede disminuir el rendimiento de tu aplicación.

Si surgen mas dudas, solo escribe.

Saludos
_________________
Quien hace una pregunta teme parecer un ignorante durante cinco minutos, quien no pregunta se mantiene ignorante toda la vida.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola, si es necesario por la logica del negocio que ese campo pueda ser nulo y al mismo tiempo quieres que se aplique el cascade en las actualizaciones crea una clave artificial (autonumerica) que se llamaria por ejemplo ID, puedes hacer un trigger que mediante un generator se encargue de llenar ese campo y luego defines las keys combinando ID y NombreC o lo que necesites

Código:
 CREATE TABLE "CONDUCTOR"
(
  "ID"   INTEGER NOT NULL,
  "NOMBREC"   VARCHAR(50) NOT NULL,
  "TIPOC"   VARCHAR(50) NOT NULL,
  "PCU"   DECIMAL(15, 10),
  "R"   DECIMAL(15, 10),
 PRIMARY KEY ("ID","NOMBREC")
);

/*------------------------------------------------------------*/

CREATE TABLE BOBINA(
ID INTEGER NOT NULL,
NOMBREC VARCHAR(50) NOT NULL,
DEMBOBINADO DECIMAL(15,10),
PRIMARY KEY (ID,NOMBREC),
FOREIGN KEY (ID,NOMBREC) REFERENCES CONDUCTOR ON DELETE CASCADE ON UPDATE CASCADE

);


Modifique algunas cosas para hacer la prueba y que sea mas entendible
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Muchas gracias, con gente así, si que presta. Me parece la solución adecuada.

chao y muchas gracias por vuestro tiempo Laughing Laughing
Volver arriba
Mensaje    Asunto: Responder citando

Muchas gracias, así si que presta trabajar Very Happy . Intentaré pelearme con los generadores de interbase, para solucionar el problema.Gracias por las ideas.

Very Happy Chao y un saludo Very Happy
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.