2016-09-30 5 views
0

Schnelle Frage: Wenn ich in ArangoDB einen eindeutigen Index (zum Beispiel einen eindeutigen Hash-Index) erzeuge, validiert ArangoDB die Eindeutigkeit dieses Attributs oder nimmt es einfach an, weil ich ihm gesagt habe, dass es einzigartig ist? Ich bin neugierig, ob ich einen Validierungsschritt durchführen sollte, um die Eindeutigkeit meiner Daten zu überprüfen, bevor ich eindeutige Indizes erstelle.ArangoDB Unique Index Validation

Antwort

3

Wie Sie wissen, baut ArangoDB die Indizes auf, bevor Sie sie verwenden können.

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 

ähnlich, was es tut, wenn Sie versuchen, ein Dokument einzufügen, das die eindeutige Einschränkung verletzt: Wenn es die Eindeutigkeit gewährleisten fehlschlägt, wird eine Ausnahme werfen

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 

, wenn Sie also Fügen Sie Ihre Dokumente während des Setups Ihrer Anwendung ein, bevor Sie den Index erstellen (aus Performancegründen ein praktikabler Ansatz). Sie müssen beim Erstellen dieser Indizes mögliche Ausnahmen behandeln.

+0

Danke! Das beantwortet meine Frage. Da Sie die Leistung des Hinzufügens von Daten nach dem Erstellen des Index aufrufen, gibt es eine Möglichkeit, die Indizierung während einer Einfügung vorübergehend zu deaktivieren und dann den Index am Ende zu aktualisieren? Ich nehme an, dies verletzt ACID, aber damit bin ich einverstanden. Ich muss eine große Anzahl von Kanten einfügen. Das Erstellen der Beziehungsdefinitionen selbst würde sehr von der Indizierung profitieren (sehr große Viele-zu-Viele-Joins), aber die Einfügeoperation wird durch Indizierung erheblich verlangsamt, wodurch der Leistungsvorteil eliminiert wird. –