模型数据 - Node.js SDK
对象类型和模式
每个Realm 对象都遵循特定的对象类型,该类型本质上是一个使用预定义模式定义该类型对象的属性和关系的类。 RealmACID 一致性保证域中的所有对象都符合其对象类型的模式,并在创建、修改或删除对象时验证对象。
Realm对象本质上与常见的JavaScript对象类似,但它们还带来了一些附加功能,例如模式验证和 实时查询 。 Node.js SDK内存将Realm对象直接映射到原生JavaScript对象,这意味着无需使用特殊的数据访问库,例如 ORM 。相反,您可以像使用任何其他对象一样使用Realm对象。
以下类包含一个模式,该模式定义具有id
、 make
、 model
和miles
属性的 Car
Realm 对象类型。 它还定义了一个主键。
class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: { type: "objectId", default: () => new Realm.BSON.ObjectId() }, make: "string", model: "string", miles: "int?", }, primaryKey: "_id", }; }
Realm 模式
Realm 模式是 Realm 可能包含的有效对象模式的列表。 每个 Realm 对象都必须符合其 Realm 模式中包含的对象类型。
如果 Realm 在打开时已包含数据,Realm 则会验证每个对象以确保为其类型提供了对象模式,且它满足该模式中指定的所有约束。
包含有关汽车和制造商的基本数据的 Realm 可能会使用如下模式:
class Manufacturer extends Realm.Object { static schema = { name: "Manufacturer", properties: { _id: "objectId", // A manufacturer that may have many cars cars: "Car[]", }, }; } class Car extends Realm.Object { static schema = { name: "Car", properties: { _id: "objectId", make: "string", model: "string", miles: "int?", }, }; }
关系
Realm允许您定义应用中对象类型之间的显式关系。 关系是引用另一个Realm 对象类型的对象属性。 您可以通过将对象的属性设置为属性模式中的另一种对象类型来定义属性。
关系是对 Realm 中其他对象的直接引用。 您不需要像在关系数据库中那样通过桥接表或创建联接来定义关系。 相反,您可以通过读取和写入定义关系的属性来访问相关对象。
Realm 在读取操作传入时延迟执行读取操作。 查询关系与读取常规属性一样高效。
对象之间主要有三种关系:
注意
Realm 与其他数据库对比
对象通常包含对其他对象的直接引用。 使用对象和引用时,您经常会从数据库存储复制到应用程序内存中。 在这种情况下,开发者可以选择将哪些内容复制到内存中:
您可以提前复制整个引用对象。 这意味着所有引用的数据始终可以快速使用,但可能会占用大量资源。 根据可用内存量,这可能不可行。
您可以提前仅为每个对象复制一个外键值,以便在需要时用于查询完整对象。 这些引用的查找节省内存。 但是,它们需要更多查询代码,而过多的查找会减慢应用程序的速度。
Realm 的查询架构避免了内存使用量和计算开销之间的权衡。 相反,Realm 查询可以直接引用磁盘上的相关对象及其属性。