powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность
76 сообщений из 76, показаны все 4 страниц
Сложная проверка на уникальность
    #39658826
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго дня.

Есть табличка в базе, в ней есть три поля, путь будут INDEX, VALUE: Integer; MASK: SmallInt.
Теперь надо сделать проверку на уникальность, по условию:

Код: plaintext
(A.Index <> B.Index) or (A.Value <> B.Value) or (A.Mask and B.Mask = 0)

Т.е. либо разные Index и/или Value, либо одинаковые, но тогда нет общих битов в маске.

Вопрос: можно ли и стоит ли это делать средствами Firebird (и если да, то как?) или забить и реализовать проверку в приложении?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658860
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

можно сделать.
Несколько вариантов (не все возможные) на выбор.
1) в процедуре добавления, обновления данных.
2) в триггерах на INSERT, UPDATE
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658879
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filippov Dmitryalekcvp,
можно сделать.
Несколько вариантов (не все возможные) на выбор.
1) в процедуре добавления, обновления данных.
2) в триггерах на INSERT, UPDATE
1. добавляться будет сразу из приложения, без ХП.
2. А как грамотно проверить? Что-то типа:
Код: plsql
1.
2.
3.
4.
select id from <table> where 
  (index = :aindex) and 
  (value = :avalue) and 
  (bin_and(mask, :mask) = 0)

И стоит ли тогда сделать какой-нибудь индекс, чтобы проверка быстрее проходила?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658891
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

если это не курсовик и т. п. все таки рекомендую работу делать через хранимые процедуры.

Чтобы вести предметный разговор про индексы требуется немного больше информации:
структура таблицы, какие данные, их состав / объем, режим работы (как обновляется, пополняется).. да и еще много чего.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658932
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filippov Dmitryalekcvp,
если это не курсовик и т. п. все таки рекомендую работу делать через хранимые процедуры.

Чтобы вести предметный разговор про индексы требуется немного больше информации:
структура таблицы, какие данные, их состав / объем, режим работы (как обновляется, пополняется).. да и еще много чего.
Это простейшая программа, на три таблички, для резервирования объектов. Справочник объектов, справочник пользователей и табличка, собственно, с резервированием.
Index - это ID объекта, Value - дата (без времени), Mask - рабочие часы (интервал резервирования кратен часу).
Не курсовой, но чисто для облегчения жизни внутри отдела.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658933
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

А что, нужно не позволять делать update или Insert? ИМХО, на клиенте удобнее это делать.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658938
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXIalekcvp,
А что, нужно не позволять делать update или Insert? ИМХО, на клиенте удобнее это делать.
Нужно сказать "упс, занято", если пересекается по времени. Просто мне казалось что правильнее будет это контролировать на сервере, чтобы корректность данных проверялась в одном месте, а не то там, то там.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658952
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpПросто мне казалось что правильнее будет это контролировать на сервере,более того, такой контроль можно только на сервере и гарантировать. И не триггером или хранимкой, а уникальным индексом. Вычисляй поле по своим критериям и уникальный индекс на него навесь.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658953
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы контролировать уникальность, нужно гарантировать отсутствие конкурентных вставок конфликтующих значений.
Это можно сделать, например, так.

Создай доп таблицу (ID, Value) с уникальностью на оба поля.
Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу.
Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице.
Если не удалось - откат и повтор (или отказ от операции).
После вставки в основную таблицу - убери за собой из дополнительной.

Ну, или откажись от масок и вставляй несколько (ID, Value, Hour) в основную таблицу с обычным контролем уникальности по 3-м полям
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658957
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladСоздай доп таблицу (ID, Value) с уникальностью на оба поля.
Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу.
Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице.
Если не удалось - откат и повтор (или отказ от операции).Дык, в том и дело, что ID и Value могут быть не уникальными.
hvladНу, или откажись от масок и вставляй несколько (ID, Value, Hour) в основную таблицу с обычным контролем уникальности по 3-м полямПри типовом сценарии - количество записей в таблице вырастет в 8 раз...
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658961
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а если 8 индексов по 3 полям сделать - это совсем маразм будет? :)
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658965
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Интересно, а если 8 индексов по 3 полям сделать - это совсем маразм будет? :)

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

