【问题标题】:ArangoDB Unique Index ValidationArangoDB 唯一索引验证
【发布时间】:2016-09-30 01:11:01
【问题描述】:

快速提问:在 ArangoDB 中,如果我创建一个唯一索引(例如唯一哈希索引),ArangoDB 会验证该属性的唯一性,还是仅仅假设它是因为我告诉它它是唯一的?我很好奇在创建唯一索引之前是否应该通过验证步骤来验证我的数据的唯一性。

【问题讨论】:

    标签: indexing arangodb aql


    【解决方案1】:

    如您所知,ArangoDB 会在您使用索引之前建立索引。 如果不能保证唯一性,会抛出异常:

    127.0.0.1:8529@_system> c = db._create("c")
    [ArangoCollection 169, "c" (type document, status loaded)]
    127.0.0.1:8529@_system> c.insert({"abc":1})
    { 
      "_id" : "c/172", 
      "_key" : "172", 
      "_rev" : "_T1m73_m---" 
    }
    127.0.0.1:8529@_system> c.insert({"abc":1})
    { 
      "_id" : "c/176", 
      "_key" : "176", 
      "_rev" : "_T1m748K---" 
    }
    127.0.0.1:8529@_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:8529@_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:8529@_system> db._drop("c")
    127.0.0.1:8529@_system> c = db._create("c")
    [ArangoCollection 315, "c" (type document, status loaded)]
    
    127.0.0.1:8529@_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:8529@_system> c.insert({"abc":1})
    { 
      "_id" : "c/330", 
      "_key" : "330", 
      "_rev" : "_T1n-B2S---" 
    }
    
    127.0.0.1:8529@_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,但我可以接受。我必须插入大量边缘。创建关系定义本身会从索引中受益很多(非常大的多对多连接),但插入操作会因索引而显着减慢,从而消除了性能优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多