Внешние ключи. Что они делают для меня?

Я создаю небольшое приложение и настраиваю внешние отношения между таблицами. Однако я в замешательстве относительно ПОЧЕМУ я действительно нуждаюсь в этом? В чем преимущество – помогает ли мне при написании моих запросов, что мне не нужно выполнять какие-либо объединения? Вот пример фрагмента моей базы данных:

+-------------------+ | USERS | +-------------------+ | user_id | | username | | create_date | +-------------------+ +-------------------+ | PROJECTS | +-------------------+ | project_id | | creator | | name | | description | +-------------------+ 

Между пользователями существует ключевая взаимосвязь. user_id и projects . creator

Смогу ли я выполнить такой запрос?

SELECT * FROM PROJECTS WHERE USERS.username = "a real user";

Поскольку MySQL должен знать взаимосвязь между таблицами? Если нет, то какова реальная функция внешних ключей в дизайне базы данных?

    Внешние ключи обеспечивают ссылочную целостность. Данные в столбце внешнего ключа проверяются – значение может быть только тем, которое уже существует в таблице и столбце, заданном внешним ключом. Это очень эффективно при остановке «плохих данных» – кто-то не может ввести то, что им нужно – цифры, текст ASCII и т. Д. Это означает, что данные нормализованы – повторяющиеся значения были идентифицированы и изолированы от их собственной таблицы, поэтому больше нет проблем о работе с чувствительностью к регистру в тексте … и значения согласуются. Это приводит к следующей части – внешние ключи – это то, что вы используете для объединения таблиц вместе.

    Ваш запрос для проектов, которые пользователь не будет работать, – вы ссылаетесь на столбец из таблицы USERS когда в запросе нет ссылки на таблицу, и нет никакого подзапроса, используемого для получения этой информации, прежде чем связывать ее с таблицей PROJECTS , То, что вы действительно используете:

     SELECT p.* FROM PROJECTS p JOIN USERS u ON u.user_id = p.creator WHERE u.username = 'John Smith' 

    В принципе, они не дадут вам больше функциональности. Они останавливают любые вставки или обновления, нарушающие ссылочную целостность вашей модели данных.

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

    Если вы никогда не присоединяетесь, вам не нужны внешние ключи.

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

    Как говорили предыдущие респонденты, внешние ключи обеспечивают ссылочную целостность. Без ссылочной целостности объединения создают таинственные результаты.


    В моем предыдущем ответе не было ответа на реальный вопрос, стоящий за вопросом. Вопрос, на который я ответил, «почему существуют внешние ключи в схемах SQL», и ответ «для того, чтобы делать объединения». Но, перечитывая вопрос, я понимаю гораздо более тонкий вопрос, который «почему SQL не может присоединиться ко мне, если он знает связи». Это действительно хороший вопрос. Он заслуживает лучшего ответа, чем выше.

    Язык, в котором двигатель обеспечивает условия соединения, возможен. Нужно только взглянуть на инструмент разработки графического запроса в Microsoft Access. После того, как все объявленные отношения Intertable объявили Access, можно извлечь данные из нескольких таблиц, не указав условия соединения снова и снова. Доступ показывает их автоматически.

    Если вы создадите двухзадачный запрос в Access и затем переключитесь на представление SQL, вы увидите, что Access фактически создал соединение с условием объединения. Такая возможность возможна и на языках, основанных на символах, но SQL не является таким языком.

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

    Использование ограничения внешнего ключа может обеспечить следующее:

    • Запретить базу данных, содержащую несогласованные данные, путем предотвращения несогласованных ключей
    • Запретить базу данных, содержащую несогласованные данные, автоматически удаляя оси сирот (с помощью DEL DELETE CASCADE)
    • Подавать документы будущим разработчикам, колонка которых является внешним ключом, к которому

    Конечно, не обязательно делать какие-либо из этих действий, но с течением времени улучшать качество кода. Быть строгим относительно вещи, как правило, хорошо – это приводит к большему количеству ошибок при тестировании (и, следовательно, меньше в производстве)

    Если каждый пользователь принадлежит к одному проекту, и каждый проект принадлежит исключительно одному пользователю, тогда говорят, что таблицы имеют отношение один к одному и имеют ключевое соотношение между users.user_id и projects.project_id в порядке (хотя, вероятно, не стандартном) ,

    Однако, если пользователь может принадлежать многим проектам (или у проекта может быть много пользователей), тогда у вас есть отношения от одного до многих, и вам нужен внешний ключ.

    Если в проектах может быть много пользователей и пользователей, которые могут принадлежать многим проектам, тогда у вас есть много разных отношений, и вам нужна более сложная модель.