Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность / 25 сообщений из 76, страница 1 из 4
09.06.2018, 13:07
    #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
09.06.2018, 13:37
    #39658860
Filippov Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная проверка на уникальность
alekcvp,

можно сделать.
Несколько вариантов (не все возможные) на выбор.
1) в процедуре добавления, обновления данных.
2) в триггерах на INSERT, UPDATE
...
Рейтинг: 0 / 0
09.06.2018, 14:08
    #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
09.06.2018, 14:18
    #39658891
Filippov Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная проверка на уникальность
alekcvp,

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

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

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

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

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

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

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

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

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

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

Лучше бы перепроектировать структуру!
...
Рейтинг: 0 / 0
09.06.2018, 16:30
    #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
09.06.2018, 16:31
    #39658979
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная проверка на уникальность
Filippov DmitryПотому как "полбита" не посчитать, а человек (или объект) занят полчаса, а потом полчаса не занят - это вполне жизненно.В моём случае это исключено. Либо занято весь час, либо свободно.
...
Рейтинг: 0 / 0
09.06.2018, 16:39
    #39658986
IBExpert
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная проверка на уникальность
Нафиг такие извращения? Разбить MASK на два поля - начало и конец интервала в часах.
Или стоит задача 8 байт на каждой записи сэкономить?
...
Рейтинг: 0 / 0
09.06.2018, 16:40
    #39658988
Filippov Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложная проверка на уникальность
alekcvp,

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

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

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

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

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

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

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

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

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

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

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

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


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

Так, прикинуть: 365 дней в году, по 8 записей на день, 10-15 объектов ~ 30-45к записей в год. В принципе не много, я так понимаю?
Правда я ещё для повторяющихся событий хотел сделать ссылку на ID первой записи, чтобы можно было редактировать всю группу, придётся ещё одно поле добавлять...
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Сложная проверка на уникальность / 25 сообщений из 76, страница 1 из 4
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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