Problemas al tener más de una clave foránea por tabla

724 views
Skip to first unread message

germencita

unread,
Feb 26, 2010, 8:10:55 AM2/26/10
to symfony-es
Hola, buena otra vez ando por aquí liada con el Symfony…

¿Sabéis si hay algún problema con tener más de una clave primaria en
una tabla a la hora de hacer un “Save” en la base de datos?

El caso es que no me permite hacer Save teniendo dos claves primarias
y si pongo una sola clave Id auto-incremental sí me lo permite.

Mi caso es el siguiente:

Tengo 3 tablas :

Encuestas
Cod_encuesta: clave primaria

Preguntas
Cod_encuesta: clave foránea
Cod_pregunta
(estas dos deben ser primarias)

Respuestas
Cod_encuesta: clave foránea
Cod_pregunta: clave foránea
Cod_respuesta
(las tres deben ser claves primarias)

El problema es que si añado claves “id” como única clave primaria para
que no me de problemas al guardar rompo la Integridad Referencial al
no poder poner como foráneas el resto de claves.

¿A alguien le ha pasado algo similar?
Muchas gracias

Jose Antonio Pio Gil

unread,
Feb 26, 2010, 8:14:27 AM2/26/10
to symfo...@googlegroups.com
Me paso lo mismo hace tiempo con una relacion de imagenes con galerías. La solución fue:

Respuestas
       Cod_respuesta: primaría
       Cod_encuesta: Index
       Cod_pregunta: Index

      
       (las tres deben ser  claves primarias)



Porque tienes que ser primerías las 3?

JAP


--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Para tener acceso a más opciones, visita el grupo en http://groups.google.com/group/symfony-es?hl=es.


Sebas...

unread,
Feb 26, 2010, 8:18:09 AM2/26/10
to symfony-es
No es necesario que las tres sean primarias, con la foranea mantenes
la integridad referencial.

germencita

unread,
Feb 26, 2010, 8:31:39 AM2/26/10
to symfony-es
Pero para que una clave pueda ser foránea debe ser primaria en otra
clase ¿no? Porque las claves primarias son las que migran como
foráneas.
Las tres deben ser primarias porque por ejemplo en "preguntas" habrá
varias preguntas número "2" pero de la encuesta número "3" sólo habrá
una. Una pregunta se identifica por el número de encuesta y el orden
que tiene en esa encuesta. Y lo mismo pasa con las respuestas.
No sé si me explico...
¿Con lo s indice spuedo hacer algo similar?
Gracias

> > Muchas gracias- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Jose Antonio Pio Gil

unread,
Feb 26, 2010, 8:39:25 AM2/26/10
to symfo...@googlegroups.com
Estas usando Doctrine y MySQL?



--

germencita

unread,
Feb 26, 2010, 8:48:18 AM2/26/10
to symfony-es
Estoy usando PhpMyAdmin (MySql) y Criteria (Symfony 1.2.4)

On 26 feb, 14:39, Jose Antonio Pio Gil <joseto...@latizana.com> wrote:
> Estas usando Doctrine y MySQL?
>

> > symfony-es+...@googlegroups.com<symfony-es%2Bunsubscribe@googlegrou­ps.com>


> > Para tener acceso a más opciones, visita el grupo en

> >http://groups.google.com/group/symfony-es?hl=es.- Ocultar texto de la cita -

Sebas...

unread,
Feb 26, 2010, 8:49:56 AM2/26/10
to symfony-es
Tu lo has dicho, la foránia es primaria de otra tabla, no es primaria
en la misma tabla que defines la foránea. Yo lo haría así:

Encuestas
Cod_encuesta: clave primaria

Preguntas
Cod_encuesta: clave foránea Cod_encuesta
Cod_pregunta: clave primaria

Respuestas
Cod_encuesta: clave foránea Cod_encuesta (prodría sobrar ya
que con el Cod_pregunta obtendira el Cod_encuesta)
Cod_pregunta: clave foránea Cod_pregunta
Cod_respuesta: clave primaria

