2010-02-25 12 views
9

Estoy trabajando en una aplicación web antigua que mi empresa usa para crear encuestas. Miré el esquema de la base de datos a través del símbolo del sistema de mysql y pensé que las tablas se veían bastante sólidas. Aunque no soy un gurú de DB, estoy muy versado en la teoría que lo respalda (habiendo tomado algunos cursos de diseño de bases de datos en mi programa de ingeniería de software).Razones por las que no usaría una clave externa? [php + MySQL]

Dicho esto, dejé las sentencias create en un archivo SQL y las importé en MySQL Workbench y vi que no utilizan ninguna clave foránea "real". Almacenarán la clave principal de otra tabla como lo haría con un FK pero no lo declaran como uno solo.

Así que viendo cómo su DB está diseñado de la manera que lo haría a través de lo que sé (menos el problema de FK) Me pregunto que tal vez haya una razón detrás de esto. ¿Es este un caso de programación perezosa o podría obtener algunas mejoras de rendimiento haciendo todo el control de errores programáticamente?

En caso de que quiera un ejemplo, básicamente tienen Encuestas y una encuesta tiene una serie de Preguntas. Una pregunta es parte de una encuesta, por lo que mantiene su PK en una columna. Eso es más o menos, pero lo usan en todas partes.

Agradecería cualquier idea :) (Entiendo que esta pregunta podría no tener una respuesta correcta/incorrecta, pero estoy buscando más información sobre por qué lo harían, ya que este sistema ha sido bastante sólido desde entonces empezamos a usarlo así que me hacen creer que estos tipos sabían lo que estaban haciendo)

Respuesta

12

Los desarrolladores originales pueden haber optado por utilizar MyISAM o cualquier otro motor de almacenamiento que no admita restricciones de clave externa.

+0

Eso es exactamente lo que es. Tal vez pueda diseñar algo en papel, pero definitivamente me falta el departamento de práctica. Muchas gracias muchachos :) – Gazillion

+0

Como nota al margen, MySQL ha estado soportando claves foráneas para InnoDB desde la versión 3.23.44. Fuente: http://en.wikipedia.org/wiki/MySQL#Future_releases –

+0

Uso MySQL workbench para crear mi esquema y luego exportar mis declaraciones. Siempre escogeré InnoDB como mi motor de almacenamiento, por lo que no sabía que MyISAM no admitía FK en absoluto. – Gazillion

4

MySQL solo admite la definición de relaciones de claves externas reales en tablas InnoDB, ¿quizás las suyas son MyISAM o alguna otra cosa?

Lo más importante es que las columnas adecuadas tienen índices definidos en ellas (por lo que las que tienen PK de otra tabla deberían estar indexadas). Esto también es posible en MyISAM.

0

No necesita utilizar claves externas.

Si no los tiene, los datos pueden volverse inconsistentes y no podrá usar las eliminaciones y actualizaciones en cascada.

Si los tiene, es posible que pierda algunos de los datos de los usuarios debido a la falla en las instrucciones SQL que ocurre debido a cambios en el esquema.

Algunos prefieren tenerlos, algunos prefieren la vida sin ellos. No hay ventajas reales en ninguno de los casos.

+4

Diría que la coherencia de los datos es una ventaja real. – simon

+0

@simon Estoy de acuerdo – meagar

+0

@simon, no realmente. Lo más probable es que tengas filas adicionales por ahí que no te molestarán mucho, ya que serán invisibles para la mayoría de las consultas. Por otro lado, esas filas ocultas pueden tener cierta información que es crítica para el usuario. – vava

2

En las bases de datos de gran tamaño (del tipo que admite Teradata) se encuentra que no utilizan claves externas. El motivo es el rendimiento. Cada vez que escribe en la base de datos, que a menudo es suficiente en un almacén de datos, tiene la carga adicional de tener que verificar todas las fk en una tabla. Si ya sabes que es cierto, ¿cuál es el punto?

Un buen diseño en un db pequeño solo significa que los pondría, pero hay mejoras de rendimiento al dejarlos fuera.

+0

Gracias. Esto es algo que me preguntaba. Creo que su base de datos tiene un número de tablas lo suficientemente pequeño como para hacer un seguimiento de "FK" sería bastante fácil. – Gazillion

0

Aquí hay una instancia de la vida real en la que no estoy utilizando una clave externa.

Necesitaba una forma de almacenar una relación padre-hijo donde el niño no existe, y el niño es una clase abstracta. Dado que el niño puede ser de algunos tipos, utilizo un campo para nombrar el tipo de niño y un campo para enumerar la identificación del niño. La aplicación maneja la mayor parte de la lógica.

No estoy seguro de si esta fue la mejor decisión de diseño, pero fue lo mejor que pude hacer en la fecha límite. ¡Ha estado funcionando bien hasta ahora!

3

Como puntos generales; Las teclas aceleran las lecturas (si son aplicables a la lectura que está llevando a cabo, ayudan al optimizador) y ralentizan las escrituras (porque agregan sobrecarga a las tablas).

En la gran mayoría de los casos, la mejora de la velocidad para la lectura y el mantenimiento de la integridad referencial supera la sobrecarga menor que agregan a las escrituras.

Esta distinción se ha difuminado por cacheing, mirroring, etc. ya que muchas lecturas en los sitios muy grandes no llegan a la base de datos en vivo, pero esto no es muy relevante a menos que trabaje para Amazon, Twitter o me gusta.

Cuestiones relacionadas