2016-09-30 4 views
0

Быстрый вопрос: в ArangoDB, если я создаю уникальный индекс (например, уникальный хеш-индекс), делает ли ArangoDB проверку уникальности этого атрибута или просто предположим, потому что я сказал, что он уникален? Мне интересно, если я должен пройти этап проверки, чтобы проверить уникальность моих данных, прежде чем создавать уникальные индексы.Проверка достоверности индекса ArangoDB

ответ

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 

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

+0

Спасибо! Это отвечает на мой вопрос. Так как вы увеличиваете производительность добавления данных после создания индекса, есть ли способ временно отключить индексирование во время вставки, а затем обновить индекс в конце? Я предполагаю, что это нарушает ACID, но я в порядке с этим. Мне нужно вставить огромное количество ребер. Создание определений отношений само по себе принесет большую пользу от индексации (очень большое соединение «многие-ко-многим»), но операция вставки значительно замедляется путем индексирования, тем самым устраняя преимущество производительности. –