2010-08-25 1 views
0

Если я использую естественные объединения, чем используется первичный ключ и внешний ключ?Могу ли я использовать естественные соединения вместо первичного ключа и внешнего ключа?

+1

Раньше я не знал этого «естественного соединения», но это не кажется хорошей идеей при написании запросов UNLESS (или даже если?) У вас есть сильные соглашения об именах, чтобы избежать столкновения имен столбцов, например. соединение между 'employee (ID, name, dept_id)' и 'department (ID, name, manager_id)' не будет работать вообще, как ожидалось ... – pascal

ответ

3

Первичные ключи и внешние ключи являются типами баз данных Ограничение: их цель - обеспечить целостность данных, а не упрощать объединение.

Основной ключ: не должно быть более одной строки с одинаковым значением для столбцов первичного ключа.

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

1

Не уверен, что вы просите. Соединения делают что-то другое с PKs/FKs - и они явно не заменяют друг друга. ПК и ФК реализуют ограничения для обеспечения правильности данных. Соединения - это тип операции запроса.

1

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

ПК и Fks для обеспечения целостности данных, было бы крайне плохой идеей удалить их независимо от того, используете ли вы естественные соединения или нет. Базы данных без надлежащих PKS и FK практически всегда содержат плохие данные.

+0

Природные объединения - это * хорошая * идея, пока вы указываете, какие столбцы должны быть включены из соединяемых таблиц. Если вы это сделаете, то поведение естественного соединения вполне предсказуемо и «безопасно». К сожалению, синтаксис SQL для выбора столбцов * до * делает объединение немного подробным (требуется подзапрос производной таблицы). Таким образом, это настоящая причина, по которой большинство людей склонны избегать естественных объединений, даже если SQL поддерживает их, потому что для этого требуется больше кода. – sqlvogel

+0

В целом, это небезопасно! Просто добавьте один столбец, и его можно будет выбрать для соединения, потому что его имя совпадает с столбцом из другой таблицы, поэтому соединение теперь «неправильно». Называть его безопасным более или менее похоже на то, что «SELECT * FROM mytable» безопасен ... да, до тех пор, пока никто не добавляет столбец и не меняет порядок столбцов ... – pascal

 Смежные вопросы

  • Нет связанных вопросов^_^