Как я могу обеспечить уникальность значений элементов? - PullRequest
0 голосов
/ 08 июня 2018

Мы используем MarkLogic Server для хранения некоторых рабочих данных приложения, и одно из основных требований часто заключается в том, что какое-то значение элемента является уникальным для всех документов в базе данных (например, адрес электронной почты, который пользователям следует разрешить изменять, но это должно бытьуникальный для всех пользователей в базе данных).Есть ли способ заставить MarkLogic Server обеспечить такие ограничения уникальности независимо от того, как записывается база данных (например, используя XQuery, ReST или XCC)?Мы хотели бы не проверять уникальность каждого приложения, поскольку это потенциально небезопасно и трудно сделать правильно.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Вам нужно сделать какую-то проверку.Как вы сказали, гораздо лучше выполнять проверку на стороне сервера, чем на стороне клиента.

Есть несколько способов сделать это.Вот несколько предложений:

1) Включите адрес в структуру URI и не предоставляйте разрешения на обновление документа загрузчику данных.

Создайте структуру URI, например: / data / normalizedAddress.XML

Не назначайте разрешения на обновление документа, который может иметь загружающий пользователь.

Если вы попытаетесь загрузить документ, который уже использует этот URI, сервер выдаст ошибку, которую вы не можетеобновите существующий документ.

Убедитесь, что URI создан на стороне сервера, а не на стороне клиента, используя что-то вроде преобразования или пользовательской конечной точки.

2) Используйте cts: search или какой-либо другой вариант, чтобы увидеть, является ли адресуже существует в другом документе, а затем выдает ошибку, если это так.

0 голосов
/ 08 июня 2018

Я обычно использую триггеры предварительной фиксации для подобных ситуаций.Это немного замедляет прием, но хорошо работает, чтобы предотвратить вставку, когда какая-то проверка не выполняется.Просто выдавайте ошибку (вызывая fn:error) в этом случае, и обновление откатывается.

Чтобы на самом деле проверить, не было ли еще какое-либо значение, вам нужно выполнить поиск (например, используяcts:search или поиск в лексиконе (используя, например, cts:values).

Вы можете использовать xdmp:lock-for-update на поддельном URI (который включает в себя имя и значение элемента), чтобы гарантировать, что только один параллельный поток действительно может записать, чтозначение в то же время. Другие будут ждать или перезапускать, и заметить, что значение принято. Это действительно нужно только для высокоскоростной загрузки.

Хотя последняя вызовет конфликт, поэтому прием может замедлиться, если многоодновременных потоков пытаются получить одно и то же уникальное значение.

HTH!

...