Arhn - архитектура программирования

Действительно ли внешние ключи необходимы при проектировании базы данных?

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

Есть ли другие способы использования внешних ключей? Я что-то упустил?


  • Это часто случается здесь. Я виню Джоэла Спольски :-). Здесь есть много хороших ответов; вместо того, чтобы повторно набирать свой, я просто дам вам ссылку: stackoverflow.com/questions/83147/whats-wrong-with-foreign-keys 19.04.2009
  • Предположим, что программист уже делает это правильно - я даже не могу представить себе такой сценарий. 19.04.2009
  • Внешний ключ - это идея, а не технология. Это реляционное правило. На самом деле ваш вопрос заключается в том, следует ли вам пытаться применить правило в своем коде или позволить базе данных помочь вам. Когда задействован параллелизм, лучше всего позволить ядру базы данных применять правило, поскольку он знает ВСЕ, что происходит в базе данных, в то время как ваш код не может знать. 25.08.2009
  • @Triynko, понятие внешних ключей не является реляционным правилом. 08.02.2010
  • @Triynko - Чтобы расширить сказанное, внешние ключи - это не правило отношения, это правило отношения. 13.02.2010
  • @lubos и cdeszaq. На самом деле, это реляционное правило ... это подмножество правила 10 Двенадцати заповедей Кодда ... Независимость целостности, которое в основном гласит, что реляционная целостность СУБД должна поддерживаться независимо от любого приложения, которое обращается к ней, что именно то, что я объяснял простым для понимания способом. Это правило реализуется, среди прочего, ограничениями внешнего ключа. Итак, да, идея внешнего ключа - это реляционное правило. 25.02.2010
  • @Triynko, мне решать, хочу ли я иметь ссылочную целостность между двумя отношениями или нет. Нигде не написано, что если у меня есть отношения «Клиенты» и «Счета-фактуры», я также должен иметь и поддерживать ссылочную целостность между ними. Я думаю, мы оба согласны с тем, что обеспечение ссылочной целостности там, где это применимо, - хорошая идея, но это просто хорошая идея, а не требование реляционной модели. 25.02.2010
  • @lubos: Чтобы уточнить, вы говорите о том, собираетесь ли вы использовать определенную функцию, но я говорю о том, необходимо ли присутствие этой функции для создания полной, полнофункциональной СУБД. Реляционные ограничения, если и когда вы решите их использовать, должны быть реализованы в РСУБД (а не в приложении), поэтому это функция, которая должна быть там, и в этом смысле это требование реляционной модели, если вы собираетесь разработать полную СУБД. 01.03.2010
  • Внешний ключ похож на удаленный первичный ключ. Когда у вас есть две связанные таблицы, внешний ключ связывает данные из отдельной таблицы, которая в противном случае была бы включена (избыточно) в исходную таблицу. Реляционная модель служит для устранения избыточности путем разделения данных на связанные таблицы, поэтому внешние ключи имеют фундаментальное значение для реляционной модели. ИМО, если отношение существует, то оно ДОЛЖНО быть реализовано. Если вы решите не применять такое отношение, то IMO ваша база данных отстой :), не поддерживает полную запись событий и может в конечном итоге нанести ущерб вашему приложению с нулевыми значениями. 01.03.2010
  • @Triynko, пожалуйста, не говорите "отношения", если вы имеете в виду отношения. это сбивает с толку, потому что в реляционной модели отношение - это набор кортежей, которые имеют один и тот же тип, а не отношение. также, когда вы говорите об устранении избыточности, вы не говорите о реляционной модели, вы говорите о нормализации базы данных или 3NF. реляционная модель должна соответствовать минимальному набору правил, определенных в 1NF. ссылочная целостность, внешние ключи, устранение избыточности не являются правилами 1NF, следовательно, они не являются правилами выполнения требований реляционной модели. надеюсь, теперь это имеет смысл. 02.03.2010
  • @lubos: Отношения и отношения - это одно и то же. Что вам нужно понять, так это то, что отношение ограничивает два непересекающихся отношения (таблицы) одним логическим отношением. Другими словами, отношение включает два отношения, которые при правильном ограничении логически эквивалентны одному отношению. Когда вы пишете запрос JOIN, результатом является одно отношение (таблица). Вы имеете в виду, что «реляционная модель» описывает базовую электронную таблицу, и я полностью с этим не согласен. 03.03.2010
  • Из Википедии «Реляционная модель»: реляционная модель данных позволяет разработчику базы данных создавать согласованное, логическое представление информации. Согласованность достигается за счет включения объявленных ограничений в проект базы данных, который обычно называют логической схемой. Теория включает процесс нормализации базы данных, посредством которого проект с определенными желаемыми свойствами может быть выбран из набора логически эквивалентных альтернатив. 03.03.2010
  • ... продолжение: Согласованность реляционной базы данных обеспечивается не правилами, встроенными в приложения, которые ее используют, а скорее ограничениями, объявленными как часть логической схемы и обеспечиваемыми СУБД для всех приложений. В общем, ограничения выражаются с помощью операторов сравнения отношений, из которых только один является подмножеством (⊆), что теоретически достаточно. На практике ожидается, что будет доступно несколько полезных сокращений, наиболее важными из которых являются кандидатный ключ (на самом деле суперключ) и ограничения внешнего ключа. 03.03.2010
  • Позвольте мне перефразировать То, что вы имеете в виду, это ... к следующему (поскольку редактирование кажется отключенным): То, что вы подразумеваете, это то, что «реляционная модель» не включает в себя идеи, связанные с поддержанием целостности отношение, когда оно физически не пересекается для целей нормализации, но я думаю, что оно охватывает это. 03.03.2010
  • Обратите внимание, что правила Кодда не требуют, чтобы ограничения ссылочной целостности поддерживались СУБД. Правило 10 просто указывает, что ограничения целостности должны применяться независимо - оно не говорит, какого типа ограничения они должны быть. В любом случае правила не предназначены и никогда не предназначались для определения реляционной модели. Ясно, что база данных может быть реляционной, не имея в ней единственного ограничения RI, а СУБД может даже не поддерживать RI (просто у нее, вероятно, не будет слишком много желающих клиентов). 31.03.2011

