"Я не вижу реального использования внешних ключей и, следовательно, никакого реального использования для реляционных баз данных"
Судя по этому замечанию, вы, кажется, недооцениваете, для чего нужна реляционная база данных.Ограничения внешнего ключа не являются определяющей особенностью реляционных баз данных и, конечно, не являются причиной только использования таких баз данных.Модель реляционной базы данных является мощным и эффективным способом представления данных, и он остается таковым, даже если вы решите, что не хотите реализовывать ограничение внешнего ключа.Поэтому я предполагаю, что вопрос, который вы действительно хотели задать, заключается в следующем: почему внешние ключи полезны в реляционных базах данных?
Ограничение внешнего ключа - это всего лишь один вид ограничения целостности данных.Конечно, вы можете реализовать правила целостности вне базы данных, но СУБД спроектирована и оптимизирована, чтобы выполнять эту работу за вас, и, как правило, является наиболее эффективным местом для ее выполнения, поскольку она наиболее близка к структурам данных.Если бы вы сделали это за пределами базы данных, у вас была бы как минимум дополнительная поездка туда и обратно для получения необходимых данных.Вам также придется реплицировать модель блокировки / параллелизма СУБД в коде вашего приложения.
Оптимизатор базы данных может использовать ограничения в базе данных для повышения производительности запросов.Это невозможно, если правила существуют только в коде вашего приложения.
Если у вас много приложений, совместно использующих одну и ту же базу данных, то внедрение правил целостности данных в каждом приложении нецелесообразно и требует больших затрат.Централизация логики ограничений имеет больше смысла.
Различные инструменты CASE и инструменты DBA воспользуются преимуществами ограничений базы данных, смогут перепроектировать их и использовать их для содействия задачам разработки и обслуживания.
На практикеЗначение и функция ограничения базы данных по сравнению с некоторым процедурным кодом, который проверяет данные только при вводе, сильно отличается.Если X реализован в ограничении базы данных, то я знаю, что он действителен для каждой части данных в базе данных.Если X вводится в приложение при вводе данных, тогда я знаю, что это относится только к будущим данным - я не могу быть уверен, что это применимо ко всему, что уже есть в базе данных (возможно, X было реализовано только сегодня и не применимо к даннымвошел вчера).