数据库模式
C# API 使用带有属性的 C# 类语法。在运行时,C# 反射用于发现带有其属性的类,并构建一个数据库字典。请注意,属性 [Persistent]
标记一个 C# 类由内存数据库中的运行时进行管理。如果数据库要存储在持久存储中,则必须添加属性修饰符 [Persistent(disk=true)]
。
提示
对象是存储在内存中还是磁盘上(其中“disk”指的是文件系统)取决于这些属性(即 C# 类定义)以及调用 Database.Open()
时使用的 Database.Parameter
规范。其逻辑如下:
- 如果
Parameters.diskClassesByDefault
被设置为true
且未指定属性[Persistent(inmemory)]
,那么该类的对象基于磁盘。 - 如果
Parameters.diskClassesByDefault
被设置为 false 且未指定属性[Persistent(disk)]
,那么该类的对象是瞬态的(在内存中)。 - 如果指定了属性
[Persistent(inmemory)]
,那么无论Parameters.diskClassesByDefault
的值如何,该类的对象都是瞬态的。 - 如果指定了属性
[Persistent(disk)]
,那么无论Parameters.diskClassesByDefault
的值如何,该类的对象都是持久的。
类似的一组规则适用于属性[Persistent(large)]
和[Persistent(compact)]
以及相关的属性 Parameters.compactClassesByDefault
。
被定义为由 SmartEDB管理的类作为 Class 类对象的数组传递到运行时。未传递到运行时但在数据库类中被引用的 C# 类将被视为结构字段。
持久数据库
对于持久数据库应用程序,数据库类的定义与内存数据库完全相同,只是对于所有将存储在持久介质上的类,其类属性为 [Persistent(Disk=true)]
。例如:
[Persistent(Disk=true)]
class Obj
{
public int i4;
};
如果所有类都要存储在持久性介质上,另一种方法是对传递给数据库方法 Open() 的参数使用 Database.Parameters
属性 DiskClassesByDefault
。例如:
Database.Parameters parameters = new Database.Parameters();
parameters.Classes = new Type[] { typeof(Obj) };
...
parameters.DiskClassesByDefault = true;
...
C# 应用程序使用原生的 C# 类语法并应用特殊属性,在 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()]
用于指定要在数据库中生成和维护的类和索引。
数据库属性
被视为 SmartEDB 数据库规范的属性如下:
Persistent
类属性:将此类标记为“存储在数据库中”,并可选择提供此类的一些属性;
Persistent(autoid=true)
- 创建autoid索引。Persistent(list=true)
- 创建表索引。Persistent(large=true)
- 声明标准存储模型(默认)。Persistent(compact=true)
- 声明紧凑存储模型。Persistent(inmemory=true)
- 声明此类为全内存类(默认)。Persistent(disk=true)
- 声明该类为基于磁盘的(即在持久存储介质上)。Persistent(local=true)
- 声明此类为高可用性部分复制的本地类。
Index
类属性:定义复合(多字段)索引及可能属性值:
name="indexName"
- 标识这个索引。keys={Key(“field1”) \[, Key(“field2”) …\] }
- 列出关键字段。unique=true
- 创建一个B树索引(默认值),true
是强制唯一性;false
则允许出现重复项。thick=true
- 针对大量重复项进行优化。descending=true
- 索引默认情况下是按升序排列的。initSize=N
- 设定哈希索引初始大小(N)。type=Database.IndexType.BTree
- 设定数据库索引类型。可选值为:- BTree
- Hashtable
- Patricia
- RTree
- RTreeOfPoint
- KDTree
- Trigram
示例:
[Index(name="byName", keys={ Key("lastName"), Key("firstName") }, unique=true )]
class Employee
{
String firstName;
String lastName;
Address address;
long salary;
}
Indexable
字段属性:指定对以下字段的索引。索引将具有与字段相同的名称。除了 name
和 keys
属性外,其他可能的属性与类属性 Index
(见上文)相同。
示例:
class Obj
{
[Indexable(Type=Database.IndexType.BTree, Unique=true)]
public int value;
}
Encoding
字段属性:指定字符串字段的编码方式。可以是.NET运行时支持的任何有效编码方式,默认为UTF-8。
示例:
[Encoding("UTF-16")]
String s1;
[Encoding("ASCII")]
String s2;
Blob
字段属性:使用SmartEDB BLOB类型存储一个字节数组。
示例:
[Blob] public byte[] photo;
Dimension
字段属性:指定固定大小数组(字符数组和标量数组)的维数。 没有维数的数组将被当作向量(动态数组)处理。
示例:
[Dimension(8)]
String prefix;
Numeric
字段属性:定义小数字段的宽度和精度。
示例:
[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
字段属性:指定该字段可以为空。C#中的“?”语法也将产生可空数据库字段。
示例:
[Nullable]
bool isALive; // Explicitly declared nullable field
bool? isDead; // Imnplicitly declared nullable field
Optional
字段属性:将结构字段定义为可选的。
示例:
[Optional]
NestedStruct opt_nested;
References
字段属性:用于声明一个引用类型ref
的字段,该字段指向结构中的一个类。
示例:
[References(ClassA)]
ulong a;
SQL列名称与C#字段
在使用与C#类相关的SQL表时,请注意SQL列名是区分大小写的。
SQL表列名将与C#持久类中使用的区分大小写列名相对应。