Ember 数据:为啥 hasMany 和 belongsTo

Posted

技术标签:

【中文标题】Ember 数据:为啥 hasMany 和 belongsTo【英文标题】:Ember Data: Why hasMany and belongsToEmber 数据:为什么 hasMany 和 belongsTo 【发布时间】:2014-08-05 11:11:57 【问题描述】:

我想知道为什么我必须在两个相关数据集中定义 hasMany belongsTo?这似乎是多余的,因为所有必要的信息都已经在其中一个数组中,并且很难保持两者同步。

它也不反映 sql 数据库中的表,其中一个表中只有一个外键是一对多关系。

【问题讨论】:

【参考方案1】:

因为关系可以通过一种两种方式进行。在您的 SQL 示例中,一个表中的外键仅对该表施加限制,而不是外键所属的表。从某种意义上说,这只是一种单向的关系。第一个表中的行必须链接到第二个表的行,反之则不行。如果你想模仿这种行为,你应该使用 null 逆,像这样:

App.User = DS.Model.extend(
    posts: DS.hasMany('post',  inverse: null );
);

App.Post = DS.Model.extend(
    // No inverse relationship required
);

虽然有两种方式的关系是不同的。为了扩展您的 SQL 比较,需要有两个外键,每个表中都有一个。表 A 的行必须指向表 B 的行并且表 B 的行必须指向表 A 的行。

但是 SQL 在这里确实是一个不好的比较。如果您担心这种不匹配,您会让您的数据存储实现泄漏到您的数据模型中。相反,您应该将 Ember-Data 模型视为图形。具体来说,directed graphs。一旦你理解了有向图,以及如何遍历它们,你就会明白为什么大多数人使用双边关系。 (虽然,正如我在上面向您展示的那样,您不必这样做。)

【讨论】:

感谢您的回复! 我说得对吗,如果表 A 的第 1 行链接到表 B 中的第 3 行,那么在双向关系中,B 中的第 3 行必须链接到 A 中的第 1 行。如果是这样的,那不是纯粹的冗余吗? 由于外键约束和查询的工作方式,它在 SQL 中有点多余,但对于图来说却不是多余的。能够双向穿越很重要。在我上面的示例中,Post 模型对User 模型一无所知。这意味着如果您有一个Post 对象,除非您查询User 对象,否则您无法获得帖子的作者。但是,如果有另一个关系指向 User 对象,您现在也可以在该方向上遍历图形。

以上是关于Ember 数据:为啥 hasMany 和 belongsTo的主要内容,如果未能解决你的问题,请参考以下文章

Ember Mirage 模型:对于多个 hasMany 和 belongsTo

Ember js - 更新其他表后 Hasmany 关系中断

Ember.js:重新加载通过有效负载中的“链接”给出的 .hasMany 关系

具有嵌套 hasMany 或 belongsTo 关系的 Ember 模型

用于从 hasMany 关系中检索一条记录的 Ember 计算属性?

EmberJS / Ember-data:尽管存在所有ID,但hasMany集合不完整