Sails.js 一对多关系 - 变量所有者集合属性

Posted

技术标签:

【中文标题】Sails.js 一对多关系 - 变量所有者集合属性【英文标题】:sails.js one to many relationship - variable owner collection attribute 【发布时间】:2014-08-20 05:15:11 【问题描述】:

在sailsjs.org 的文档中,拥有方的一对多关系是这样定义的

//user.js
module.exports = 
    attributes: 
        name:'STRING',
        age:'INTEGER',
        pets:
            collection: 'pet',
            via: 'owner'
        
    

'pet' 是一个常量,在 SQL 数据库中具有一致的架构。如果我想拥有一个超类宠物和具有独特属性(不同行数)的子类怎么办?假设我有一条章鱼和一条狗。狗有 4 条腿和 2 只耳朵。章鱼有 8 条触手。唯一的共性会被抽象成宠物类(颜色、名字、年龄)。

如果这是不可能的,我将不得不诉诸这样的事情吗?

//user.js
module.exports = 
    attributes: 
        name:'STRING',
        age:'INTEGER',
        dogs:
            collection: 'dog',
            via: 'owner'
        ,
        octopuses:
            collection: 'octopus',
            via: 'owner'
        
    

但是,如果我想引入更多的宠物,如鹰(会飞)、鹦鹉(会说话),这可能会变得非常混乱,如果我要使用 SQL 数据库,则会导致很多空值。也许 mongoDB 会是理想的选择?

【问题讨论】:

【参考方案1】:

在 Waterline 中,每个模型都被视为 SQL 数据库中的表或 Mongo 中的集合。如果 Dog 将具有与 Octopus 完全不同的属性,那么是的,您可以将它们分成单独的表并将它们链接到 User。我认为最简单的方法是将 type 属性添加到 Pet 模型。

// user.js
module.exports = 
    attributes: 
        name:'STRING',
        age:'INTEGER',
        pets:
            collection: 'pet',
            via: 'owner'
        
    


// pet.js
module.exports = 
    attributes: 
        name:'STRING',
        type: 'STRING',
        owner:
            model: 'user'
        
    

这将允许以下查询:

User.find().populate('pets',  type: 'dog' );

另一种选择是将宠物属性存储在 json 对象中。这目前不可搜索,但可以让您以非规范化的方式存储有关宠物的各种信息。

// pet.js
module.exports = 
    attributes: 
        name:'STRING',
        type: 'STRING',
        characteristics: 
            type: 'json'
        ,
        owner:
            model: 'user'
        
    

这会让您拥有如下所示的宠物:

[
    id: 1,
    name: 'fluffy',
    type: 'dog',
    characteristics: 
        food: 'mice',
        limbs: 4,
        fur: 'white'
    ,
    owner: 1
,

    id: 2,
    name: 'inky',
    type: 'octopus',
    characteristics: 
        habitat: 'ocean'
        tentacles: 8,
        canChooseWorldCupWinners: true
    ,
    owner: 1
]

【讨论】:

以上是关于Sails.js 一对多关系 - 变量所有者集合属性的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js 对关联值的查询

多对多关系连接表上的sails.js 额外字段

获取核心数据对象,其中一对多关系包含集合中的所有对象

在一对多 CoreData 关系错误上调用“计数”是不是会将集合中的所有对象都带入内存?

Hibernate 映射及查询

(转)Hibernate框架基础——一对多关联关系映射