2010-05-19 25 views
8

¿Existe una guía oficial o un umbral para indicar cuándo es una buena práctica utilizar una clave externa en una base de datos MySQL?Cuándo utilizar una clave externa en MySQL

Supongamos que ha creado una tabla para películas. Una forma de hacerlo es integrar los datos de productor y director en la misma tabla. (movieID, movieName, directorName, producerName).

Sin embargo, supongamos que la mayoría de los directores y productores han trabajado en muchas películas. ¿Sería mejor crear otras dos tablas para productores y directores, y usar una clave externa en la mesa de películas?

¿Cuándo se convierte en la mejor práctica hacer esto? Cuando muchos de los directores y productores aparecen varias veces en la columna? ¿O es una buena práctica emplear un enfoque de clave externa al inicio? Si bien parece más eficiente usar una clave externa, también aumenta la complejidad de la base de datos.

Entonces, ¿cuándo vale la pena el intercambio entre la complejidad y la normalización? No estoy seguro de si hay un umbral o una cierta cantidad de repeticiones de celda que hace que sea más sensato usar una clave externa.

Estoy pensando en una base de datos que será utilizada por cientos de usuarios, muchos al mismo tiempo.

¡Muchas gracias!

Respuesta

11

hay algunas pautas oficiales para esto. se llaman formularios normales, y la práctica de poner su base de datos en ellos se llama normalización: http://en.wikipedia.org/wiki/Database_normalization

si toma una clase de db en la universidad, probablemente le enseñen 3nf o bcnf. Siempre he encontrado que esos enfoques son un poco duros, pero tengo suficiente experiencia en diseño de db que encuentro que estas preguntas son básicamente intuitivas en este punto ...

en su ejemplo, definitivamente desea usar restricciones de clave externa. una relación de muchos a uno se expresa mejor de esa manera. Hará que la selección de películas sea un poco más lenta, porque tendrá que unirse en la tabla de "personas" y en la de "películas", posiblemente muchas uniones dependiendo de cuántos campos de "personas" tenga la tabla de películas.

pero la ventaja es que puede administrar fácilmente a las personas. si desea cambiar la ortografía del nombre de una persona, no tiene que escanear toda la tabla buscando a esa persona en cada campo. puede evitar tener a la misma persona en el DB varias veces con ligeras diferencias en la ortografía. puede establecer acciones para tomar si una persona es eliminada. puede contar fácilmente cuántos roles diferentes ha tenido una persona.

no olvide, si desea utilizar claves externas, debe hacer que sus tablas innodb en mysql.

+1

Buena publicación. Sin embargo, para que quede claro, puede implementar claves externas en MyISAM. Simplemente no serán ejecutados ***. – webbiedave

4

Supongamos que ha creado una tabla para películas. Una forma de hacerlo es integrar los datos del productor y del director en la misma tabla. (movieID, movieName, directorName, producerName).

Eso está demasiado sin normalizar. Estás repitiendo datos.

Sin embargo, supongamos que la mayoría de los directores y productores de han trabajado en muchas películas. ¿Sería mejor crear otras dos tablas para productores y directores, y usar una clave externa en la tabla de la película ?

Supongamos también que una persona puede trabajar en una película como productor y la siguiente como director. ¡Una sola persona también podría ser acreditada como director, productor, escritor y actor en una sola película!

¿Cuándo se convierte en la mejor práctica para hacer esto? Cuando muchos de los directores y productores aparecen varias veces en la columna? ¿O es la mejor práctica de emplear un enfoque de clave foránea al inicio? Aunque parece más eficiente usar una clave externa, , también aumenta la complejidad de la base de datos .

Deseará dominar claves externas, relaciones (especialmente de 1 a muchos y de muchas a muchas) y formularios normales desde el principio. Se convertirán en una segunda naturaleza en poco tiempo.

Cuestiones relacionadas