Ответы:


1

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

20.08.2008
  • Если вам нужен индекс, создающий его, это не должно быть основной причиной для FK. (Фактически, при определенных обстоятельствах (например, больше вставок, чем выборок) поддержание FK может быть медленнее.) 21.03.2010
  • Ужасный ответ. FK вообще могут добавить дополнительные накладные расходы, но не улучшить производительность. 13.02.2015
  • В SQL-Server они по умолчанию не индексируются ни для рефери, ни для реферера. sqlskills .com / blogs / kimberly /. 27.06.2016
  • Ни в Oracle; вы должны сами создать индексы (по столбцам FK). 10.02.2018

  • 2

    Внешние ключи также могут помочь программисту писать меньше кода, используя такие вещи, как ON DELETE CASCADE. Это означает, что если у вас есть одна таблица, содержащая пользователей, а другая - заказы или что-то в этом роде, то удаление пользователя может автоматически удалить все заказы, которые указывают на этого пользователя.

    20.08.2008
  • @Greg Hewgill Это может потенциально привести к множеству проблем. Вы должны быть очень осторожны с такими мыслями, как DELETE CASCADE, поскольку во многих случаях вы захотите сохранить заказы, созданные пользователем при удалении пользователя. 21.08.2008
  • Хотя это, вероятно, следует обрабатывать на уровне бизнес-логики. Решение о том, следует ли хранить связанные дочерние записи, не совсем то же самое, что гарантировать, что никакие значения не нарушают отношения внешнего ключа. 07.10.2008
  • Другая проблема - это аудит. Если аудит не выполняется на уровне базы данных, каскадные обновления или удаления сделают ваш контрольный журнал недействительным. 01.09.2009
  • @Codewerks: Бизнес-логика может быть в БД. 01.02.2011

  • 3

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

    Строго говоря, они не обязательны, но преимущества огромны.

    Я почти уверен, что FogBugz не имеет ограничений внешнего ключа в базе данных. Мне было бы интересно услышать, как команда Fog Creek Software структурирует свой код, чтобы гарантировать, что они никогда не вносите несоответствия.

    20.08.2008
  • Джоэл: Пока у нас никогда не было проблем. Пока что ни разу не заехал в фонарный столб. Но я все же считаю, что пристегивать ремни безопасности - хорошая идея ;-) 04.11.2008
  • Может быть, вы никогда не ВИДИЛИ проблему, но, возможно, она есть ... Большинство баз данных используют соглашение, такое как id_xxx, которое точно такое же, как ixXXX 06.02.2009
  • @Joel: Соглашения об именах вместо соблюдения правил? Можно также покончить с шрифтом, пока вы занимаетесь этим. 18.09.2009
  • @Eric: Вы называете Fog Creek своего рода аватаром разработчиков программного обеспечения. Если бы вы сказали, что у компании в Нью-Йорке нет внешних ключей в своей базе данных ... мы бы все сказали А? 18.09.2009
  • @jcollum, я сделал этот комментарий во время бета-тестирования Stack Overflow, когда почти все здесь знали, кто такие Джефф и Джоэл, и большинство из них, вероятно, слушали подкаст, поэтому Fog Creek был на всех радарах. 18.09.2009
  • @jcollum: некоторые сказали бы А? в то время как другие сказали бы WTF? (Я только что сделал), но я думаю, что есть несколько способов очистить зуб. Кстати, хорошее использование аватара. :) 01.05.2010
  • Эрик: FogBugz использует соглашение об именах для внешних ключей. Например, ixBug понимается как индекс первичного ключа таблицы Bug. Пока у нас никогда не было проблем. - Джоэл Спольски 13.02.2012
  • Пока у нас никогда не было проблем. - Исправление: у вас никогда не было проблемы, о которой ВЫ ЗНАЕТЕ - это еще одна веская причина позволить вашим инструментам помочь вам. 25.02.2013
  • Что касается фактического вопроса Эрика, я понимаю, что программное обеспечение Fog Creek размещается на серверах, контролируемых Fog Creek, а не программное обеспечение для упаковки в термоусадочную пленку, выпущенное на рынок. Это означает, что они могут гарантировать, что их база данных управляется только через их прикладное программное обеспечение. В этом контексте я предполагаю, что существует объектная модель, налагающая ограничения. 11.06.2013
  • многие БД форумов не используют внешний ключ, такой как xenforo, phpbb ... или даже wordpress. использование fk вызывает проблемы с производительностью. многие из них предпочитают обрабатывать сиротские строки вручную. 03.12.2019

  • 4

    Схема базы данных без ограничений FK похожа на вождение без ремня безопасности.

    Однажды ты пожалеешь об этом. Не тратить лишнее время на основы дизайна и целостность данных - верный способ избавиться от головной боли в будущем.

    Вы бы приняли такой небрежный код в своем приложении? Это напрямую обращалось к объектам-членам и напрямую изменяло структуры данных.

    Как вы думаете, почему это стало жестким и даже неприемлемым в современных языках?

    20.08.2008
  • +1 для хорошей аналогии между инкапсуляцией и отношениями FK / PK. 18.09.2009

  • 5

    да.

    1. Они сохраняют честность
    2. Они сохраняют честность новых разработчиков
    3. Вы можете сделать ON DELETE CASCADE
    4. Они помогают вам создавать красивые диаграммы, которые сами объясняют связи между таблицами.
    20.08.2008
  • что вы имеете в виду под честностью? 06.09.2015
  • Я думаю, честно с концепцией. Это предохраняет вас от обмана данных, выполняя быстрое и неубедительное программирование. 09.01.2017

  • 6

    Предположим, что программист уже делает это правильно.

    Такое предположение кажется мне крайне плохой идеей; в общем софт феноменально глючный.

    И в этом-то и дело. Разработчики не могут все сделать правильно, поэтому обеспечение того, чтобы база данных не была заполнена плохими данными, - это хорошо.

    Хотя в идеальном мире естественные объединения будут использовать отношения (то есть ограничения FK), а не сопоставление имен столбцов. Это сделало бы FK еще более полезными.

    20.08.2008
  • Хороший момент, было бы неплохо объединить две таблицы с помощью ON [Relationship] или другого ключевого слова, и позволить базе данных выяснить, какие столбцы задействованы. На самом деле кажется довольно разумным. 18.09.2009

  • 7

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

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

    @John - другие базы данных могут автоматически создавать индексы для внешних ключей, но SQL Server этого не делает. В SQL Server отношения внешнего ключа - это только ограничения. Вы должны определить свой индекс для внешних ключей отдельно (что может быть полезно).

    Изменить: я хотел бы добавить, что, IMO, использование внешних ключей для поддержки ON DELETE или ON UPDATE CASCADE не обязательно хорошо. На практике я обнаружил, что каскад при удалении следует тщательно рассматривать на основе взаимосвязи данных - например, у вас есть естественный родитель-потомок, где это может быть нормально, или связанная таблица является набором значений поиска. Использование каскадных обновлений подразумевает, что вы разрешаете изменять первичный ключ одной таблицы. В этом случае у меня есть общие философские разногласия в том, что первичный ключ таблицы не должен изменяться. Ключи должны быть неизменными по своей сути.

    20.08.2008

    8

    Без внешнего ключа, как узнать, что две записи в разных таблицах связаны?

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

    20.08.2008

    9

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

    22.08.2008
  • Преимущество - производительность. Я не говорю, что у вас не должно быть ФК, просто отвечая на ваш вопрос строго. Предположим, у вас есть огромная (100 ГБ) таблица с FK для другой таблицы. Если вы удалите запись из другой таблицы - движок просканирует всю таблицу размером 100 ГБ, чтобы убедиться, что вы не удаляете ничего полезного. Если у вас нет проиндексированного столбца FK (FK не индексируются по умолчанию в SQL Server) 26.06.2021
  • Я не эксперт по базам данных, но не думаю, что вы должны таким образом решать проблемы с производительностью. Как вы сказали, вы можете проиндексировать столбец FK (что вы довольно быстро поймете, что SQL не работает по умолчанию), и вы хотите, чтобы база данных обеспечивала, чтобы удаляемая запись не использовалась в ваших 100 ГБ Таблица. 28.06.2021
  • Я (в основном) согласен. Просто хотел упомянуть, что когда вы управляете базами данных размером в десятки терабайт, отбрасывание FK является негласной распространенной практикой среди администраторов баз данных. По сути, в этом масштабе вы переходите в страну NoSQL, где вам нужно исключить один из A, C, I или D из принципа ACID. 28.06.2021

  • 10

    FK очень важны и всегда должны присутствовать в вашей схеме, , если вы не eBay.

    19.04.2009
  • эта ссылка на самом деле чрезвычайно увлекательна ... я действительно хотел бы узнать больше, и мне немного страшно использовать ebay сейчас. для других: нажмите на 4-й вопрос, чтобы узнать, что он говорит об их структуре БД. Хотя все интервью стоит посмотреть. также ... unibrow 23.08.2013

  • 11

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

    Предположим, что программист уже делает это правильно, тогда действительно ли нам нужна концепция внешних ключей?

    Теоретически нет. Однако никогда не было программного обеспечения без ошибок.

    Ошибки в коде приложения обычно не так опасны - вы определяете ошибку и исправляете ее, и после этого приложение снова работает без сбоев. Но если ошибка позволяет обработанным данным попасть в базу данных, значит, вы застряли с ней! Восстановить поврежденные данные в базе данных очень сложно.

    Подумайте, не позволила ли незаметная ошибка в FogBugz записать поврежденный внешний ключ в базу данных. Исправить ошибку и быстро отправить исправление клиентам в выпуске исправления может оказаться несложным. Однако как исправить поврежденные данные в десятках баз данных? Правильный код теперь может внезапно сломаться, потому что предположения о целостности внешних ключей больше не выполняются.

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

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

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

    17.09.2008

    12

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

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

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

    На этом этапе действительно необходимы внешние ключи, поскольку они позволяют снова перенести ответственность на одну точку.

    20.08.2008
  • Это как лук. ФК - последний уровень защиты. Если это не встроенная локальная база данных, приложения, пытающиеся обеспечить ссылочную целостность, всегда являются плохой идеей. 04.10.2013

  • 13

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

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

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

    17.09.2008

    14

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

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

    Предположим, что программист уже делает это правильно, тогда действительно ли нам нужна концепция внешних ключей?

    Программисты смертны и подвержены ошибкам. FK являются декларативными, поэтому их сложнее испортить.

    Есть ли другие способы использования внешних ключей? Я что-то упустил?

    Хотя они были созданы не для этого, FK обеспечивают надежные подсказки для инструментов построения диаграмм и построителей запросов. Это передается конечным пользователям, которым отчаянно нужны надежные подсказки.

    06.10.2008

    15

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

    Намного приятнее отладить ошибку ограничения FK, чем восстанавливать удаление, которое сломало ваше приложение.

    20.08.2008

    16

    Они важны, потому что ваше приложение - не единственный способ манипулировать данными в базе данных. Ваше приложение может обрабатывать ссылочную целостность так честно, как оно того хочет, но все, что для этого требуется, - это один бозо с нужными привилегиями, чтобы подойти и выдать команду вставки, удаления или обновления на уровне базы данных, и все ваше приложение может обойти ссылочную целостность. Включение ограничений FK на уровне базы данных означает, что, если этот бозо не выбирает отключение ограничения FK перед выдачей своей команды, ограничение FK приведет к сбою неправильного оператора вставки / обновления / удаления с нарушением ссылочной целостности.

    17.09.2008

    17

    Я думаю об этом с точки зрения затрат / выгод ... В MySQL добавление ограничения является одна дополнительная строка DDL. Это всего лишь несколько ключевых слов и пара секунд размышлений. На мой взгляд, это единственная «цена» ...

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

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

    Вопрос:

    Есть ли другие способы использования внешних ключей? Я что-то упустил?

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

    21.08.2008

    18

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

    Когда мы делаем предположение, например: у каждого заказа есть покупатель, это предположение должно подкрепляться чем-то. В базах данных этим «чем-то» являются внешние ключи.

    Я думаю, что это стоит компромисса в скорости разработки. Конечно, вы можете быстрее писать код без них, и, вероятно, поэтому некоторые люди их не используют. Лично я убил несколько часов с помощью NHibernate и некоторого ограничения внешнего ключа, которое раздражает, когда я выполнить некоторую операцию. ОДНАКО, я знаю, в чем проблема, поэтому это не проблема. Я использую обычные инструменты, и есть ресурсы, которые помогут мне обойти эту проблему, возможно, даже люди, которые могут помочь!

    Альтернативный вариант - позволить ошибке проникнуть в систему (и, если у вас будет достаточно времени, это произойдет), когда внешний ключ не установлен, и ваши данные станут несовместимыми. Затем вы получите необычный отчет об ошибке, исследуйте и «ОН». База данных прикручена. Теперь, сколько времени уйдет на то, чтобы это исправить?

    01.12.2009

    19

    Вы можете рассматривать внешние ключи как ограничение, которое,

    • Помогите сохранить целостность данных
    • Покажите, как данные связаны друг с другом (что может помочь в обеспечении соблюдения бизнес-логики и правил)
    • При правильном использовании может помочь повысить эффективность извлечения данных из таблиц.
    20.08.2008

    20

    В настоящее время мы не используем внешние ключи. И по большей части мы не жалеем об этом.

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

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

    2. Поддержка инструмента. Намного проще создавать модели данных с помощью Visual Studio 2008, который можно использовать для LINQ to SQL, если есть правильные отношения внешнего ключа.

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

    20.08.2008
  • Я работаю над системами, которые их не используют. И я регулярно жалею об этом. Я видел больше случаев, когда я могу сосчитать бессмысленные данные, которые можно было бы предотвратить с помощью соответствующих ограничений. 19.04.2009
  • И, работая с внешними ключами над нашим текущим проектом почти шесть месяцев, я полностью согласен с этим комментарием. 20.04.2009

  • 21

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

    В коде мы обычно просто получаем исключение, но в SQL мы ' Я обычно получаю "неправильные" ответы.

    Теоретически SQL Server может использовать ограничения как часть плана запроса, но за исключением проверочных ограничений. Что касается разделения, я не могу сказать, что когда-либо был свидетелем этого.

    20.08.2008
  • Ограничения уникальности указывают на высокую мощность, которая используется оптимизатором при выборе механизма соединения. 23.12.2009

  • 22

    Внешние ключи никогда не были явными (таблица FOREIGN KEY REFERENCES (столбец)), объявленными в проектах (бизнес-приложения и веб-сайты социальных сетей), над которыми я работал.

    Но всегда существовало некое соглашение об именах столбцов, которые были внешними ключами.

    Это похоже на нормализацию базы данных - вы должны знать, что вы делаете и каковы последствия что (в основном производительность).

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

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

    Удаление всех заказов и счетов-фактур удаленного клиента с помощью ON DELETE CASCADE - прекрасный пример красивой, но неправильно спроектированной схемы базы данных.

    21.08.2008

    23

    да. ON DELETE [RESTRICT | CASCADE] не позволяет разработчикам связывать данные, сохраняя их в чистоте. Недавно я присоединился к команде разработчиков Rails, которые не уделяли внимания ограничениям базы данных, таким как внешние ключи.

    К счастью, я нашел это: http://www.redhillonrails.org/foreign_key_associations.html - - Плагины RedHill on Ruby on Rails генерируют внешние ключи, используя соглашение по стилю конфигурации. При миграции с product_id будет создан внешний ключ для id в таблице products.

    Ознакомьтесь с другими замечательными надстройками на RedHill, включая миграции, заключенные в транзакции.

    17.09.2008

    24

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

    05.02.2020
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..