Puede ser una solución

germencita

unread,
Feb 26, 2010, 8:55:05 AM2/26/10
to symfony-es
Muchas gracias Sebas pero el problema que le veo es que al tener solo
una primaria en la tabla Preguntas no me permitiría tener valores
repetidos, y yo tendré varias preguntas número 2 (cod_pregunta) de
distintas encuestas.
Porque las claves primarias no pueden estar repetidas ¿no?

> > > - Mostrar texto de la cita -- Ocultar texto de la cita -

Sebas...

unread,
Feb 26, 2010, 9:17:51 AM2/26/10
to symfony-es
Hmm el cod_pregunta se puede repetir? lo que entiendo entonces es que
una misma pregunta puede estar en varias encuestas?

germencita

unread,
Feb 26, 2010, 9:19:55 AM2/26/10
to symfony-es
Sí, digamos que sí.

Sebas...

unread,
Feb 26, 2010, 9:25:24 AM2/26/10
to symfony-es
Entonces creo que hay que cambiar el modelo, podría ser algo así:

Encuestas
Cod_encuesta: clave primaria
Preguntas

Cod_pregunta: clave primaria
PreguntasPorEncuestra
Cod_encuesta: clave foránea Cod_encuesta
Cod_pregunta: clave foránea Cod_pregunta
Respuestas


Cod_pregunta: clave foránea Cod_pregunta
Cod_respuesta: clave primaria

Creo que así puedes repetir las preguntas en diferentes encuestas

alvarosaco

unread,
Feb 26, 2010, 9:38:32 AM2/26/10
to symfony-es
Yo he tenido el mismo problema. Tengo tres tablas y una de ellas,
Vivienda, tiene como clave primaria dos atributos, esto es, la
concatenación de ambos:

Cooperativa
id_cooperativa: clave primaria

Vivienda:
numero: clave primaria
id_cooperativa: clave primaria
id_socio: clave foránea

Socio:
dni: clave primaria
id_cooperativa: clave foranea

Así, no puede haber dos viviendas con el mismo número y mísmo
id_cooperativa.

¿Has encontrado la solución?
Yo de momento aún estoy peleándome con los formularios para añadir una
nueva Vivienda, por ejemplo.

Marcos Matamala

unread,
Feb 26, 2010, 10:14:54 AM2/26/10
to symfo...@googlegroups.com
El día 26 de febrero de 2010 10:10, germencita <germe...@gmail.com> escribió:
> Hola, buena otra vez ando por aquí liada con el Symfony…
>
> ¿Sabéis si hay algún problema con tener más de una clave primaria en
> una tabla a la hora de hacer un “Save” en la base de datos?

No, se puede ni se debe tener más de un clave primaria en un tabla, lo
que puedes tener es un clave primaria compuesta, y para tener un clave
foránea solo necesitas que en la tabla foránea esta sea primaria(osea
unica) y exista.


Un modelo adecuado seria algo como esto:

create table encuesta(id int primary key);
create table pregunta(id int primary key, encuesta_id int references
encuesta(id), unique(id, encuesta_id));
create table respuesta(id int primary key, pregunta_id int references
pregunta(id), unique(id, pregunta_id));

select * from encuesta e, pregunta p, respuesta r where p.encuesta_id
= e.id and r.pregunta_id = p.id;


--
Marcos Matamala Fernández:
Analista Programador
Teléfono: 95962482

germencita

unread,
Feb 26, 2010, 11:22:52 AM2/26/10
to symfony-es
Alvaro ese es exactamente mi problema. ¿A ti no te da problemas al
guardar la tabla vivienda con dos primarias?
La solución que propones Alvaro me parece buena, no se me habia
ocurrido lo de usar "unique". Lo pruebo y os cuento.
Muchas gracias

On 26 feb, 16:14, Marcos Matamala
<marcos.analista.programa...@gmail.com> wrote:

