Как структурировать таблицу для моделирования взаимоисключающих отношений 1: n? - PullRequest
1 голос
/ 05 ноября 2008

В следующей структуре таблицы:

Fruits 
(
    fruit_id,
    fruitName
)


Vegetables
(
    vegetable_id,
    vegetableName
)

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

Я понимаю, что могу отказаться от использования ограничения внешнего ключа в таблице favourites, а затем просто добавить поле типа в таблицу favourful, чтобы различать фрукты и овощи. Но как бы вы структурировали таблицы так, чтобы вы могли фактически создать необходимые ограничения внешнего ключа?

Ответы [ 2 ]

4 голосов
/ 05 ноября 2008

Я бы использовал только 2 таблицы. Вместо того, чтобы иметь отдельный стол с фруктами и овощами, почему бы не иметь стол с едой. Затем установите ограничение внешнего ключа для fkfood_id на food_id. Тогда, если по какой-то причине вам когда-нибудь придется добавить мясо, было бы намного проще поддерживать приложение, которое использует это.

Food
    (
    food_id,
    foodName,
    foodType
    )

favoriteFoods
    (
    favoritefood_id,
    fkfood_id
    )
0 голосов
/ 05 ноября 2008

Это зависит от того, что вы собираетесь делать с данными.

Если по какой-то причине нормализация важна для вас, то следующее работает довольно хорошо.

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

Таблице любимых продуктов не нужно «знать», что это за еда, если таковая имеется. Каждый фрукт и каждый овощ связан с соответствующей любимой пищей.

Если вы хотите выбрать все фрукты из любимых продуктов, просто присоединитесь к таблице фруктов и таблице любимых продуктов. Вы можете даже включить помидор в качестве овоща и фрукта, если это подходит вам по вкусу.

Вышеизложенное основано на предположении, что объединения дешевы. Во многих ситуациях объединения действительно дешевы. Проверьте это, прежде чем изменить свой дизайн, чтобы избежать объединений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...