Pregunta

Si tengo tres tablas:

music_genres
-----------
music_type_id
genres
[other unique fields]

minerals
--------
mineral_id
mineral
[other unique fields]

verbs
-----
verb_id
verbs
[other unique fields]

y éstos se rellenan con:

rock
jazz
funk
punk

rock
boulder
stone
shale

rock
wobble
shake
vibrate

Ahora vamos a decir que estaba mostrando una página web para cada uno de estos elementos, cada uno usando una plantilla separada, y se almacena esta información en la tabla siguiente:

pages
-----
page_id
page_url
template_url
foreign_key_id

con datos tales como:

/page/music-genres/rock/
/music-genres-template.html
1

/page/verbs/rock/
/verb-template.html
1

/page/minerals/rock/
/mineral-template.html
1

/page/minerals/rock/images/
/mineral-images-template.html
1

Las plantillas se sabe que la clave externa se refiere a la tabla relacionada específica, por lo que la plantilla de mineral con conocimientos para consultar la tabla minerales para otros campos de esa tabla. Sin embargo, no tengo ninguna integridad referencial. Si el rock se elimina de la tabla minerales, no puedo usar eliminaciones en cascada para eliminar filas de las páginas, como claves externas no son únicos. Puedo pensar en muchas maneras de evitar esto de manera poco elegante:

  • Emulación de eliminaciones en cascada con disparadores
  • Almacenamiento del tipo de elemento de Cada fila de la music_types, minerales y verbos tablas, y el uso de este un una clave externa adicional
  • Almacenamiento del nombre de la tabla correspondiente en las páginas tabla
  • Mantener la integridad de la base de datos con PHP, etc.

Estoy pensando que debe haber una mejor manera de cualquiera de almacenar mis datos o el mantenimiento de la integridad de la base de datos. ¿Alguna idea?

¿Fue útil?

Solución

Creo que su problema reside aquí

  

Las plantillas sabrán que la una   clave externa se refiere a la específica   tabla relacionada,

Eso es conocimiento que no se almacena en cualquier parte de la base de datos.

Veo dos formas de salir de ella:

  1. Teniendo en cuenta que en realidad está creando tablas separadas para cada tipo de 'cosa', usted debe tener una columna differente para cada tipo de cosa que hace referencia a la tabla correspondiente en la tabla de páginas, el establecimiento de todas las columnas a nula, excepto uno ( esto podría ser aplicada a través de una restricción)

  2. Tener una mesa 'master cosas' con un identificador único que a su vez las páginas podrían hacer referencia, que tiene tanto una columna para identificar el tipo, y un puntero que la columna con el resto de los datos únicos, que se almacena en una tabla diferente.

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