ReynierPM

unread,
Feb 26, 2010, 11:43:29 AM2/26/10
to symfo...@googlegroups.com
On 2/26/2010 11:22 AM, germencita wrote:
> Alvaro ese es exactamente mi problema. �A ti no te da problemas al

> guardar la tabla vivienda con dos primarias?
> La soluci�n que propones Alvaro me parece buena, no se me habia

> ocurrido lo de usar "unique". Lo pruebo y os cuento.
> Muchas gracias
>

Yo he estado experimentando el mismo problema con llaves primarias
compuestas y no he encontrado soluci�n. Si mal no recuerdo le� en la
lista de Doctrine que esto en este momento no estaba soportado por el
ORM. Si me equivoco que alguien me corrija

--
Saludos
ReynierPM

Marcos Matamala

unread,
Feb 26, 2010, 11:43:29 AM2/26/10
to symfo...@googlegroups.com
El día 26 de febrero de 2010 13:22, germencita <germe...@gmail.com> escribió:
> Alvaro ese es exactamente mi problema. ¿A ti no te da problemas al
> guardar la tabla vivienda con dos primarias?

Insisto una tabla no puede tener dos clave primarias

tabla(id_uno primary key, id_dos primary key)

sino que debe ser tabla(id_uno, id_dos, primary key(id_uno, id_dos))

Yo siempre uso un campo id primary key y uso unique, el uso de una
columna id como primary key es para ayudar al ORM...

saludos.-

Marcos Matamala

unread,
Feb 26, 2010, 11:51:43 AM2/26/10
to symfo...@googlegroups.com
El día 26 de febrero de 2010 13:43, ReynierPM <rpe...@uci.cu> escribió:
> On 2/26/2010 11:22 AM, germencita wrote:
>>
>> Alvaro ese es exactamente mi problema. ¿A ti no te da problemas al

>> guardar la tabla vivienda con dos primarias?
>> La solución que propones Alvaro me parece buena, no se me habia

>> ocurrido lo de usar "unique". Lo pruebo y os cuento.
>> Muchas gracias
>>
>
> Yo he estado experimentando el mismo problema con llaves primarias
> compuestas y no he encontrado solución. Si mal no recuerdo leí en la lista

> de Doctrine que esto en este momento no estaba soportado por el ORM. Si me
> equivoco que alguien me corrija

Puedes darme los datos(modelo) para hacer pruebas, no entiendo el problema.

alvarosaco

unread,
Feb 26, 2010, 4:20:28 PM2/26/10
to symfony-es
¿Cómo se expresaría entonces el hecho de tener una clave primaria
compuesta por dos atributos (en lugar de dos claves primarias) en el
schema.yml?

On 26 feb, 18:51, Marcos Matamala
<marcos.analista.programa...@gmail.com> wrote:

Marcos Matamala

unread,
Feb 26, 2010, 7:47:02 PM2/26/10
to symfo...@googlegroups.com
El día 26 de febrero de 2010 18:20, alvarosaco <alvar...@gmail.com> escribió:
> ¿Cómo se expresaría entonces el hecho de tener una clave primaria
> compuesta por dos atributos (en lugar de dos claves primarias) en el
> schema.yml?
>

Tabla:
indexes:
encuesta_pregunta:
fields: [pregunta_id, encuesta_id]
type: unique

schema.yml

Carmen Loro

unread,
Feb 28, 2010, 7:53:28 AM2/28/10
to symfo...@googlegroups.com
¿Poniendo una clave primaria compuesta por dos (o más) me evitaría los problemas al hacer el "save"?
Gracias Marcos.
Si no, lo de "unique" me parece una buena solución

2010/2/27 Marcos Matamala <marcos.analis...@gmail.com>
--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Grupos de Google.
Para publicar una entrada en este grupo, envía un correo electrónico a symfo...@googlegroups.com.
Para anular tu suscripción a este grupo, envía un correo electrónico a symfony-es+...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages