powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация уникальности без ключей и индексов
25 сообщений из 104, страница 4 из 5
Реализация уникальности без ключей и индексов
    #40019461
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке.

Есть, инкапсулируешь логику работы с сущностью в пакете и не даешь прямого доступа к таблице. Триггеры, как ты уже убедился, не самый лучший способ реализации бизнес логики.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019464
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Эффективно - значит без table lock или строгой сериализации доступа к таблице.

Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019472
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Цель была - понять есть ли в языке достаточно возможностей для реализации несложных constraints по колонке.

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


Извините, это общие слова.
PL/SQL он одинаковый, что в триггере что в функции.

Например, я реализую constraint двуникальности.

Допустим я готов сделать таблицу недоступной, тем самым поломав парадигму SQL.
Я умею написать пакет с функциями, но я не умею:

- запретить прямой доступ не требуя переключения контекста
- легко "инкапсулировать логику двуникальности" в пакете без сериализации доступа ко всей таблице

Constraint по колонке - это непростая в целом задача для многопользовательского режима.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019473
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
НеофитSQL
Эффективно - значит без table lock или строгой сериализации доступа к таблице.

Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit.


Первичный ключ не даст мне вставить второе значение, или я чего-то не понял.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019490
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Материализованное представление с первичным ключем и check constraint в режиме refresh fast on commit.


А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа.

SY.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019496
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
А зачем с первичным ключем? Ну и следует упомянуть это будет имитация отложенного ключа.

Для упрощения жизни - mat.view все-таки.
...deferred - да.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019506
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous

Для упрощения жизни - mat.view все-таки.


A что GROUP BY может выдать дубли?

SY.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019515
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL,

А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL?

Если массовые вставки не планируются и вторых значений не много, то можно инкапсулировать вставку в триггере на вьюхе или процедуре, добавить поле номер двууникального значения и сделать уникальный ключ, вставка в процедуре/триггере off вьюхи идет с номером 1, если ошибка по уникальности то повторяем вставку с номером 2, если все равно ошибка по уникальности, то прокидываем ее наверх.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019540
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL,

А кто тебе сказал, что реальная бизнес логика должна решаться исключительно парадигмой SQL, и что такое парадигма SQL?

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


> что такое парадигма SQL?
Я имел в виду, когда к данным применимы табличные операции.

Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2).
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019543
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Я имел в виду, когда к данным применимы табличные операции.

К представлениям применимы табличные операции.

НеофитSQL
Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2).

Да.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019552
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Я имел в виду, когда к данным применимы табличные операции.

К представлениям применимы табличные операции.


Хорошо. Я спрятал таблицу, но чтобы к ней можно было писАть через SQL, сделал представление.
Теперь мне снова нужен триггер, только теперь на вьюхе, чтобы мой "особый" constraint исполнить.

Так что ли? И как мне "прятать" исходную таблицу, чтобы руками не лезли, а только через представление?
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019555
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности?
Чтобы в одной колонке находилось не более двух одинаковых значений?
Задачка Насколько помню, все закончилось тем, что это жутко неэффективно, если вообще возможно (покрывает все случаи)

Ну и я таки разочаровался в твоей адекватности
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019587
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав Любомудров
НеофитSQL
Вопрос по теме: как в Оракле можно эффективно реализовать constraint двуникальности?
Чтобы в одной колонке находилось не более двух одинаковых значений?
Задачка Насколько помню, все закончилось тем, что это жутко неэффективно, если вообще возможно (покрывает все случаи)


С удовольствием почитал 15-летнюю тему, где все еще были молодые, решали задачки и не боялись ошибаться :)
Да, там было много решений, но ни одно так и не оказалось полным.
Решение с построчным dbmslock мне понравилось больше всего, т.к. у меня похоже, только я использую ITL locks, которых больше.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019588
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Если я правильно понял ваше решение, оно полагается на составной PK из двух колонок - одно для значения, второе для счетчика (1-2).

Да.


К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией).
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019589
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
я использую ITL locks, которых больше.

Вы уверены что понимаете что есть ITL?
А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019622
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией).

У тебя штатный PK перестал работать для двух сессий?

Просто и понятно, но катастрофически для производительности при массовых вставках или большом количестве дублей.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019629
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous
НеофитSQL
я использую ITL locks, которых больше.

Вы уверены что понимаете что есть ITL?
А решение есть - и оно Вам было озвучено и тут, и там. Mat.view Refresh on commit + constraint на mat.view.


Я услышал про Mat.view Refresh on commit. Там совершенно другое поведение, запоздалое, с уникальными граблями.
https://dnikiforov.wordpress.com/2011/08/25/materialized-view-and-unique-constraints/

Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019634
graycode
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НеофитSQL
Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому.

Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019637
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
К сожалению, такое не работает для двух сессий. Жаль, выглядит просто и понятно (как это обычно и происходит в мире с одной сессией).

