领域关系与嵌入对象

Realm relationships vs embedded objects

提问人:altoviento 提问时间:8/13/2023 更新时间:8/13/2023 访问量:48

问:

我已经习惯了 SQL,不太了解 Realm 的内部结构。在检查了使用 Realm 的常用建议之后,我发现通常不鼓励数据库规范化,以及创建一个以链接项目为唯一目的的规范化(例如用于关联外键的交叉引用表)。RealmObject

总而言之,我不想使用太多的类。下面是具有多对多关系的两个示例:RealmObjectRealmObject

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

我该怎么做?我不能像在具有外键的关系数据库中那样存储另一个。ObjectIdRealmObject

nosql 外键 领域 关系 数据库规范化

评论

0赞 philipxy 8/14/2023
目前尚不清楚。这与关系数据库或数据库规范化有什么关系?“使用 Realm,我看到通常不鼓励数据库规范化”与您的问题有什么关系?“总结”--总结什么?之后的“总结”如何总结之前的内容?PS:您是否了解用id替换值(据说以某种方式识别值比识别它们自己更好)和交叉引用/查找表不是数据库规范化?
0赞 altoviento 8/14/2023
数据库规范化在 SQL 中很常见(例如,使用查找表中的关系来减小每个表的大小)。类似的方法也可以应用于NoSQL模式,尽管这并不常见。使用查找表可以帮助解决这个问题,这样我的对象只有所需的变量,其他所有内容都在其他对象的查找表中。- 我提到这是不鼓励的,因为我不明白为什么会这样,如果它满足了我的需求。
0赞 philipxy 8/14/2023
这个评论也不清楚。PS FK/“链接”用于数据库完整性,它们不用于存储或查询数据,并且与数据库规范化无关,FK 约束不表示关系。(在关系数据库中,关系由表表示。再说一遍:查找表与数据库规范化无关。你没有在这篇文章中解释为什么你甚至提到规范化,或者(你认为)它与你的问题有什么关系。PS 请通过编辑而不是评论进行澄清。帮助中心

答:

1赞 Jay 8/13/2023 #1

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 - 它与更新对象没有直接关系;父级或子级。