使用 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
    }
  }
};

我希望每辆车都能有多种颜色。例如

文档显示了如何建立一对一的关系,但我想不出建立一对多或多对多的正确方法。我研究了使用这个适配器: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。