Например, что вообще оозначает несовпадение битов - что
человек не работал в 1 час на нескольких объектах или что?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658973
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамalekcvp>Например, что вообще оозначает несовпадение битов - что
человек не работал в 1 час на нескольких объектах или что?

8 рабочих часов - 8 бит. Бит установлен -> в этот час объект занят. Биты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658975
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpГаджимурадов Рустамalekcvp>Например, что вообще оозначает несовпадение битов - что
человек не работал в 1 час на нескольких объектах или что?

8 рабочих часов - 8 бит. Бит установлен -> в этот час объект занят. Биты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно.
не знаю всей задачи, но лучше отказаться от битов и все таки считать в штуках.
Потому как "полбита" не посчитать, а человек (или объект) занят полчаса, а потом полчаса не занят - это вполне жизненно.

Лучше бы перепроектировать структуру!
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658976
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, имеется запись A:

Код: plaintext
1 10.07.2018 000 1 1100
кто-то зарезервировал объект с ID = 1 на 10е июля с 10 до 13 часов.

Пытаемся добавить запись B:

Код: plaintext
1 10.07.2018 001 1 0000
кому-то объект с ID = 1 тоже нужен 10го июля с 12 до 14 часов, но тут должен быть облом, т.к. с 12 до 13 объект уже занят.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658979
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Filippov DmitryПотому как "полбита" не посчитать, а человек (или объект) занят полчаса, а потом полчаса не занят - это вполне жизненно.В моём случае это исключено. Либо занято весь час, либо свободно.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658986
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нафиг такие извращения? Разбить MASK на два поля - начало и конец интервала в часах.
Или стоит задача 8 байт на каждой записи сэкономить?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658988
Filippov Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

тогда получается таблица (примерно)

ID объекта,
час

уникальный индекс по этим двум полям.

при резервировании записываем. Дубликат не вставишь!
И вроде никаких масок не требуется.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658991
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpБиты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно.

Например, имеется запись A:

1 10.07.2018 00011100кто-то зарезервировал объект с ID = 1 на 10е июля с 10 до 13 часов.
А, т.е. некое бронирование. Это можно и это гораздо проще.
Переделай эти маски на нормальные интервалы - заодно и
спасибо позже скажешь, когда/если появится необходимость
бронировать более 8 часов или график будет неодинаковый
у разных объектов/дней - и тогда вопрос снимется сам собой.

Вернее, не снимется - пересечение интервалов придётся
проверять вручную, без всяких индексов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658996
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpertНафиг такие извращения? Разбить MASK на два поля - начало и конец интервала в часах.
Или стоит задача 8 байт на каждой записи сэкономить?
А как тогда искать пересечения? В случае с масками будет A and B = 0 (чисто) <> 0 (пересекаются), а если интервалы хранить, то надо 4 сравнения делать.

И как это поможет с уникальным индексом? А в триггере - без разницы, маски или интервалы.

К тому же, если интервал, например, с 10 до 12 и с 13 до 15 в один день, то с маской это одна запись, а с интервалами - две.
Filippov DmitryID объекта,
час
уникальный индекс по этим двум полям.
Дата ещё, и получится, как выше советовали, просто в основной таблице по записи на каждый час резервирования. Т.е. размер x8 и в приложении сложнее обрабатывать, т.к. потом из набора всё равно маску собирать придётся для отображения/редактирования.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39658999
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Диапазон может вставляться не "нормальным" диапазоном, а перечислением всех часов.
Тогда уникальность сработает.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659001
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамВернее, не снимется - пересечение интервалов придётся
проверять вручную, без всяких индексов.

Ну так если пересечение всё равно придётся вручную проверять, то с масками и проверка проще: bin_and(a, b) = 0 и всё.
Т.е. я так понимаю - в любом случае проверку придётся делать триггером?

Гаджимурадов Рустамкогда/если появится необходимость
бронировать более 8 часов или график будет неодинаковый
у разных объектов/дней
Больше 24 часов в день всё равно не забронировать, а Integer - 32х-битный.
А для разных дней и так разные записи.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659004
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpТ.е. размер x8 и в приложении сложнее обрабатыватьНичё не сложнее. Даже наоборот. Сто раз так делал для всяких расписаний и мест хранения.
Размер - фигня, это всё жалкие байты.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659008
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpИ как это поможет с уникальным индексом? А в триггере - без разницы, маски или интервалы.


