====== DB System ====== 对于建模系统来说,需要有一套合适的规则将构建的现实对象(如几何面、材料等)抽象定义为数据结构,为了支持大规模数据对象,XT设计了一套统一的高效数据对象管理系统。XT中所有的数据对象都从[[class::domain::xitem#xitem|XItem]]继承而来,而对同一类型的数据对象,XT平台使用[[class::domain::xmanager|XManager]]管理数据对象,如新建、删除、遍历等功能。\\ * 数据管理器提供[[class::domain::xmanager#createItem|createItem]]创建数据对象; * 数据管理器提供[[class::domain::xmanager#removeItem|removeItem]]删除数据对象; * 数据对象会有属性信息(Attribute),此外它可能与其他数据对象产生关联(Link),XT平台约定,如果关联关系是有序的,则这种关联属于数据对象属性的一部分;如果是无序的,则这种关联的构建与解除需要通过接口[[class::domain::xmanager#linkitem|linkItem]]来实现。这种设计的原因是因为Undo/Redo机制中,为了提高性能与代码的可读性,对象属性的操作与对象关系的操作是分开的,如果在读取对象的属性的时候还需要去获取关联对象的指针会打破类的封装性。但是这个接口并不能保证关联关系的顺序,所以在有序的场合,它将作为数据的属性的一部分来处理。\\ 数据管理器体提供了IO的接口,它包含两部分,一部分是数据本身的[[class::domain::xmanager#serialize|序列化]],另一部分是数据对象关系的[[class::domain::xmanager#serializeLinks|序列化]]。对Undo/Redo管理器提供了另外的接口[[class::domain::xmanager#serializerecord|serializeRecord]]和[[class::domain::xmanager#serializelinkrecord|serializeLinkRecord]]。\\ 对于某些数据对象,如PartSnapshot,不能对它进行修改,所以这样的对象只能创建或者删除。 * [[reference::dbsystem#itemdefine|数据对象的定义]] * [[reference::dbsystem#xmanage|数据对象的管理]] ---- {{anchor:itemmem}} **数据对象的定义** 根据数据对象是否拥有名字属性可分别从[[class::domain::xitem#xitem|XItem]]或者[[class::domain::xitem#nitem|NItem]]继承。在XT中数据被使用之前必须注册该数据的类型,XT提供两种方式的注册方式: - //定长对象//,所有该类型的数据对象拥有一致的大小,该对象必须实现参数为ulong的构造函数,XT提供了宏REGISTER_CITEM以方便开发; - //容器对象//,所有该类型的数据对象类似于容器对象保存关联数据,根据关联数据的数目而有不同的内存空间,该对象必须实现参数为ulong和MemPool的构造函数,其中MemPool用于为变长部分(即关联数据)分配内存,XT提供了宏REGISTER_CONTAINER_ITEM以方便开发; 这两种宏都需要提供对象的类型以及所属域的类型,它们一般定义在头文件globalenum.h中。 {{anchor:xmanage}} **数据对象的管理** 每个数据对象拥有唯一的数字ID,XManager内建的内存池为数据对象分配空间,然后通过ID索引数据对象,所以在新建数据对象时,必须指定ID。