Где указать внешний ключ при создании таблицы? - PullRequest
2 голосов
/ 08 декабря 2011

Я хотел бы создать таблицу с именем arguments, атрибут которой name связан с другим атрибутом name в таблице с именем names.

Я вижу два способа выразить это вSQL:

  1. путем создания ограничения для таблицы:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE,
                            comment text,
                            FOREIGN KEY (name) REFERENCES names (name));
    
  2. путем квалификации атрибута на лету:

    CREATE TABLE names (   name text UNIQUE,
                          short text UNIQUE,
                        comment text);
    CREATE TABLE arguments (   name text UNIQUE REFERENCES names (name),
                            comment text);
    

Я хотел бы знать:

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

Спасибо за вашу помощь.

Ответы [ 3 ]

2 голосов
/ 08 декабря 2011

Это просто другой синтаксис для одного и того же конечного результата.

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

Однако я хотел бы сделать один комментарий: чаще встречается использование идентификаторов в качестве уникальных идентификаторов и ссылок.Это позволяет вам изменять значение в поле «Имя», не меняя его идентичность и не нарушая ссылочную целостность.Существуют базы данных, которые могут каскадировать такие изменения и обновлять все вхождения Имени, но в целом считается более чистым иметь идентификаторы, которые отделены от данных.

1 голос
/ 08 декабря 2011

Хотя первый параметр известен как out-of-line объявление ограничения, а второй параметр - in-line, оба они функционально одинаковы.

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

Создать таблицу

CREATE TABLE arguments 
(   
    name text UNIQUE,                         
    comment text,                         
    constraint arguments_fk FOREIGN KEY (name) REFERENCES names (name)
); 

Отключить ограничение

ALTER TABLE arguments NOCHECK CONSTRAINT arguments_fk;

Включить ограничение

ALTER TABLE arguments CHECK CONSTRAINT arguments_fk;

Это для SQL Server. Oracle имеет эквивалентные команды.

0 голосов
/ 08 декабря 2011

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

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

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