Ну тогда и делай в триггере, раз битовая маска тебя полностью устраивает.
Чем триггеры-то не угодили? Проверил маску, обнаружил пересечение - выбросил исключение.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659009
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryГаджимурадов Рустам,
Диапазон может вставляться не "нормальным" диапазоном, а перечислением всех часов.
Тогда уникальность сработает.

Так, прикинуть: 365 дней в году, по 8 записей на день, 10-15 объектов ~ 30-45к записей в год. В принципе не много, я так понимаю?
Правда я ещё для повторяющихся событий хотел сделать ссылку на ID первой записи, чтобы можно было редактировать всю группу, придётся ещё одно поле добавлять...
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659010
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery> Диапазон может вставляться ... перечислением всех часов.

Может, но это извращение в гамаке стоя, ИМХО.
Хуже его первоначального варианта.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659011
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert> Чем триггеры-то не угодили?

Необходимостью работы с транзакциями и конфликтами.
С индексом было бы проще - навесил и забыл.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659012
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IBExpert,

триггерами и процедурой нельзя гарантировать невозможность вставки одних и тех же значений.
1 транзакция - вставляем А
1 триггер - А нету
2 транзакция - вставляем А
2 триггер - А нету
1 транзакция коммит
2 транзакция коммит
ОПА!

Так что вот этот "масочный" контроль устроить можно было бы только вычисляемым индексом (скорее, индексом по вычисляемому столбцу).
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659013
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Так, прикинуть: 365 дней в году, по 8 записей на день


Когда бронь растянется - попомни это обсуждение. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659014
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp30-45к записей в год. В принципе не много, я так понимаю?
это вообще ни о чём. Даже если бы пара миллионов записей была.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659016
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv> только вычисляемым индексом (скорее, индексом по вычисляемому столбцу).

Даже им нельзя, AFAIS - к, примеру, 1-5, 4-7.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659020
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

50К записей в год, в таблице из 3-4 полей простого типа - это вообще ни о чём.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659025
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТак что вот этот "масочный" контроль устроить можно было бы только вычисляемым индексом (скорее, индексом по вычисляемому столбцу).
Ну вот я и спрашивал про 8 индексов (каждый имеет вычисляемый столбец со значением NULL или 1 для соответствующего бита)
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659026
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryalekcvp,
50К записей в год, в таблице из 3-4 полей простого типа - это вообще ни о чём.
Там около 10 полей, в т.ч. 1 varchar(256), я привёл только значимые.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659032
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Там около 10 полей, в т.ч. 1 varchar(256), я привёл только значимые.

Вы, кажется, о разном говорите. Дублировать записи не будет нужно,
просто ссылаться на соотв. час. Если я правильно понял Сержа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659033
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Для именно резервирования можно отдельную таблицу.
Причём, если ожидается резкий рост числа объектов (несколько порядков), то можно придумать структуру хранения "с архивацией", чтобы старые периоды сжимались в другой, компактный вид - ведь, как я понимаю, резервирования задним числом быть не может?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659034
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, или ты про 8 индексов на каждый час? Ужас-ужас.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659035
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем я подумал и решил немного модифицировать идеи выше:

Таблицу с резервированием я разобью на две: в первой будет - id, кто, что, описание и т.п., а во второй только: res_id (= id из первой), объект, дата, номер часа. И, соответственно, во второй сделаю уникальный индекс по всем полям, кроме res_id.

Какие-нибудь замечания или дополнения можете сделать?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659040
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

Собственно, так и предлагал :) Замечания если и будут, то уже по реализации.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659044
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Какие-нибудь замечания или дополнения можете сделать?

Лишь повторюсь - в погоне за простотой уникальности
ты значительно усложняешь реализацию и сопровождение.
Гора родит Годзиллу вместо мыши.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659047
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЛишь повторюсь - в погоне за простотой уникальности
ты значительно усложняешь реализацию и сопровождение.
А как иначе избежать этого 21482445 ?
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659080
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> А как иначе избежать этого 21482445?

Уникальность (непересекаемость) интервалов (дат, чисел)
нормального (простого, адекватного) решения не имеет, ИМХО.
Те которые есть (например, с непрерывными интервалами и FK
от D2 на D1) на мой вкус уродливы, так что лично я бы выбирал
алгоритмическое решение - например, с пессим. блокировкой
нужного интервала (или перечня записей на каждый час) или по
варианту Влада.

