建模API:每行代表一个表。建议?

时间:2014-09-30 11:32:39

标签: node.js postgresql rest loopbackjs

我有一个应用程序将用户上传的电子表格存储为PostgreSQL中的表格。每次用户上传电子表格时,我都会在Dataset表中创建一条记录,其中包含物理表名称,别名和所有者。我可以使用

检索某个数据集信息
GET domain.com/v1/Datasets/{id}

AFAIK,Dataset中的行与物理表之间的关系不能由FK强制执行,或者至少我没有看到任何人在PostgreSQL的information_schema上创建FK,和FK不能删除表,或者可以吗?因此,将{@ 1}}中的孤立表或记录指向不再存在的表是很常见的。我已经通过业务逻辑和清理任务来管理它。

现在,要访问其中一个物理表,例如一个名为Dataset的物理表,我需要在环回中声明一个NbaTeams模型并重新启动应用程序,然后使用

查询其记录
nba_teams

但这不能扩展,特别是如果我每天已经有100次上传的话。因此,从我站立的地方来看,有两种方法可以实现:

1.-创建一个模型,然后添加4个接受表名作为字符串的自定义方法,并通过原始查询对该表名执行下一个CRUD操作。例如,列出记录:

GET domain.com/v1/NbaTeams/{id}

或者,更新一个团队

GET domain.com/v1/Datasets/getTable/NbaTeams

这听起来不太优雅但应该有效。

2.-创建一个自定义方法,将表名作为字符串接受,然后创建一个短暂模型并将HTTP动词和其余参数转发给它

PUT domain.com/v1/Datasets/getTable/NbaTeams/{teamId}

这第二个我尚未开始工作,而且我不知道它可能有多少开销,但我确信它是可行的。

所以在我深入挖掘之前,我来问:有没有人处理过这种行到表的关系这个有哪些好的做法?

1 个答案:

答案 0 :(得分:1)

最后,我做了自己的hacky解决方法,有一天我觉得它可能对某人有帮助。

我所做的是放置一个中间件(使用常规快速语法)来监听/ v1 / dataset {id_dataset},动态创建模型并将执行传递给下一个中间件

app.use('/v1/dataset:id_dataset', function(req, res, next) {
    var idDataset=req.params.id_dataset;
    app.getTheTable(idDataset,function(err,result) {
        if(err) { 
          console.error(err);
          res.json({"error":"couldn't retrieve related table"});
        } else {
          next();
        }
    });
});

app.getTheTable函数中,我正在动态创建模型并在回调之前设置它

app.getTheTable = function (idDataset, callback) {
    var Table = app.models.Dataset,
    modelName='dataset'+idDataset,
    dataSource;

    Table.findById(idDataset, function (err, resultados) {
        if (err) {
            callback(new Error('Unauthorized'));
        } else {
           if(app.models[modelName]) {
               callback(null,modelName); // model already exists
           } else {
               var theDataset = dataSource.createModel(modelName, properties, options);
               theDataset.settings.plural = modelName;
               theDataset.setup();

               app.model(theDataset);
               var restApiRoot = app.get('restApiRoot');
               app.use(restApiRoot, app.loopback.rest());

               callback(null, modelName);
           }
        }
    });
};

这很糟糕,我知道,而且我认为重载restApiRoot中间件肯定会有一些性能损失,但是在启动时创建500个模型以覆盖所有可能的数据集请求仍然会更好。