2012-01-24 24 views
7

Estoy tratando de crear una base de datos, que tiene 2 tablas con claves foráneas mutuamente dependientes.mysql - Claves foráneas mutuamente dependientes

La primera tabla recibe el nombre de preguntas, contiene datos sobre las preguntas formuladas por los usuarios y también debe contener una clave para la mejor respuesta que fue respondida en la pregunta. (Esta debe ser una clave externa a nuestra segunda tabla denominada Respuesta)

La segunda tabla se llama Respuesta, contiene información sobre las respuestas a las preguntas y también debe contener un campo question_id, que es la clave de la pregunta que esta respuesta responde. esto también es una clave externa, a la primera tabla.

Cuando trato de crear las tablas, no puede crear la primera, ya que no es consciente de la segunda (de error cuando tratamos de declarar la clave externa a la segunda tabla que no existe aún)

Aquí está el código que estoy utilizando:

create table question 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id) references answer(a_id), 
); 


create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

¿Cómo puedo solucionar este problema? Gracias

+1

Consulte mi respuesta en una pregunta similar: [¿Cuál es la mejor manera de insertar filas en tablas con referencias 1 a 1 de cada una?] (Http://stackoverflow.com/questions/6691366/mysql-database-design -inserting-rows-in-1to1-tables/6692054 # 6692054) –

Respuesta

4

Crea la primera tabla sin la restricción de clave externa. Luego crea la 2da mesa como está. Finalmente, retroceda y modifique la primera tabla, agregando la restricción de clave externa por separado.

Y el SQL para añadir la clave externa se verá así:

ALTER TABLE question 
ADD FOREIGN KEY (best_a_id) 
REFERENCES answer(a_id); 

Sólo por curiosidad, pero ¿por qué mantener la relación-pregunta-respuesta que en ambas tablas? Porque (como señala Ypercube) no tiene una "mejor respuesta" cuando se formula la pregunta por primera vez, sin embargo, su diseño lo requiere. Probablemente sea mejor mantener esa relación en la tabla de respuestas, similar a cómo lo recomendó Olivier.

+0

¡¡Guau !! ¡¡¡Muchas muchas gracias!!! =] –

+4

Y luego, ¿cómo va a insertar filas? –

+1

@happy dude: Esto puede funcionar, solo si 'question.best_a_id' está establecido como Nullable. –

3

Agregue una marca a la tabla de respuestas.

create table answer 
(a_id    numeric(10,0), 
    q_id    numeric(10,0) not null, 
    best_answer  numeric(1) default 0 not null, 
primary key(a_id), 
foreign key (q_id) references question(q_id), 
); 

Y elimine best_a_id del cuadro de preguntas.

+0

Este es un enfoque mejor, pero lo difícil es asegurar que solo una RESPUESTA sea la mejor para cada PREGUNTA. Sé cómo hacer esto con Oracle DBMS, pero no creo que MySQL admita índices basados ​​en funciones, únicos o de otro tipo. – APC

+2

No está mal, pero prefiero tener una tabla de best_answer. –

+0

También podría usar un disparador DESPUÉS DE ACTUALIZAR para borrar el indicador de las otras respuestas con el mismo question_id. –

5

considere deshacerse de question.best_a_id y, en cambio, la adición de una mesa best_answers:

create table best_answers 
(q_id    numeric(10,0), 
    best_a_id   numeric(10,0), 
primary key(q_id), 
foreign key (best_a_id, q_id) references answer(a_id, q_id) 
); 

Si alguna vez tiene más de una mejor respuesta para una pregunta en particular (tal vez un empate), añadir best_a_id columna a la clave principal también.

+0

Edité su respuesta para reflejar las referencias correctamente. –

+0

Gracias, @ypercube –

+0

En MySQL, también se necesitará una 'LLAVE ÚNICA' en la tabla' respuesta' en '(a_id, q_id)'. –

Cuestiones relacionadas