Дублирование записей на каждый час лично мне не нравится.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659084
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Ну ещё есть вариант делать с маской, проверку через триггер, а для избегания сценария от kdv - делать очень короткую пишущую транзакцию (wait) и первым делом в ней блокировать строку с объектом в справочнике объекта. Тогда не будет синхронных резервирований одного объекта и, соответственно, описанной ситуации.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659087
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы вынес проверки из БД
например, отдельный сервис сделать, который отвечает за бронирование
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659098
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> делать очень короткую пишущую транзакцию (wait) и
alekcvp> первым делом в ней блокировать строку с объектом

Ну это та же пессим.блокировка, только не дат, а объекта.
Т.е. ещё хуже, по сути. А пишущие транзакции итак всегда
должны быть максимально короткими.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659099
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгений> я бы вынес проверки из БД. например, отдельный сервис сделать, который отвечает за бронирование

Если делать отдельный сервис как промежуточное звено, то это
ещё большее усложнение, т.е. развести стадо Годзилл, летающих. :)
А если делать накопление "заявок" в очередь внутри БД с послед.
обработкой одним коннектом, т.е. сильно асинхронно - клиент не
увидит статуса своей заявки "сразу".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659103
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамНу это та же пессим.блокировка, только не дат, а объекта.
А даты в такой модели не заблокировать никак...
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659106
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> А даты в такой модели не заблокировать никак...

Ну, зависит от доп. таблиц. Например, если в доп.таблице
будут те самые "ID, Date, Hour" - можно их блокировать,
потом снимать блокировку (поскольку для послед.работы
и селектов они уже будут не нужны).

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659107
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, про архитектуру/область ты ничего не сказал.
Это двузвенка или трехзвенка с Web-ом или что ?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659108
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

Приложение напрямую к серверу БД коннектится, не вижу смысла заморачиваться с 3хзвенкой.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659116
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

а если экземпляр один то и с блокировкой можно не заморачиваться )

авторА даты в такой модели не заблокировать никак...
даты можно и не блокировать, т.к. обращения к одному объекту уже сериализованы
при низкой конкуренции на один объект вполне себе решение
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659118
Фотография Дегтярев Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЕсли делать отдельный сервис как промежуточное звено, то это
ещё большее усложнение,
да усложнение, но это, так сказать, вариант на вырост
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659121
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дегтярев Евгенийalekcvp,
а если экземпляр один то и с блокировкой можно не заморачиваться )

Пишущих экземпляров где-то 2-5 планируется.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659122
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, я щас подумал - поскольку таблица брони
всё равно дополнительная к справочнику, то можно
и декларативно, пожалуй (с доп. полем busy/free).

Object Date H1 H2 Status1 Today 08 12 Busy1 Today 12 14 Free1 Today 14 18 (или Null) Busy

H2 - int или timestamp, FK на H1.
UQ - на Object, Date, H1.

Операция брони будет чуть сложнее, чем тупой Insert,
конечно, зато блокировать справочник не придётся.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659123
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, тут думать надо! (с)

P.S. В топик призывается Дед. :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659124
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp> Пишущих экземпляров где-то 2-5 планируется.

Тю, ради 2-5 заморачиваться и смысла особо нет.
Лочишь и всё, где ж там узкое место-то?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659127
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvphvladСоздай доп таблицу (ID, Value) с уникальностью на оба поля.
Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу.
Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице.
Если не удалось - откат и повтор (или отказ от операции).Дык, в том и дело, что ID и Value могут быть не уникальными.Моя модель этому не противоречит.
Она сводит конкуренцию в доп таблице к разумному минимуму.
У тебя варианты - лочить ID, лочить ID + Value, лочить несколько записей: ID + Value + каждый бит в маске.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659130
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad> У тебя варианты - лочить

А как тебе вариант с непрерывными интервалами? Слишком муторно? :)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659133
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladalekcvpпропущено...
Дык, в том и дело, что ID и Value могут быть не уникальными.Моя модель этому не противоречит.
Она сводит конкуренцию в доп таблице к разумному минимуму.
У тебя варианты - лочить ID, лочить ID + Value, лочить несколько записей: ID + Value + каждый бит в маске.
А, со второго раза дошла идея. Ну, в моём случае проще лочить ID, наверное. Т.к. конкуренция маленькая.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659138
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамhvlad> У тебя варианты - лочить

