Pregunta

En la siguiente estructura de tabla:

Fruits 
(
    fruit_id,
    fruitName
)


Vegetables
(
    vegetable_id,
    vegetableName
)

favoriteFoods 
(
     food_id,
     foodName,
     type_id (References either a fruit or a vegetable)
)

Me doy cuenta de que podría renunciar al uso de una restricción de clave externa en la tabla favoriteFoods y luego simplemente agregar un campo de tipo a la tabla favoriteFoods para diferenciar entre frutas y verduras. Pero, ¿cómo estructuraría las tablas para poder crear las restricciones de clave externa necesarias?

¿Fue útil?

Solución

Solo usaría 2 tablas en su lugar. En lugar de tener una mesa separada de Frutas y Verduras, ¿por qué no tener una mesa de Alimentos? Luego, tenga una restricción de clave externa en fkfood_id a food_id. Entonces, si por alguna razón tiene que agregar carne, sería mucho más fácil mantener la aplicación que usa esto.

Food
    (
    food_id,
    foodName,
    foodType
    )

favoriteFoods
    (
    favoritefood_id,
    fkfood_id
    )

Otros consejos

Depende de lo que va a hacer con los datos.

Si por alguna razón la normalización es importante para usted, lo siguiente funciona bastante bien.

Fruits (    
     fruit_id,
     food_id references favoritefoods.food_id,
     fruitName)
Vegetables(
     vegetable_id,
     food_id references favoritefoods.food_id,
     vegetableName)
favoriteFoods (
     food_id,
     foodName)

La tabla de alimentos favoritos no necesita " saber " qué tipo de comida es, si la hay. Cada fruta y cada verdura está vinculada a la comida favorita correspondiente.

Si desea seleccionar todas las frutas de favoriteFoods, solo únase a la tabla de frutas y la tabla de favoritos. Incluso podría incluir un tomate como una verdura y una fruta, si eso le apetece.

Lo anterior se basa en el supuesto de que las uniones son baratas. En muchas situaciones, las uniones son realmente baratas. Compruébalo antes de modificar tu diseño para evitar uniones.

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