领域关系与嵌入对象

问题描述 投票:0回答:1

我习惯了 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

nosql foreign-keys realm relational-database database-normalization
1个回答
0
投票

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 - 它不直接相关更新对象;无论是父母还是孩子。

© www.soinside.com 2019 - 2024. All rights reserved.