使用 Sails.js 和 OrientDB 的多边模型
Model with multiple Edges using Sails.js and OrientDB
我是 Sails.js 和 OrientDB 的新手。我正在尝试弄清楚如何使用 sails-orientDB 适配器创建具有多个边的模型。
我有一个存储基本车辆信息和车辆颜色的车型:
module.exports = {
schema: true,
tableName: 'Vehicle',
attributes: {
id: {
type: 'string',
primaryKey: true,
columnName: '@rid'
},
make: {
type: 'string',
unique: false,
required: true
},
model: {
type: 'string',
unique: false,
required: true
},
year: {
type: 'int',
int: true,
unique: false,
required: true
},
color: {
collection: 'Vehicle_Color',
via: 'color',
edge: 'vehicleColor'
}
}
};
以及车辆颜色模型:
module.exports = {
schema: true,
tableName: 'Vehicle_Color',
attributes: {
id: {
type: 'string',
primaryKey: true,
columnName: '@rid'
},
name: {
type: 'string',
unique: true,
required: true
},
hexCode: {
type: 'string',
hexColor: true
}
}
};
我希望每辆车都能有多种颜色。例如
- 载具 A -> 红色
- 载具 A -> 蓝色
- 车辆 A -> 黄色
文档显示了如何建立一对一的关系,但我想不出建立一对多或多对多的正确方法。我研究了使用这个适配器:npmjs.com/package/waterline-orientdb 但这看起来否定了使用图形数据库的好处 (github.com/appscot/waterline-orientdb/issues/29)。
我会简单地创建一个边缘模型吗:
module.exports = {
schema: true,
tableName: 'Vehicle_Color',
attributes: {
vehicleID: {
type: 'string',
},
colorID: {
type: 'string',
},
}
};
然后在我的模型中存储这些边的数组?有一个更好的方法吗?提前致谢。
Waterline-orientdb 刚刚更新 (v0.10.40) and now it supports edges in Many-to-many associations (in addition to many-to-many through). Many-to-many associations are simpler to handle so I recommend those. The model specification is the same as that described on waterline-docs.
回到您的具体案例。
车辆型号
您应该删除 edge 关键字,因为在处理嵌套关联时它可能会导致如下所示的异常:
Error: Unknown rule: edge
at Object.matchRule (/Users/warchild/Development/node/waterline-orientdb/node_modules/waterline/node_modules/anchor/lib/match/matchRule.js:37:11)
您可以使用以下外部属性重命名边缘(否则水线会将其命名为 vehicleColor_color__Vehicle_Color_cars):
joinTableNames: {
color: 'has_color' // I've used a different name to distinguish from Color Model
},
并将您的颜色属性替换为:
color: {
collection: 'Vehicle_Color',
via: 'cars',
dominant: true
}
Vehicle_Color
添加以下属性以便 vehicle_color 了解车辆:
cars: {
collection: 'Vehicle',
via: 'color'
}
鉴于您将使用多对多关联,您不需要为边缘创建模型,waterline 将为您创建它。
应该可以,否则请告诉我。
更新: waterline-orientdb 已重命名为 sails-orientdb。
我是 Sails.js 和 OrientDB 的新手。我正在尝试弄清楚如何使用 sails-orientDB 适配器创建具有多个边的模型。
我有一个存储基本车辆信息和车辆颜色的车型:
module.exports = {
schema: true,
tableName: 'Vehicle',
attributes: {
id: {
type: 'string',
primaryKey: true,
columnName: '@rid'
},
make: {
type: 'string',
unique: false,
required: true
},
model: {
type: 'string',
unique: false,
required: true
},
year: {
type: 'int',
int: true,
unique: false,
required: true
},
color: {
collection: 'Vehicle_Color',
via: 'color',
edge: 'vehicleColor'
}
}
};
以及车辆颜色模型:
module.exports = {
schema: true,
tableName: 'Vehicle_Color',
attributes: {
id: {
type: 'string',
primaryKey: true,
columnName: '@rid'
},
name: {
type: 'string',
unique: true,
required: true
},
hexCode: {
type: 'string',
hexColor: true
}
}
};
我希望每辆车都能有多种颜色。例如
- 载具 A -> 红色
- 载具 A -> 蓝色
- 车辆 A -> 黄色
文档显示了如何建立一对一的关系,但我想不出建立一对多或多对多的正确方法。我研究了使用这个适配器:npmjs.com/package/waterline-orientdb 但这看起来否定了使用图形数据库的好处 (github.com/appscot/waterline-orientdb/issues/29)。
我会简单地创建一个边缘模型吗:
module.exports = {
schema: true,
tableName: 'Vehicle_Color',
attributes: {
vehicleID: {
type: 'string',
},
colorID: {
type: 'string',
},
}
};
然后在我的模型中存储这些边的数组?有一个更好的方法吗?提前致谢。
Waterline-orientdb 刚刚更新 (v0.10.40) and now it supports edges in Many-to-many associations (in addition to many-to-many through). Many-to-many associations are simpler to handle so I recommend those. The model specification is the same as that described on waterline-docs.
回到您的具体案例。
车辆型号
您应该删除 edge 关键字,因为在处理嵌套关联时它可能会导致如下所示的异常:
Error: Unknown rule: edge
at Object.matchRule (/Users/warchild/Development/node/waterline-orientdb/node_modules/waterline/node_modules/anchor/lib/match/matchRule.js:37:11)
您可以使用以下外部属性重命名边缘(否则水线会将其命名为 vehicleColor_color__Vehicle_Color_cars):
joinTableNames: {
color: 'has_color' // I've used a different name to distinguish from Color Model
},
并将您的颜色属性替换为:
color: {
collection: 'Vehicle_Color',
via: 'cars',
dominant: true
}
Vehicle_Color
添加以下属性以便 vehicle_color 了解车辆:
cars: {
collection: 'Vehicle',
via: 'color'
}
鉴于您将使用多对多关联,您不需要为边缘创建模型,waterline 将为您创建它。
应该可以,否则请告诉我。
更新: waterline-orientdb 已重命名为 sails-orientdb。