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

时间:2014-08-20 05:15:12

标签: javascript node.js orm sails.js waterline

在sailsjs.org的文档中,拥有方的一对多关系定义如下

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

'宠物'是一个常量,在SQL数据库上具有一致的模式。如果我想拥有一个具有唯一属性(不同行数)的超类pet和子类,该怎么办?说我有一只章鱼和一只狗。狗有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 个答案:

答案 0 :(得分:1)

在Waterline中,每个模型都被视为SQL数据库中的表或Mongo中的Collection。如果一只狗与八达通有完全不同的属性,那么你可以将它们分成不同的表并将它们链接到用户。我认为最简单的方法是在Pet模型中添加type属性。

// 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' });

另一种选择是将pet属性存储在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
}]