дублированные ограничения внешнего ключа - причины за или против - PullRequest
3 голосов
/ 27 января 2010

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

е

fk1(a_id) references a(id)
fk2(a_id) references a(id)
fk3(b_id) references b(id)
fk4(b_id) references b(id)

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

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

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Это не добавляет никакой пользы и является излишним. Действительно, это вдвое больше FK, которые необходимо проверить на наличие вставки или обновления a_id.

Я говорю, бросьте дубликаты.

Если у одного есть каскад, а у другого его нет, то не каскадный является дубликатом (может не относиться к PostGres)

1 голос
/ 14 сентября 2012
SELECT
    pc.conname as constraint_name, 
    --conrelid as child_table_id,   
    pclsc.relname as child_table,
    --pc.conkey as child_column_id,
    pac.attname as child_column,
    --confrelid as parent_table_id,
    pclsp.relname as parent_table,
    --pc.confkey as parent_column_id,
    pap.attname as parent_column,   
    nspname as schema_name
FROM 
    (
    SELECT
         connamespace,conname, unnest(conkey) as "conkey", unnest(confkey)
          as "confkey" , conrelid, confrelid, contype
     FROM
        pg_constraint
    ) pc
    JOIN pg_namespace pn ON pc.connamespace = pn.oid
    -- and pn.nspname = 'panmydesk4400'
    JOIN pg_class pclsc ON pc.conrelid = pclsc.oid
    JOIN pg_class pclsp ON      pc.confrelid = pclsp.oid
    JOIN pg_attribute pac ON pc.conkey = pac.attnum    and pac.attrelid =       pclsc.oid
    JOIN pg_attribute pap ON pc.confkey = pap.attnum and pap.attrelid = pclsp.oid

ORDER BY pclsc.relname

перечисляет все (включая дубликаты) ограничения FK, включая дубликаты,

1 голос
/ 27 января 2010

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

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

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

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