Problemas identificando llaves

Tengo problemas identificando como pongo las porque y las unique ejemplo tengo una tabla cheques que tiene los campos cheque_id, chque_numero, cheque_fecha en esta tabla pongo como porque cheque_id no hay problema pero tengo una tabla de abonos con los campos cheque_id, doc_id, recibo_id, monto estas tablas deben ir relacionadas por los campos cheque_id esto me exige que este campo sea unique, los campos cheque_id, doc_id, recibo_id deben validarse entre ellos osea uno de los 3 campo debe de ser distinto no los 3 entonces mi pregunta es creo los 3 campos como unique, los creo como indices, los creo como indices y uniques.

2 Respuestas

Respuesta
1
Porque dices que
"esto me exige que este campo(cheque_id) sea unique,"
?
Cuando se crea la relación entre dos tablas, el campo FK a lo sumo debe ser un indice más no creado como uniq.
La creación de varios campos como uniq depende de que restricciones tienes en tu diseño, si es una tabla intermedia en una relación muchos a muchos, es probable que tengan que crear los dos campos como uniq a la vez. Te sugiero que revises tu diseño y las restricciones que tiene para obtener esta conclusión.
Pues cuando estoy creando mi FK me da un error diciendo que cheque_id debe ser UNIQUE si sheque_id lo creo como PORQUE no me da error pero no puedo porque este si puede repetirse dependiendo del campo recibo_id y doc_id y si los pongo los tres como PORQUE también me da error la única forma que no me da error es colocándolo como UNIQUE los tres campos pero quiera saber si es lo correcto y si los tengo que agregar como indices también.
Ya pude resolver mi problema pero esto me creo un par de dudas lo pude resolver creando FK desde mi tabla que era por decirlo así el detalle y no desde el ancabezado donde iba un registro y en el detalle varios en otras base de datos siempre había creado la relación desde el encabezado no se porque en posgres es así esa es una de mis preguntas y la otra cuando tengo que crear indices y cuando uniques. Gracias
Postgres es una base de datos 100% relacional y esta muy apegada a los estándares de sql, hay sintaxis que otras bases de datos permiten, por ejemplo mysql, que en postgres no.
Respecto a los indices y uniques: un indice es como un espacio de la tabla que permite ubicar los registros de manera más rápida, que haciéndolos secuencialmente, por lo que el uso de un indice permite hacer consultas más rápidas, esto se evidencia cuando se tienen muchos registros en la tabla.
Los indices tipo uniq hacen referencia a campos que por asuntos de diseño, deben ser únicos en la tabla, por ejemplo, si hablamos de usuarios, el campo teléfono podría ser catalogado como uniq, pero, esta restricción depende de como se ha diseñado el modelo de la base de datos previamente. Si creas un campo uniq no necesitas agregar un indice porque uniq es un tipo de indice.
Respuesta
1
Lo que necesitas se conoce como llave compuesta para su caso seria algo así
-- Definición de llave primaria compuesta
Alter table mi-base. tabla_relacion
add constraint tabla_relacion _pk primary key (cheque_id,doc_id,recibo_id);
- - La anterior llave validara que no se repitan registraos iguales seria algo así:
-- ------ Ejemplo ------
--  cheque_id -- doc_id -- recibo_id
-- 1 1 1
-- 1 1 2
-- 1 1 1 -- la restricción de la llave generaría un error a l
-- Intentar introducir este ultimo registro por que ya existe.
-- Después se crean las llaves foráneas FK para este caso en particular cada campo de la tabla es una llave foránea de la tablas maestras.
alter table mi-base. tabla_relacion
add constraint tabla_relacion _cheque_fk foreign key(cheque_id)
references mi-base.cheque(cheque_id) on update cascade;
alter table mi-base.tabla_relacion
add constraint tabla_relacion _doc_fk foreign key(doc_id)
references mi-base.doc(doc_id) on update cascade;
alter table mi-base.tabla_relacion
add constraint tabla_relacion _recibo_fk foreign key(recibo_id)
references mi-base. recibo(recibo_id) on update cascade;
-- Bien creo es todo saludos.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas