数据库模式
正如 Java 快速入门中所解释的那样,JNI 使用带有注释的 Java 类语法。在运行时,Java 反射用于发现带有注释的类,并构建 SmartEDB 数据库字典。请注意,注释 @Persistent() 标记一个 Java 类,使其在内存数据库中由 SmartEDB 运行时进行管理。(如果数据库要存储在持久存储中,则必须添加注释修饰符 @Persistent(disk=true)。)
有关使用 JNI 注释定义数据库、类、字段和索引特性的详细说明,请参阅 JNI 架构参考指南。
持久数据库
对于持久化数据库应用程序,数据库类的定义与内存数据库中的定义完全相同,只是所有将存储在持久化介质上的类都需要添加类注解 @Persistent(disk=true)
。例如:
@Persistent(disk=true)
class Obj
{
public int i4;
};
如果要将所有类都存储在持久性介质上,那么可以使用传递给 Database 方法 open() 的参数中的 Database.Parameters 属性 diskClassesByDefault 作为替代方案。例如:
Database.Parameters parameters = new Database.Parameters();
parameters.classes = new Class[]{Obj.class};
...
parameters.diskClassesByDefault = true;
...
Java 模式定义
Java 应用程序使用原生 Java 类语法并应用特殊注解来定义 SmartEDB 运行时要管理的数据库类。 例如,以下代码片段将定义一个包含两个类(Department 和 Employee)的数据库:
@Persistent()
class Department
{
@Indexable(Type = Database.IndexType.BTree, Unique = true)
public String code;
public String name;
@Indexable(Type = Database.IndexType.Hashtable, Unique = true)
public int dept_no;
}
@Index("byDept_EmployeeName", Keys = new string[] { "dept_no", "name" }, Unique = false)
@Persistent()
class Employee
{
@Indexable(Type = Database.IndexType.BTree, Unique = true)
public String name;
public int dept_no;
}
请注意,注解 @Persistent()、@Indexable() 和 @Index() 用于指定要在数据库中生成和维护的类和索引。
JNI 数据库注释
被识别为 SmartEDB 数据库规范的注释如下:
类:Persistent
将此类标记为“存储在数据库中”,并可选择提供此类的一些属性;
声明 | 说明 |
---|---|
Persistent(autoid=true) | 创建一个自动标识符索引 |
Persistent(list=true) | 创建一个列表索引 |
Persistent(large=true) | 声明标准存储模型(默认) |
Persistent(compact=true) | 声明紧凑存储模型 |
Persistent(inmemory=true) | 声明此类为内存中持久化(默认) |
Persistent(disk=true) | 声明此类为基于磁盘的(即在持久性存储介质上) |
Persistent(local=true) | 声明此类为 SmartEDB 高可用性部分复制的本地类 |
类:Index
定义复合(多字段)索引,可能的属性有:
属性 | 说明 |
---|---|
name="indexName" | 识别此索引 |
keys={Key(“field1”) [, Key(“field2”) …] } | 关键字段列表 |
unique=true | 创建一个 B 树索引(默认),值为 true 时强制唯一性;值为 false 时允许重复。 |
thick=true | 针对大量重复项进行了优化 |
descending=true | 索引默认是升序排列的 |
initSize=N | 对于哈希索引,N 是哈希表的初始大小 |
type=Database.IndexType.BTree | 可能的 Database.IndexType 值有:`BTree |
例如:
@Index(name="byName", keys={ Key("lastName"), Key("firstName") }, unique=true )
class Employee
{
String firstName;
String lastName;
Address address;
long salary;
}
字段:Indexable
指定在以下字段上创建索引。该索引的名称与字段名称相同。除了 name 和 keysproperties 之外,可能的属性与上述类属性 Index 的属性相同。例如:
class Obj
{
@Indexable(Type=Database.IndexType.BTree, Unique=true)
public int value;
}
字段:Encoding
指定字符串字段的编码。可以是 Java 运行时支持的任何有效编码。例如:
@Encoding("UTF-16")
String s1;
@Encoding("ASCII")
String s2;
字段:Blob
使用 SmartEDB 的 BLOB 类型来存储字节数组;例如:
@Blob
byte photo[];
字段:Numeric
指定十进制字段的宽度和精度。v
@Dimension(8)
String prefix;
字段:Dimension
指定固定大小数组(字符、标量)的维度。没有维度的数组将被视为向量(动态数组)。 例如:
@Numeric(12,3)
decimal d;
// Equivalent to decimal<12,3> d;
字段:Binary
指定一个固定长度的二进制字段。例如:
@Binary(100)
byte[] dim100_binary;
// A Binary array of 100 bytes
字段:Varbinary
指定一个可变长度的二进制字段。例如:
@Varbinary
byte[] var_binary;
// A Binary vector (dynamic array)
字段:Nullable
指定此字段可以为空。例如:
@Nullable
bool isALive; // Explicitly declared nullable field
字段:OptionalStruct
将结构体字段定义为可选。例如:
@OptionalStruct
NestedStruct opt_nested; // optional NestedStruct opt_nested;
字段:References
用于声明一个类型为 ref 的字段,该字段引用模式中的类。例如:
@References(ClassA.class)]
long a;
字段:Sequence
用于声明类型为序列的字段。例如:
@Sequence(type=Sequence.Type.UInt8)
OrderedSequence stamp;
请注意,当声明一个有序序列时,默认的排序方式为升序。默认值可以被显式地覆盖:
@Sequence(order=Sequence.Order.Descending, type=Sequence.Type.UInt8)
OrderedSequence stamp;