|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Всем доброго дня. Есть табличка в базе, в ней есть три поля, путь будут INDEX, VALUE: Integer; MASK: SmallInt. Теперь надо сделать проверку на уникальность, по условию: Код: plaintext
Т.е. либо разные Index и/или Value, либо одинаковые, но тогда нет общих битов в маске. Вопрос: можно ли и стоит ли это делать средствами Firebird (и если да, то как?) или забить и реализовать проверку в приложении? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 13:07 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, можно сделать. Несколько вариантов (не все возможные) на выбор. 1) в процедуре добавления, обновления данных. 2) в триггерах на INSERT, UPDATE ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 13:37 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Filippov Dmitryalekcvp, можно сделать. Несколько вариантов (не все возможные) на выбор. 1) в процедуре добавления, обновления данных. 2) в триггерах на INSERT, UPDATE 1. добавляться будет сразу из приложения, без ХП. 2. А как грамотно проверить? Что-то типа: Код: plsql 1. 2. 3. 4.
И стоит ли тогда сделать какой-нибудь индекс, чтобы проверка быстрее проходила? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 14:08 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, если это не курсовик и т. п. все таки рекомендую работу делать через хранимые процедуры. Чтобы вести предметный разговор про индексы требуется немного больше информации: структура таблицы, какие данные, их состав / объем, режим работы (как обновляется, пополняется).. да и еще много чего. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 14:18 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Filippov Dmitryalekcvp, если это не курсовик и т. п. все таки рекомендую работу делать через хранимые процедуры. Чтобы вести предметный разговор про индексы требуется немного больше информации: структура таблицы, какие данные, их состав / объем, режим работы (как обновляется, пополняется).. да и еще много чего. Это простейшая программа, на три таблички, для резервирования объектов. Справочник объектов, справочник пользователей и табличка, собственно, с резервированием. Index - это ID объекта, Value - дата (без времени), Mask - рабочие часы (интервал резервирования кратен часу). Не курсовой, но чисто для облегчения жизни внутри отдела. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 14:57 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, А что, нужно не позволять делать update или Insert? ИМХО, на клиенте удобнее это делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 14:57 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
KreatorXXIalekcvp, А что, нужно не позволять делать update или Insert? ИМХО, на клиенте удобнее это делать. Нужно сказать "упс, занято", если пересекается по времени. Просто мне казалось что правильнее будет это контролировать на сервере, чтобы корректность данных проверялась в одном месте, а не то там, то там. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 15:02 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvpПросто мне казалось что правильнее будет это контролировать на сервере,более того, такой контроль можно только на сервере и гарантировать. И не триггером или хранимкой, а уникальным индексом. Вычисляй поле по своим критериям и уникальный индекс на него навесь. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 15:32 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Чтобы контролировать уникальность, нужно гарантировать отсутствие конкурентных вставок конфликтующих значений. Это можно сделать, например, так. Создай доп таблицу (ID, Value) с уникальностью на оба поля. Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу. Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице. Если не удалось - откат и повтор (или отказ от операции). После вставки в основную таблицу - убери за собой из дополнительной. Ну, или откажись от масок и вставляй несколько (ID, Value, Hour) в основную таблицу с обычным контролем уникальности по 3-м полям ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 15:37 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
hvladСоздай доп таблицу (ID, Value) с уникальностью на оба поля. Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу. Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице. Если не удалось - откат и повтор (или отказ от операции).Дык, в том и дело, что ID и Value могут быть не уникальными. hvladНу, или откажись от масок и вставляй несколько (ID, Value, Hour) в основную таблицу с обычным контролем уникальности по 3-м полямПри типовом сценарии - количество записей в таблице вырастет в 8 раз... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 15:53 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Интересно, а если 8 индексов по 3 полям сделать - это совсем маразм будет? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 15:58 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> Интересно, а если 8 индексов по 3 полям сделать - это совсем маразм будет? :) Исходная задача сама по себе довольно маразматична. Забудь пока про два остальных поля и думай, что и как делать с маской. Потом можно будет добавить 2 поля. Например, что вообще оозначает несовпадение битов - что человек не работал в 1 час на нескольких объектах или что? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:05 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамalekcvp>Например, что вообще оозначает несовпадение битов - что человек не работал в 1 час на нескольких объектах или что? 8 рабочих часов - 8 бит. Бит установлен -> в этот час объект занят. Биты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:24 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvpГаджимурадов Рустамalekcvp>Например, что вообще оозначает несовпадение битов - что человек не работал в 1 час на нескольких объектах или что? 8 рабочих часов - 8 бит. Бит установлен -> в этот час объект занят. Биты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно. не знаю всей задачи, но лучше отказаться от битов и все таки считать в штуках. Потому как "полбита" не посчитать, а человек (или объект) занят полчаса, а потом полчаса не занят - это вполне жизненно. Лучше бы перепроектировать структуру! ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:27 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Например, имеется запись A: Код: plaintext
Пытаемся добавить запись B: Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:30 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Filippov DmitryПотому как "полбита" не посчитать, а человек (или объект) занят полчаса, а потом полчаса не занят - это вполне жизненно.В моём случае это исключено. Либо занято весь час, либо свободно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:31 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Нафиг такие извращения? Разбить MASK на два поля - начало и конец интервала в часах. Или стоит задача 8 байт на каждой записи сэкономить? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:39 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, тогда получается таблица (примерно) ID объекта, час уникальный индекс по этим двум полям. при резервировании записываем. Дубликат не вставишь! И вроде никаких масок не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:40 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvpБиты совпадают - конфликт, один объект не может использоваться двумя пользователями одновременно. Например, имеется запись A: 1 10.07.2018 00011100кто-то зарезервировал объект с ID = 1 на 10е июля с 10 до 13 часов. А, т.е. некое бронирование. Это можно и это гораздо проще. Переделай эти маски на нормальные интервалы - заодно и спасибо позже скажешь, когда/если появится необходимость бронировать более 8 часов или график будет неодинаковый у разных объектов/дней - и тогда вопрос снимется сам собой. Вернее, не снимется - пересечение интервалов придётся проверять вручную, без всяких индексов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:45 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
IBExpertНафиг такие извращения? Разбить MASK на два поля - начало и конец интервала в часах. Или стоит задача 8 байт на каждой записи сэкономить? А как тогда искать пересечения? В случае с масками будет A and B = 0 (чисто) <> 0 (пересекаются), а если интервалы хранить, то надо 4 сравнения делать. И как это поможет с уникальным индексом? А в триггере - без разницы, маски или интервалы. К тому же, если интервал, например, с 10 до 12 и с 13 до 15 в один день, то с маской это одна запись, а с интервалами - две. Filippov DmitryID объекта, час уникальный индекс по этим двум полям. Дата ещё, и получится, как выше советовали, просто в основной таблице по записи на каждый час резервирования. Т.е. размер x8 и в приложении сложнее обрабатывать, т.к. потом из набора всё равно маску собирать придётся для отображения/редактирования. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:49 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Диапазон может вставляться не "нормальным" диапазоном, а перечислением всех часов. Тогда уникальность сработает. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:50 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамВернее, не снимется - пересечение интервалов придётся проверять вручную, без всяких индексов. Ну так если пересечение всё равно придётся вручную проверять, то с масками и проверка проще: bin_and(a, b) = 0 и всё. Т.е. я так понимаю - в любом случае проверку придётся делать триггером? Гаджимурадов Рустамкогда/если появится необходимость бронировать более 8 часов или график будет неодинаковый у разных объектов/дней Больше 24 часов в день всё равно не забронировать, а Integer - 32х-битный. А для разных дней и так разные записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:53 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvpТ.е. размер x8 и в приложении сложнее обрабатыватьНичё не сложнее. Даже наоборот. Сто раз так делал для всяких расписаний и мест хранения. Размер - фигня, это всё жалкие байты. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:54 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvpИ как это поможет с уникальным индексом? А в триггере - без разницы, маски или интервалы. Ну тогда и делай в триггере, раз битовая маска тебя полностью устраивает. Чем триггеры-то не угодили? Проверил маску, обнаружил пересечение - выбросил исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:55 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
WildSeryГаджимурадов Рустам, Диапазон может вставляться не "нормальным" диапазоном, а перечислением всех часов. Тогда уникальность сработает. Так, прикинуть: 365 дней в году, по 8 записей на день, 10-15 объектов ~ 30-45к записей в год. В принципе не много, я так понимаю? Правда я ещё для повторяющихся событий хотел сделать ссылку на ID первой записи, чтобы можно было редактировать всю группу, придётся ещё одно поле добавлять... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:57 |
|
|
start [/forum/topic.php?fid=40&msg=39659001&tid=1561078]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
61ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 310ms |
total: | 467ms |
0 / 0 |