Pregunta

¿Cuál es el beneficio de tener tablas de unión entre el primer 1: my las segundas 1:? M relaciones en la siguiente base de datos

texto alternativo http://dl.getdropbox.com/u /175564/db/db-simple.png

El libro árboles y jerarquías de Joe Celko en SQL para Smarties dice que la razón es tener relaciones únicas en 1: de m. Por ejemplo, las siguientes tablas resrict usuarios que pedir exactamente la misma pregunta dos veces y dar exactamente la misma respuesta dos veces, respectivamente.

El primero 1: m relación

users-questions
===============
user_id REFERENCES users( user_id )
question_id REFERENCES questions ( question_id )
PK( user_id, question_id)           // User is not allowed to ask same question twice 

El segundo 1: m relación

questions-answers
=================
question_id REFERENCES questions( question_id)
answer_id REFERENCES answers( aswer_id )
PK( question_id, answer_id )       //  Question is not allowed to have to same answers

Este beneficio sobre la singularidad no me convence para que mi código sea más difícil. No puedo entender por qué debería restringir la posibilidad de tener preguntas o respuestas con el mismo ID en el PP, ya que tal vez puedo usar PHP para prohibir a eso.

¿Fue útil?

Solución

Su por lo general debido a la duplicación de datos.

En cuanto a su razonamiento, sí se puede hacer cumplir esta en la capa de negocio, pero si se comete un error, se podría romper una cantidad significativa de código. El problema que tiene es su modelo de datos puede tener sólo unas pocas mesas. Eres afortunado. Cuando el modelo de datos crece, si no se puede dar sentido a la estructura y hay que poner toda la lógica para mantener las tablas desnormalizaremos en la capa de interfaz gráfica de usuario que podría muy fácilmente a tener problemas. Tenga en cuenta que es difícil hacer las cosas threadsafe en una interfaz gráfica de usuario para su base de datos SQL sin usar bloqueo que destruirá su rendimiento.

DBMS son muy, muy buenos para hacer frente a estos problemas. Usted puede mantener su modelo de datos limpia y el uso de indexación para ofrecerle la velocidad que necesita. Su objetivo debe ser hacer las cosas bien en primer lugar, y sólo denormalise sus tablas cuando se puede ver una clara necesidad de hacerlo (para el rendimiento, etc.)

Lo creas o no, hay muchas situaciones en las que tener datos normalizados hace la vida más fácil, no más difícil cuando se trata de su aplicación. Por ejemplo, si usted tiene una gran mesa con preguntas y respuestas, usted tiene que escribir código para comprobar si es único. Si usted tiene una tabla con una clave principal, sólo tiene que escribir

insert into table (col1, col2) values (@id, @value) --NOTE: You would probably 
--make the id column an autonumber so you dont have to worry about this

La base de datos impedir que se inserte si tiene un valor que no es única o si no va a colocar en una respuesta sin pregunta. Todo lo que necesita hacer es comprobar si la inserción trabajó, nada más. ¿Cuál cree usted que es menos código?

Otros consejos

Bueno, lo único relaciones sin sentido parece a mí, probablemente porque estoy acostumbrado a DBMSes donde se pueden definir las claves únicas que no sean la clave principal. En mi mundo, tablas de asignación, como los son el modo de implementar una relación de muchos a muchos, y utilizarlos para una relación de uno a muchos es la locura - Quiero decir, si lo hace, tal vez usted tiene la intención de la relación que se utiliza como uno-a-muchos, pero lo que en realidad se ha implementado es muchos-a-muchos apoyan.

No estoy de acuerdo con lo que dice sobre la existencia de ninguna utilidad para las claves compuestas únicas en la capa de persistencia, ya que puede valer que en la capa de aplicación, sin embargo. Persistencia de la capa de restricciones de unicidad tienen un montón de difícil de replicar beneficios, tales como, en MySQL, la capacidad de tomar ventaja de INSERT ... ON DUPLICATE KEY UPDATE .

Estoy de acuerdo que la unión de tablas para un uno-a-muchos en esta situación no parece añadir mucho beneficio, y como @chaos dice, en realidad se acaban de implementar el soporte de muchos a muchos. Pero Joe Celko es un tipo inteligente - ¿es realmente la respuesta exacta que da

Otra posible razón para la implementación de una tabla de unión en un uno-a-muchos es que separa completamente las preguntas / respuestas de la dependencia de los usuarios.

Por ejemplo, digamos que usted ha añadido una Dogs mesas y una mesa Deities. Todos sabemos que los perros no pueden registrarse como usuarios, ya que no tienen direcciones de correo electrónico, y los dioses no se registren como usuarios porque, bueno, es por debajo de ellos. Tal vez los perros y los dioses todavía preguntas sin embargo, pero para ello es posible que desee aplicar una mesa perros de preguntas y una mesa deidades preguntas. En teoría, esto es todavía muchos-a-muchos, pero en la práctica que hacerlo de manera que se puede tener múltiples uno a manys.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top