А как тебе вариант с непрерывными интервалами? Слишком муторно? :)Если я правильно понял этот вариант, то с точки зрения синхронизации интервалы и маски никак не отличаются.
С точки зрения поиска пересечений - маски проще, интервалы гибче.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659139
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad> с точки зрения синхронизации интервалы и маски никак не отличаются.

На маску UK не навесишь, а на интервал - можно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659143
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустамhvlad> с точки зрения синхронизации интервалы и маски никак не отличаются.

На маску UK не навесишь, а на интервал - можно.Пример давай, посмотрим
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659144
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же привёл выше. Щас DDL/DML набросаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659145
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам,

где выше ? Я не буду перечитывать 3 страницы в поисках
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659146
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если ты про это 21482910 , то я не вижу как гарантируется работоспособность при конкурентном доступе
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659150
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, 2 варианта поля использования полей H2/Status:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE BRON (
    OBJ     INTEGER NOT NULL,
    DATA    DATE NOT NULL,
    H1      INTEGER NOT NULL,
    H2      INTEGER,
    STATUS  VARCHAR(20) NOT NULL
);

ALTER TABLE BRON ADD CONSTRAINT UNQ1_BRON UNIQUE (OBJ, DATA, H1);

ALTER TABLE BRON ADD CONSTRAINT FK_BRON_1 FOREIGN KEY (OBJ, DATA, H2) REFERENCES BRON (OBJ, DATA, H1);

-- *********************

INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 8, 12, 'busy');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 12, 16, 'free');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 16, NULL, 'busy');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (2, '11-JUN-2018', 8, 16, 'busy (весь день)');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (2, '11-JUN-2018', 16, 16, 'free (как вариант)');


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659151
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad> то я не вижу как гарантируется работоспособность при конкурентном доступе

FK не даст создать запись без "free", а UQ не даст создать дубль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659153
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя нет, всё равно можно будет вставить запись, если проверять некорректно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659161
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Схема избыточно сложна и не гарантирует отсутствия пересекающихся интервалов.
Код: sql
1.
2.
3.
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 8, 12, 'busy');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 12, 16, 'free');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 16, NULL, 'busy');


Ничто не мешает добавить
Код: sql
1.
2.
3.
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 11, 12, 'busy');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 10, 12, 'busy');
INSERT INTO BRON (OBJ, DATA, H1, H2, STATUS) VALUES (1, '10-JUN-2018', 9, 12, 'busy');
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659163
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это да, если некорректно проверять, то можно сделать грязь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659167
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Навскидку, даже если не делать соотв. проверку в клиенте/процедуре, то что-то вроде

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
create or alter trigger bron_biu0 for bron
active before insert or update position 0
as
BEGIN
   IF ((new.status <> 'free') and
      (exists(select 1 from BRON b
              where (b.obj = new.obj) and (b.data = new.data)
                       and (new.h1 between b.h1 and b.h2)
             ))) then
     exception BOOM new.h1;
END



упрощает и эту проблему.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659169
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов Рустам
Код: sql
1.
and (new.h1 between b.h1 and b.h2)



А где
Код: sql
1.
or (new.h2 between b.h1 and b.h2)

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

Хотя, если предполагается, что можно забронировать с 2 до 5, а
потом с 8 до 3 - да, нужно будет добавить и это условие. И не только.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659174
IBExpert
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если интервалы бронирования строго часовые, тогда уж на каждый час создавать отдельную запись в таблице бронирования. И индекс без проблем прикручивается.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659182
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это ещё на первой странице предложили и он
собсно на подобном варианте и остановился.
Но это доп. 8х/24х строк, только для уникальности.

И это щас строго часовые, а потом ситуация
"внезапно" изменится и понадобятся получасы...
Это, видимо, медицина или какой-то сервис
(салоны, парикхмахерские, авто и пр.) - а там
всё возможно, полёт фантазий богатый.
...
Рейтинг: 0 / 0
Сложная проверка на уникальность
    #39659232
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамЭто, видимо, медицина или какой-то сервис
бордель с почасовыми комнатами.
...
Рейтинг: 0 / 0
76 сообщений из 76, показаны все 4 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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