提问人:altoviento 提问时间:8/13/2023 更新时间:8/13/2023 访问量:48
领域关系与嵌入对象
Realm relationships vs embedded objects
问:
我已经习惯了 SQL,不太了解 Realm 的内部结构。在检查了使用 Realm 的常用建议之后,我发现通常不鼓励数据库规范化,以及创建一个以链接项目为唯一目的的规范化(例如用于关联外键的交叉引用表)。RealmObject
总而言之,我不想使用太多的类。下面是具有多对多关系的两个示例:RealmObject
RealmObject
class Actor : RealmObject {
var _id: ObjectId = ObjectId()
var name: String = ""
var age: Int? = null
var movies: RealmList<Movie> = realmListOf<Movie>()
}
class Movie : RealmObject {
var _id: ObjectId = ObjectId()
var name: String = ""
var actors: RealmList<Actor> = realmListOf<Actors>()
var roles: List<String> = listOf<String>() // each actor's roles
}
如何只存储对另一个 RealmObject
的引用?
RealmList
是编写“多对多”关系的默认方式,但我不需要在更改时更新内容;一个引用另一个列表就足够了。RealmObject
我该怎么做?我不能像在具有外键的关系数据库中那样存储另一个。ObjectId
RealmObject
答:
Realm 被设计为可以轻松处理非常大的数据集,并且通过引用处理对象允许对象图在多个方向上轻松导航,并且非常内存友好(且速度很快)
实现外键是可以做到的,但为什么呢?让 Realm 为您处理繁重的工作。
该问题提出以下问题:
如何只存储对另一个 RealmObject 的引用
答案是简单地添加一个引用另一个对象的属性 - 给定你的两个对象(伪代码和精简的长度)
class Actor : RealmObject {
var bestMovie: Movie
}
class Movie : RealmObject {
var mainActor: Actor
}
在上面,Actor 有一个 bestMovie,一部电影有一个 mainActor。这是一个一对一的关系,回答了如何存储对另一个 Realm 对象的引用的问题。
其他一些有趣的笔记
我看到通常不鼓励数据库规范化
我想说这是不准确的。非规范化/归一化非常依赖于用例且高度主观。这是一个棘手的问题,因为 Realm 是一个对象数据库,而不是像 SQL 这样的关系数据库。没有行、列和表;每个对象都是谨慎的,并作为 NoSQL 文档存储在后端 (Atlas) 上。所以我觉得花很多时间正常化(UNF、1NF)等时间并不值。让 Realm 创建和处理引用。
创建一个 RealmObject,其唯一目的是链接项目
为什么不呢?如果用例需要它,那么它可以完成。如果你真的想实现 SQL 样式的外键,这是一种方法。但是,它可能不需要,并且利用内置的“通过引用”功能不仅性能更高,而且更易于支持、扩展和更少的代码。
RealmList 是编写“多对多”关系的默认方式,
您还可以使用 RealmList 来建立一对一的关系,只要子对象实现 LinkingObjects 来创建反向链接即可。然后自动生成关系。
但我不需要在更改时更新内容;引用以下内容的列表 另一个 RealmObject 就足够了。
我不太清楚语句的第二部分 - “更改时更新内容” - 列表是一个参考引擎,允许从父对象导航到相关对象,相反,如果使用 LinkingObjects - 它与更新对象没有直接关系;父级或子级。
评论