SQLRU.net
Разработка приложений баз данных

Начало » Использование СУБД » Firebird, HQbird, InterBase » Как построить FK на PK?
Как построить FK на PK? [сообщение #3489] Mon, 23 October 2023 18:55 Переход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
CREATE TABLE MASTER (
    ID  BIGINT NOT NULL
);
ALTER TABLE MASTER ADD CONSTRAINT PK_MASTER PRIMARY KEY (ID);

CREATE TABLE SLAVE (
    ID        BIGINT NOT NULL,
    ADDITION  VARCHAR(100)
);
ALTER TABLE SLAVE ADD CONSTRAINT PK_SLAVE PRIMARY KEY (ID);
ALTER TABLE SLAVE ADD CONSTRAINT FK_SLAVE FOREIGN KEY (ID) REFERENCES MASTER (ID);
В результате имеем 2 идентичных по содержанию индекса PK_SLAVE и FK_SLAVE, что выглядит напрасной тратой ресурсов.

Попытка
ALTER TABLE SLAVE ADD CONSTRAINT FK_SLAVE FOREIGN KEY (ID) REFERENCES MASTER(ID) USING INDEX PK_SLAVE;
приводит к
ALTER TABLE SLAVE failed. Index PK_SLAVE already exists.
Возможно, в случае, когда индекс FK_SLAVE таки вроде бы создался, он на самом деле не создается, а неявно используется PK_SLAVE, это было бы красиво и утешительно. Но возможно, что и нет. Как оно на самом деле, и как обойтись одним индексом?

Re: Как построить FK на PK? [сообщение #3491 является ответом на сообщение #3489] Mon, 23 October 2023 19:43 Переход к предыдущему сообщениюПереход к следующему сообщению
sim_84 в настоящее время не в онлайне  sim_84
Сообщений: 330
Зарегистрирован: June 2022
Senior Member
Невозможно. Никак не обойтись.
Re: Как построить FK на PK? [сообщение #3493 является ответом на сообщение #3491] Tue, 24 October 2023 12:27 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
констрейнта 2, значит и индекса 2.
так устроен движок IB/FB.
а вот Оракел для констрейнта индекс по умолчанию не создаёт.
вследствие чего возможны забавные маланские мансы.
Re: Как построить FK на PK? [сообщение #3499 является ответом на сообщение #3493] Tue, 24 October 2023 13:37 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 358
Зарегистрирован: August 2022
Senior Member
МП писал(а) Tue, 24 October 2023 12:27
констрейнта 2, значит и индекса 2.
так устроен движок IB/FB.
а вот Оракел для констрейнта индекс по умолчанию не создаёт.
вследствие чего возможны забавные маланские мансы.
Какие ? А то есть мнение что этот механизм неплохо бы и себе перенять.
Re: Как построить FK на PK? [сообщение #3503 является ответом на сообщение #3499] Tue, 24 October 2023 13:54 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad писал(а) Tue, 24 October 2023 13:37
МП писал(а) Tue, 24 October 2023 12:27
констрейнта 2, значит и индекса 2.
так устроен движок IB/FB.
а вот Оракел для констрейнта индекс по умолчанию не создаёт.
вследствие чего возможны забавные маланские мансы.
Какие ? А то есть мнение что этот механизм неплохо бы и себе перенять.
дык, ты ж мне отвечал на пост в пятнице:
https://www.sqlru.net/index.php/mv/msg/89/2059/#msg_2059
Re: Как построить FK на PK? [сообщение #3504 является ответом на сообщение #3503] Tue, 24 October 2023 14:21 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 358
Зарегистрирован: August 2022
Senior Member
МП писал(а) Tue, 24 October 2023 13:54
hvlad писал(а) Tue, 24 October 2023 13:37
МП писал(а) Tue, 24 October 2023 12:27
констрейнта 2, значит и индекса 2.
так устроен движок IB/FB.
а вот Оракел для констрейнта индекс по умолчанию не создаёт.
вследствие чего возможны забавные маланские мансы.
Какие ? А то есть мнение что этот механизм неплохо бы и себе перенять.
дык, ты ж мне отвечал на пост в пятнице:
https://www.sqlru.net/index.php/mv/msg/89/2059/#msg_2059
Т.е. кроме блокирования таблицы (знаем, знаем) других проблем не имеется ?
Re: Как построить FK на PK? [сообщение #3505 является ответом на сообщение #3504] Tue, 24 October 2023 14:32 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad
Т.е. кроме блокирования таблицы (знаем, знаем) других проблем не имеется ?
это надо ораклоидов поспрошать.
а я не настоящий сварщик. ©
Re: Как построить FK на PK? [сообщение #3506 является ответом на сообщение #3505] Tue, 24 October 2023 15:01 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
А если (см. топик) вообще не создавать первичный ключ? У меня вполне прошло
CREATE TABLE SLAVE (
    ID        BIGINT NOT NULL,
    ADDITION  VARCHAR(100)
);
ALTER TABLE SLAVE ADD CONSTRAINT FK_SLAVE FOREIGN KEY (ID) REFERENCES MASTER (ID);

select
    *
  from
    SLAVE
  where
    ID = :ID
----
PLAN (S INDEX (FK_SLAVE))
То есть, если нет PK, то, когда необходимо, подхватится FK. Все вроде бы хорошо, но индекс FK_SLAVE создается неуникальным, как хотелось бы. Но если уникальность поддерживать на логическом уровне, то вроде должно работать, нет?
Re: Как построить FK на PK? [сообщение #3507 является ответом на сообщение #3506] Tue, 24 October 2023 15:29 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky
То есть, если нет PK, то, когда необходимо, подхватится FK. Все вроде бы хорошо, но индекс FK_SLAVE создается неуникальным, как хотелось бы. Но если уникальность поддерживать на логическом уровне, то вроде должно работать, нет?
движок IB/FB умеет поддерживать уникальность только посредством соответствующего индекса.
нет UNIQUE INDEX -- нет уникальности.

зы: у Оракела есть возможность "пристегнуть" существующий индекс к создаваемому CONSTRAINT при помощи предиката USING INDEX.
у нас же, USING INDEX позволяет только задать имя создаваемого индекса для создаваемого CONSTRAINT.
Re: Как построить FK на PK? [сообщение #3508 является ответом на сообщение #3489] Tue, 24 October 2023 15:52 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Это я понял, спасибо. И отсутствие поддержки уникальности на уровне полученного индекса некритично, хотя и неудобно. Теперь в ходе открывшихся обстоятельств вопрос звучит так: можно ли существовать без первичного ключа? Если да, то создание FK без PK вроде бы решает задачу создания единственного индекса вместо двух.
Re: Как построить FK на PK? [сообщение #3509 является ответом на сообщение #3508] Tue, 24 October 2023 16:03 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
P.S.
Для поддержки уникальности на "логическом" уровне можно перед каждой вставкой проверять на существование, это не особо накладно.
Показать скрытый текст
Re: Как построить FK на PK? [сообщение #3510 является ответом на сообщение #3507] Tue, 24 October 2023 16:40 Переход к предыдущему сообщениюПереход к следующему сообщению
hvlad в настоящее время не в онлайне  hvlad
Сообщений: 358
Зарегистрирован: August 2022
Senior Member
МП писал(а) Tue, 24 October 2023 15:29
зы: у Оракела есть возможность "пристегнуть" существующий индекс к создаваемому CONSTRAINT при помощи предиката USING INDEX.
у нас же, USING INDEX позволяет только задать имя создаваемого индекса для создаваемого CONSTRAINT.
И это тоже мы хотим перенять.
И может быть кое-что ещё.

Re: Как построить FK на PK? [сообщение #3511 является ответом на сообщение #3509] Tue, 24 October 2023 16:52 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky
P.S.
Для поддержки уникальности на "логическом" уровне можно перед каждой вставкой проверять на существование, это не особо накладно.
касаемо "не особо накладно", ты ошибаешься.
при наличии конкурирующих транзакций придётся каждый раз блокировать таблицу целиком.
при весомых объёмах это очень чувствительно, даже на Оракле.
Re: Как построить FK на PK? [сообщение #3512 является ответом на сообщение #3510] Tue, 24 October 2023 16:55 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
hvlad писал(а) Tue, 24 October 2023 16:40
МП писал(а) Tue, 24 October 2023 15:29
зы: у Оракела есть возможность "пристегнуть" существующий индекс к создаваемому CONSTRAINT при помощи предиката USING INDEX.
у нас же, USING INDEX позволяет только задать имя создаваемого индекса для создаваемого CONSTRAINT.
И это тоже мы хотим перенять.
И может быть кое-что ещё.
дык, где капу нажать? маякни, мы поддержим.
Re: Как построить FK на PK? [сообщение #3513 является ответом на сообщение #3511] Tue, 24 October 2023 17:31 Переход к предыдущему сообщениюПереход к следующему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
МП писал(а) Tue, 24 October 2023 16:52

при наличии конкурирующих транзакций придётся каждый раз блокировать таблицу целиком.
Почему? Не понял. В какой момент происходит блокировка таблицы и почему? Там 2 операции - проверка (select) и вставка. Select вообще не может блокировать, а вставка... Вставка без первичного ключа блокирует всю таблицу, так, что ли? А при наличии первичного ключа не блокирует?

Провел эксперимент. Таблица без PK. В одном коннекте добавил запись, транзакцию не закрыл, в другом коннекте добавил запись, подтвердил транзакцию по второму коннекту, подтвердил транзакцию по первому коннекту. Никаких конфликтов. Не видно, чтобы кто-то что-то блокировал.

Или слово "придется" относится не к алгоритмам сервера, а к собственной "ручной" логике? Тогда не вижу необходимости блокировать, по-крайней мере, для своих задач.

[Обновления: Tue, 24 October 2023 17:36]

Известить модератора

Re: Как построить FK на PK? [сообщение #3514 является ответом на сообщение #3513] Tue, 24 October 2023 17:55 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky
Никаких конфликтов. Не видно, чтобы кто-то что-то блокировал.
именно поэтому таким макаром обеспечить уникальность и не получится.
блокировать надо принудительно на уровне транзакции.
причём все транзакции которые "лезут" в эту таблицу со стороны приложения должны быть с одинаковым уровнем изоляции с указанием предиката RESERVING.
по аналогии с семафорами - кто первый встал, того и тапочки.
это всё нужно обеспечить на уровне приложений.
но где гарантия, что никто не полезет в базу выставив себе другой уровень изоляции, и тем самым наплевав на стройную архитектуру выстроенного песочного замка.
Re: Как построить FK на PK? [сообщение #3515 является ответом на сообщение #3513] Tue, 24 October 2023 18:00 Переход к предыдущему сообщениюПереход к следующему сообщению
МП в настоящее время не в онлайне  МП
Сообщений: 887
Зарегистрирован: August 2022
Географическое положение: бурятский тун...
Senior Member
shalamyansky
Или слово "придется" относится не к алгоритмам сервера, а к собственной "ручной" логике? Тогда не вижу необходимости блокировать, по-крайней мере, для своих задач.
"пронесёт" только если нет конкурирующих транзакций.
да и то, не гарантировано.
Re: Как построить FK на PK? [сообщение #3516 является ответом на сообщение #3489] Tue, 24 October 2023 18:30 Переход к предыдущему сообщению
shalamyansky в настоящее время не в онлайне  shalamyansky
Сообщений: 150
Зарегистрирован: August 2022
Senior Member
Не понимаю. Я стараюсь, но я не понимаю. Вот такая процедура для вставки
Показать скрытый текст
Все клиенты вместо
Показать скрытый текст
вызывают
Показать скрытый текст
Что тут может пойти не так? С любым уровнем изоляции и без всяких RESERVING?

P.S.
Все, понял. Виноват, протупил. Легко могут быть созданы 2 одинаковые записи. Даже проверил, могут. Вопрос снимаю.

[Обновления: Tue, 24 October 2023 18:39]

Известить модератора

Предыдущая тема: Wirecompression
Следующая тема: Быстродействие UDR
Переход к форуму:
  


Текущее время: Wed Nov 27 10:29:59 GMT+3 2024

Общее время, затраченное на создание страницы: 0.00892 секунд