【发布时间】:2026-01-04 05:05:01
【问题描述】:
我想知道为什么我必须在两个相关数据集中定义 hasMany 和 belongsTo?这似乎是多余的,因为所有必要的信息都已经在其中一个数组中,并且很难保持两者同步。
它也不反映 sql 数据库中的表,其中一个表中只有一个外键是一对多关系。
【问题讨论】:
标签: ember.js ember-data
我想知道为什么我必须在两个相关数据集中定义 hasMany 和 belongsTo?这似乎是多余的,因为所有必要的信息都已经在其中一个数组中,并且很难保持两者同步。
它也不反映 sql 数据库中的表,其中一个表中只有一个外键是一对多关系。
【问题讨论】:
标签: ember.js ember-data
因为关系可以通过一种或两种方式进行。在您的 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。一旦你理解了有向图,以及如何遍历它们,你就会明白为什么大多数人使用双边关系。 (虽然,正如我在上面向您展示的那样,您不必这样做。)
【讨论】:
Post 模型对User 模型一无所知。这意味着如果您有一个Post 对象,除非您查询User 对象,否则您无法获得帖子的作者。但是,如果有另一个关系指向 User 对象,您现在也可以在该方向上遍历图形。