У тебя штатный PK перестал работать для двух сессий?

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


Я думал о следующем примере:

Код: plsql
1.
2.
3.
4.
5.
сессия1> insert into two_max values ('aa');
1 row inserted
------------------------------------------
сессия2> insert into two_max values ('aa');
(подвис на попытке вставить аа:1)



Неоправданное блокирование второй сессии.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019642
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL

Неоправданное блокирование второй сессии.


А что, при обычной уникальности не висит?

SY.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019647
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
graycode
НеофитSQL
Кроме того, в этой теме обсуждается реализация unique constraint без использования встроенного, прикрепленного к чему-то другому.

Ты до сих пор носишься с этой бессмысленной идеей? В PL/SQL нет средств построения своих хранимых, независящих от таблиц индексов и блокировки их листов, поэтому решить эффективно можно только пользуясь стандартными индексами.


Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М.

Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :)
Реализовать эффективный constraint на колонке, удовлетворяющий это правило.

Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB).

Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом".

Насколько я понимаю, в многосессионном режиме Оракл такое не умеет.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019649
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SY
НеофитSQL

Неоправданное блокирование второй сессии.


А что, при обычной уникальности не висит?

SY.


При обычной уникальности висит.

При "двуникальности" не должен, т.к. разрешено одно повторение.

При "стоникальности" подвисание 99 сессий без необходимости становится серьезным барьером для производительности.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019659
Фотография Кобанчег
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НеофитSQL
Это "hello world" для constraints по колонкам. Если я могу решить задачу уникальности, я могу решить общий случай, где критерий уникальности ключа является внешней функцией Distance(key1,key2) < М.

Например: на период пандемии натуральным id не разрешается соприкасаться (разница должна быть > 1) :)
Реализовать эффективный constraint на колонке, удовлетворяющий это правило.

Второй пример: для таблицы регистрации торговых знаков нужно реализовать constraint, который не позволит им быть слишком похожими друг на друга. Похожесть определяется функцией расстояния DistanceTM(clob, clob) (описание торгового знака содержится в колонке типа CLOB).

Третий пример: для улучшения диверсити лотереи гринкарты было решено отсеять "слишком похожих" кандидатов, соблюдая очередность поступления. Для этого DistanceGC(row,row) считает корреляцию по 300 параметрам, и кандидат "слишком похожий" на уже имеющихся в базе, считается "дупликатом".

Насколько я понимаю, в многосессионном режиме Оракл такое не умеет.
Допустим ты решил простой случай через сериализацию.

Кстати, раньше один эксперт хорошо известный в узких кругах пытался продавать такой продукт.
В гугл - Oracle RuleGen
Сейчас он сайт удалил и многое выпилено (но при умении искать можно найти), а раньше была доступна вся документация и даже исходники.
Так вот "фишка" его решения была сериализация через dbms_lock.

Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N"
это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице.
Вот тут можно пытаться сводить проблему полного перебора к неполному с помощью domain indexes (как, например, сделано в Spatial).
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019666
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кобанчег

Ключевое различие в "id не разрешается соприкасаться" и озученного тобой ранее что-то типа "расстояние Левенштейна не превышает N"
это то что в первом случае достаточно сравнить с двумя соседями а во втором со всеми записями в таблице.


Для меня это не ключевое различие, это свойство функции расстояния, которое может повлиять на скорость.
На логику кода реализующего constraint уникальности влияет мало. Индекс это полезная, но ортогональная оптимизация.

Если строки короткие, я могу построить индекс в пространстве Левенштейна (а не линейный) и вместо полного перебора сравнивать только 2N соседей в N измерениях.

Мое желание скопировать поведение PK связано с тем, что оно хорошо отполировано и широко известно.
Лучше для общего случая я не придумаю.

Пока я решил для insert (в пределах возможностей моих 3-сессионных тестов).
Если не найду интереснее задачек, допилю delete/update.
...
Рейтинг: 0 / 0
Реализация уникальности без ключей и индексов
    #40019677
НеофитSQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитал про Oracle RuleGen, интересно.

Учитывая количество подводных камней для multirow constraints, было бы намного лучше чтобы такие задачи решались профессионально. Еще лучше - чтобы были встроены в БД производителем, или продавались как надстройка.

Даже если окажется что я худо-бедно и в основном на ощупь один раз правильно реализовал multirow constraint в триггере,
это не значит что такой код легко сопровождаемый, или что я не сделаю ошибку в следующий раз в немного усложненной ситуации.

Свои цели в этом вопросе я достиг, обработку конфликтов в PK понимаю намного лучше чем пару дней назад, использовал select..for update почти по прямому назначению, и увидел что большинство решений тяготеют или к MV-on-commit или GTT+автономные транзакции (я использовал второе).
...
Рейтинг: 0 / 0
25 сообщений из 104, страница 4 из 5
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Реализация уникальности без ключей и индексов
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]