powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность
25 сообщений из 76, страница 1 из 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
25 сообщений из 76, страница 1 из 4
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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