唯一对象标识符
在 C 和 C++ 应用程序中,可以为数据库声明一个对象标识符(oid),并用其快速检索所标识的对象。oid 值由应用程序分配,但在数据库中的所有类中必须是唯一的,并且在创建对象时由 SmartEDB 运行时强制执行唯一性。另外,C/C++ 以及所有其他原生语言的 API,都可以使用自动标识符(autoid)来唯一标识对象。自动标识符是由 SmartEDB 运行时生成的保证唯一的值。
C API
如果为数据库声明了对象标识符(oid),则模式编译器会生成一个与定义该 oid 的结构相对应的 C 结构。例如,对于包含如下 oid 声明的模式:
struct structname
{
uint4 num_in;
};
declare oid structname[10000];
模式编译器将生成以下定义和函数:
typedef struct databasename_oid__
{
uint4 num_in;
}
databasename_oid;
static const uint2 databasename_oid_size = sizeof(databasename_oid);
MCO_RET databasename_delete_object( /*IN*/ mco_trans_h t,
/*IN*/ const databasename_oid * oid );
MCO_RET databasename_get_class_code( /*IN*/ mco_trans_h t,
/*IN*/ const databasename_oid * oid,
/*OUT*/ uint2 *classcode );
请注意这些定义中前面添加的数据库名称。这表明对于给定的数据库,只能定义一个 oid,并且运行时将强制执行该 oid 所有值的唯一性。databasename_delete_object() 函数根据对象的 oid 删除对象。databasename_get_class_code() 函数返回一个整数,该整数标识由指定的 oid 值引用的对象的类。 对于包含 oid 的类,将生成以下两个函数,用于根据对象的 oid 定位对象以及提取对象的 oid;
MCO_RET classname_oid_find( /*IN*/ mco_trans_h t,
/*IN*/ const databasename_oid *id,
/*OUT*/ classname *handle );
MCO_RET classname_oid_get( /*IN*/ classname *handle,
/*OUT*/ databasename_oid *id );
(请注意,oid 特性在创建类实例之前会检查键的唯一性。通常情况下,键的唯一性是在事务提交时进行测试的。)
oid 特性在 C# 和 Java API 中不受支持。因此,C# 和 Java 应用程序使用其他方法,例如自增 ID 和唯一索引来作为对象标识符。
Autoids
自动标识符(Autoids)是由 SmartEDB 运行时生成的保证唯一的值。对于 C 和 C++ 应用程序,自动标识符在 DDL 类定义中声明,并指定该类的预计对象数量。当声明一个类具有自动标识符时,模式编译器将为该类生成以下两个函数:
MCO_RET classname_autoid_find( /*IN*/ mco_trans_h t,
/*IN*/ autoid_t id,
/*OUT*/ classname *handle );
MCO_RET classname_autoid_get( /*IN*/ classname *handle,
/*OUT*/ autoid_t *id );
应用程序可以使用 classname_autoid_get() 函数获取自增 ID 值。无论是存储在程序变量中还是作为引用存储在另一个数据库对象的字段中,自增 ID 值都可以在 classname_autoid_find() 函数中使用,以定位被引用的对象。
在 Java 和 C# 类中,通过 Persistent 注解或属性来定义自增 ID,例如:
Java:
@Persistent(autoid=true)
class Record
{
...
}
C#:
[Persistent(AutoID=true)]
class Record
{
...
}
当创建具有自动标识符的类的对象时,运行时会为该对象生成一个唯一的自动标识符。可以使用游标方法 GetAutoid() 获取对象的自动标识符,并且可以使用游标方法 Find() 在数据库中搜索具有指定自动标识符的对象。
请注意,添加 oid 或 autoid 会导致 SmartEDB 运行时维护一个内部哈希索引,该索引会随着数据库对象的增加而增长。随着此哈希索引的增长,可能会影响数据库的整体性能。