|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#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 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
WildSery> Диапазон может вставляться ... перечислением всех часов. Может, но это извращение в гамаке стоя, ИМХО. Хуже его первоначального варианта. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:57 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
IBExpert> Чем триггеры-то не угодили? Необходимостью работы с транзакциями и конфликтами. С индексом было бы проще - навесил и забыл. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:58 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
IBExpert, триггерами и процедурой нельзя гарантировать невозможность вставки одних и тех же значений. 1 транзакция - вставляем А 1 триггер - А нету 2 транзакция - вставляем А 2 триггер - А нету 1 транзакция коммит 2 транзакция коммит ОПА! Так что вот этот "масочный" контроль устроить можно было бы только вычисляемым индексом (скорее, индексом по вычисляемому столбцу). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 16:58 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> Так, прикинуть: 365 дней в году, по 8 записей на день Когда бронь растянется - попомни это обсуждение. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:00 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp30-45к записей в год. В принципе не много, я так понимаю? это вообще ни о чём. Даже если бы пара миллионов записей была. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:00 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
kdv> только вычисляемым индексом (скорее, индексом по вычисляемому столбцу). Даже им нельзя, AFAIS - к, примеру, 1-5, 4-7. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:02 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, 50К записей в год, в таблице из 3-4 полей простого типа - это вообще ни о чём. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:06 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
kdvТак что вот этот "масочный" контроль устроить можно было бы только вычисляемым индексом (скорее, индексом по вычисляемому столбцу). Ну вот я и спрашивал про 8 индексов (каждый имеет вычисляемый столбец со значением NULL или 1 для соответствующего бита) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:11 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
WildSeryalekcvp, 50К записей в год, в таблице из 3-4 полей простого типа - это вообще ни о чём. Там около 10 полей, в т.ч. 1 varchar(256), я привёл только значимые. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:12 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> Там около 10 полей, в т.ч. 1 varchar(256), я привёл только значимые. Вы, кажется, о разном говорите. Дублировать записи не будет нужно, просто ссылаться на соотв. час. Если я правильно понял Сержа. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:22 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, Для именно резервирования можно отдельную таблицу. Причём, если ожидается резкий рост числа объектов (несколько порядков), то можно придумать структуру хранения "с архивацией", чтобы старые периоды сжимались в другой, компактный вид - ведь, как я понимаю, резервирования задним числом быть не может? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:24 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
А, или ты про 8 индексов на каждый час? Ужас-ужас. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:25 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
В общем я подумал и решил немного модифицировать идеи выше: Таблицу с резервированием я разобью на две: в первой будет - id, кто, что, описание и т.п., а во второй только: res_id (= id из первой), объект, дата, номер часа. И, соответственно, во второй сделаю уникальный индекс по всем полям, кроме res_id. Какие-нибудь замечания или дополнения можете сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:26 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, Собственно, так и предлагал :) Замечания если и будут, то уже по реализации. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:32 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> Какие-нибудь замечания или дополнения можете сделать? Лишь повторюсь - в погоне за простотой уникальности ты значительно усложняешь реализацию и сопровождение. Гора родит Годзиллу вместо мыши. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:46 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамЛишь повторюсь - в погоне за простотой уникальности ты значительно усложняешь реализацию и сопровождение. А как иначе избежать этого 21482445 ? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 17:59 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> А как иначе избежать этого 21482445? Уникальность (непересекаемость) интервалов (дат, чисел) нормального (простого, адекватного) решения не имеет, ИМХО. Те которые есть (например, с непрерывными интервалами и FK от D2 на D1) на мой вкус уродливы, так что лично я бы выбирал алгоритмическое решение - например, с пессим. блокировкой нужного интервала (или перечня записей на каждый час) или по варианту Влада. Дублирование записей на каждый час лично мне не нравится. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 19:38 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Ну ещё есть вариант делать с маской, проверку через триггер, а для избегания сценария от kdv - делать очень короткую пишущую транзакцию (wait) и первым делом в ней блокировать строку с объектом в справочнике объекта. Тогда не будет синхронных резервирований одного объекта и, соответственно, описанной ситуации. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 19:49 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
я бы вынес проверки из БД например, отдельный сервис сделать, который отвечает за бронирование ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 19:56 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> делать очень короткую пишущую транзакцию (wait) и alekcvp> первым делом в ней блокировать строку с объектом Ну это та же пессим.блокировка, только не дат, а объекта. Т.е. ещё хуже, по сути. А пишущие транзакции итак всегда должны быть максимально короткими. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 20:17 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Дегтярев Евгений> я бы вынес проверки из БД. например, отдельный сервис сделать, который отвечает за бронирование Если делать отдельный сервис как промежуточное звено, то это ещё большее усложнение, т.е. развести стадо Годзилл, летающих. :) А если делать накопление "заявок" в очередь внутри БД с послед. обработкой одним коннектом, т.е. сильно асинхронно - клиент не увидит статуса своей заявки "сразу". Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 20:20 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов РустамНу это та же пессим.блокировка, только не дат, а объекта. А даты в такой модели не заблокировать никак... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 20:50 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> А даты в такой модели не заблокировать никак... Ну, зависит от доп. таблиц. Например, если в доп.таблице будут те самые "ID, Date, Hour" - можно их блокировать, потом снимать блокировку (поскольку для послед.работы и селектов они уже будут не нужны). Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 21:00 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Кстати, про архитектуру/область ты ничего не сказал. Это двузвенка или трехзвенка с Web-ом или что ? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 21:01 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, Приложение напрямую к серверу БД коннектится, не вижу смысла заморачиваться с 3хзвенкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 21:07 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp, а если экземпляр один то и с блокировкой можно не заморачиваться ) авторА даты в такой модели не заблокировать никак... даты можно и не блокировать, т.к. обращения к одному объекту уже сериализованы при низкой конкуренции на один объект вполне себе решение ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 21:44 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
авторЕсли делать отдельный сервис как промежуточное звено, то это ещё большее усложнение, да усложнение, но это, так сказать, вариант на вырост ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 21:47 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Дегтярев Евгенийalekcvp, а если экземпляр один то и с блокировкой можно не заморачиваться ) Пишущих экземпляров где-то 2-5 планируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:04 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
В общем, я щас подумал - поскольку таблица брони всё равно дополнительная к справочнику, то можно и декларативно, пожалуй (с доп. полем 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:06 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
В общем, тут думать надо! (с) P.S. В топик призывается Дед. :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:07 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvp> Пишущих экземпляров где-то 2-5 планируется. Тю, ради 2-5 заморачиваться и смысла особо нет. Лочишь и всё, где ж там узкое место-то?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:08 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
alekcvphvladСоздай доп таблицу (ID, Value) с уникальностью на оба поля. Перед вставкой в основную таблицу (например в триггере before insert\update) вставь ID, Value в доп таблицу. Если удалось - можно обычным селектом проверить наличие конфликтующей маски в основной таблице. Если не удалось - откат и повтор (или отказ от операции).Дык, в том и дело, что ID и Value могут быть не уникальными.Моя модель этому не противоречит. Она сводит конкуренцию в доп таблице к разумному минимуму. У тебя варианты - лочить ID, лочить ID + Value, лочить несколько записей: ID + Value + каждый бит в маске. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:45 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
hvlad> У тебя варианты - лочить А как тебе вариант с непрерывными интервалами? Слишком муторно? :) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 22:52 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
hvladalekcvpпропущено... Дык, в том и дело, что ID и Value могут быть не уникальными.Моя модель этому не противоречит. Она сводит конкуренцию в доп таблице к разумному минимуму. У тебя варианты - лочить ID, лочить ID + Value, лочить несколько записей: ID + Value + каждый бит в маске. А, со второго раза дошла идея. Ну, в моём случае проще лочить ID, наверное. Т.к. конкуренция маленькая. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 23:00 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамhvlad> У тебя варианты - лочить А как тебе вариант с непрерывными интервалами? Слишком муторно? :)Если я правильно понял этот вариант, то с точки зрения синхронизации интервалы и маски никак не отличаются. С точки зрения поиска пересечений - маски проще, интервалы гибче. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 23:18 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
hvlad> с точки зрения синхронизации интервалы и маски никак не отличаются. На маску UK не навесишь, а на интервал - можно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 23:25 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустамhvlad> с точки зрения синхронизации интервалы и маски никак не отличаются. На маску UK не навесишь, а на интервал - можно.Пример давай, посмотрим ... |
|||
:
Нравится:
Не нравится:
|
|||
09.06.2018, 23:47 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Я же привёл выше. Щас DDL/DML набросаю. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:00 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам, где выше ? Я не буду перечитывать 3 страницы в поисках ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:08 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Если ты про это 21482910 , то я не вижу как гарантируется работоспособность при конкурентном доступе ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:09 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Вот, 2 варианта поля использования полей H2/Status: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:17 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
hvlad> то я не вижу как гарантируется работоспособность при конкурентном доступе FK не даст создать запись без "free", а UQ не даст создать дубль. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:19 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Хотя нет, всё равно можно будет вставить запись, если проверять некорректно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 00:21 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Схема избыточно сложна и не гарантирует отсутствия пересекающихся интервалов. Код: sql 1. 2. 3.
Ничто не мешает добавить Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 01:06 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Это да, если некорректно проверять, то можно сделать грязь. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 01:13 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Навскидку, даже если не делать соотв. проверку в клиенте/процедуре, то что-то вроде Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
упрощает и эту проблему. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 02:27 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Гаджимурадов Рустам Код: sql 1.
А где Код: sql 1.
? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 02:32 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Разумеется, это неполный/неточный код, ибо зависит от реализации. К примеру, если h2 - нулл, битвин не сработает. Но как раз проверять надобности, по идее, нет, ибо в нормальной ситуации интервалы всегда двигаются вправо. Хотя, если предполагается, что можно забронировать с 2 до 5, а потом с 8 до 3 - да, нужно будет добавить и это условие. И не только. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 03:28 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Если интервалы бронирования строго часовые, тогда уж на каждый час создавать отдельную запись в таблице бронирования. И индекс без проблем прикручивается. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 05:03 |
|
Сложная проверка на уникальность
|
|||
---|---|---|---|
#18+
Это ещё на первой странице предложили и он собсно на подобном варианте и остановился. Но это доп. 8х/24х строк, только для уникальности. И это щас строго часовые, а потом ситуация "внезапно" изменится и понадобятся получасы... Это, видимо, медицина или какой-то сервис (салоны, парикхмахерские, авто и пр.) - а там всё возможно, полёт фантазий богатый. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.06.2018, 09:35 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561078]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
141ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
101ms |
get tp. blocked users: |
1ms |
others: | 336ms |
total: | 624ms |
0 / 0 |