一对多关系——变量所有者集合属性

sails.js one to many relationship - variable owner collection attribute

本文关键字:集合 属性 所有者 变量 关系 一对多      更新时间:2023-09-26

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

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

'pet'是一个常量,在SQL数据库中具有一致的模式。如果我想有一个超类宠物和子类具有独特的属性(不同的行数)?假设我有一只章鱼和一只狗。狗有四条腿和两只耳朵。章鱼有8根触须。唯一的共性将被抽象到宠物类中(颜色、名字、年龄)。

如果这是不可能的,我将不得不诉诸于这样的东西吗?

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

然而,如果我想引入更多的宠物,如鹰(会飞),鹦鹉(会说话),这可能会变得相当混乱,如果我要使用SQL数据库,这将导致许多null。也许mongoDB将是理想的吗?

在Waterline中,每个模型都被视为SQL数据库中的一个表或Mongo中的一个集合。如果狗的属性与章鱼完全不同,那么你可以将它们分成单独的表,并将它们链接到用户。我认为最简单的方法就是在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' });

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