2010-01-27 1 views
3

Я только что столкнулся с таблицей в производстве, которая имеет 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, но меня интересует то, что люди считают общим поведением.

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

ответ

2

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

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

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

+0

Нет каскадную/разницы не-каскадной - абсолютно идентичен! Дополнительная проверка была именно тем, о чем я беспокоился! – azp74

+0

Вы должны принять этот или один из других ответов, а затем :-) – gbn

+0

Извините за задержку! – azp74

1

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

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

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

+0

AFAIK нет сценария создания (я подозреваю, что hibernate «создал» базу данных ...). И да, часть моей работы будет заключаться в написании сценария для создания тестовой базы данных. Таким образом, часть DDL, по сути, будет сценарием создания. – azp74

1
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 ограничение в том числе дубликата,

+0

Вопрос в следующем: почему у вас есть дубликаты ограничений внешнего ключа в базе данных? Ваш сценарий не отвечает на этот вопрос. Не могли бы вы улучшить свой ответ? – Josien

+0

при работе с PostgreSQL с Grails Framework, сама каркас создает ограничение внешнего ключа (в имени типа «fk01645646fhgfad») даже DBA создало ограничение fk для того же самого. к тому времени нам нужно определить дублирующее ограничение fk. для этого предназначен этот сценарий. – solaimuruganv