Быстрый вопрос: в ArangoDB, если я создаю уникальный индекс (например, уникальный хеш-индекс), делает ли ArangoDB проверку уникальности этого атрибута или просто предположим, потому что я сказал, что он уникален? Мне интересно, если я должен пройти этап проверки, чтобы проверить уникальность моих данных, прежде чем создавать уникальные индексы.Проверка достоверности индекса ArangoDB
0
A
ответ
3
Как вы знаете, ArangoDB накапливает индексы, прежде чем вы сможете их использовать. Если это не удается обеспечить уникальность, он будет бросать исключение:
127.0.0.1:[email protected]_system> c = db._create("c")
[ArangoCollection 169, "c" (type document, status loaded)]
127.0.0.1:[email protected]_system> c.insert({"abc":1})
{
"_id" : "c/172",
"_key" : "172",
"_rev" : "_T1m73_m---"
}
127.0.0.1:[email protected]_system> c.insert({"abc":1})
{
"_id" : "c/176",
"_key" : "176",
"_rev" : "_T1m748K---"
}
127.0.0.1:[email protected]_system> c.ensureIndex(
...> {"type":"hash","unique":true,"fields":["abc"]})
JavaScript exception in file '.../arangosh.js' at 97,7:
ArangoError 1210: unique constraint violated
! throw error;
! ^
stacktrace: ArangoError: unique constraint violated
at Object.exports.checkRequestResult (.../arangosh.js:95:21)
at ArangoCollection.ensureIndex (.../arango-collection.js:733:12)
at <shell command>:1:3
127.0.0.1:[email protected]_system> c.ensureIndex(
...> {"type":"skiplist","unique":true,"fields":["abc"]})
JavaScript exception in file '.../arangosh.js' at 97,7:
ArangoError 1210: unique constraint violated
! throw error;
! ^
stacktrace: ArangoError: unique constraint violated
at Object.exports.checkRequestResult (.../arangosh.js:95:21)
at ArangoCollection.ensureIndex (.../arango-collection.js:733:12)
at <shell command>:1:3
Подобно тому, что он делает, если вы пытаетесь вставить документ, который нарушает ограничение уникальности:
127.0.0.1:[email protected]_system> db._drop("c")
127.0.0.1:[email protected]_system> c = db._create("c")
[ArangoCollection 315, "c" (type document, status loaded)]
127.0.0.1:[email protected]_system> c.ensureIndex({
...>"type":"skiplist","unique":true,"fields":["abc"]})
{
"id" : "c/318",
"type" : "skiplist",
"fields" : [
"abc"
],
"unique" : true,
"sparse" : false,
"isNewlyCreated" : true,
"code" : 201
}
127.0.0.1:[email protected]_system> c.insert({"abc":1})
{
"_id" : "c/330",
"_key" : "330",
"_rev" : "_T1n-B2S---"
}
127.0.0.1:[email protected]_system> c.insert({"abc":1})
JavaScript exception in file '.../arangosh.js' at 97,7:
ArangoError 1210: cannot create document, unique constraint violated
! throw error;
! ^
stacktrace: ArangoError: cannot create document, unique constraint violated
at Object.exports.checkRequestResult (.../arangosh.js:95:21)
at ArangoCollection.save.ArangoCollection.insert
(.../arango-collection.js:978:14)
at <shell command>:1:3
Так что, если вам вставьте свои документы во время установки приложения перед созданием индекса (по соображениям эффективности - жизнеспособный подход) вам необходимо обработать возможные исключения при создании этих индексов впоследствии.
Спасибо! Это отвечает на мой вопрос. Так как вы увеличиваете производительность добавления данных после создания индекса, есть ли способ временно отключить индексирование во время вставки, а затем обновить индекс в конце? Я предполагаю, что это нарушает ACID, но я в порядке с этим. Мне нужно вставить огромное количество ребер. Создание определений отношений само по себе принесет большую пользу от индексации (очень большое соединение «многие-ко-многим»), но операция вставки значительно замедляется путем индексирования, тем самым устраняя преимущество производительности. –