继承
和许多对象-关系映射工具不同,OrientDB不是按照不同的类分割文档。每一个文档都存在于一个或者多个和它的类相关的集群中。当你针对一个拥有子类的类进行查询时,OrientDB会搜索目标类及其所有子类。
在模式中声明继承
在开发应用时,牢记OrientDB需要知道类之间的继承关系。这是一个抽象的概念应用到POJO's和Documents。
例如,
OClass account = database.getMetadata().getSchema().createClass("Account");
OClass company = database.getMetadata().getSchema().createClass("Company").setSuperClass(account);
使用多态查询
默认的,OrientDB把所有的查询都当做多态。利用上面的例子,你可以运行下面的查询:
orientdb> SELECT FROM Account WHERE name.toUpperCase() = 'GOOGLE'
这个查询会返回类Account
和Company
属性名称匹配Google
的所有实例。
继承是如何工作的
来看一个例子,你有三个类,下面列举出来,括号中是簇的标示。
Account(10) <|--- Company (13) <|--- OrientTechnologiesGroup (27)
默认的,OrientDB会给每个类创建一个单独的簇。这表示类OClass
的属性defaultClusterId
就是默认的簇。然而, 类OClass
有个属性clusterIds
, (int[]
), 包含了所有存储了这个类记录的簇。clusterIds
和 defaultClusterId
默认相同。
当你针对一个类执行查询时,OrientDB会限制结果集在clusterIds
属性。例如
orientdb> SELECT FROM Account WHERE name.toUpperCase() = 'GOOGLE'
因为指定了基类Account,这个查询返回所有三个类中name属性值为GOOGLE
的记录。对于类Account
, OrientDB会查询簇 10
, 13
和17
, 顺着模式的继承关系。