我有一个应用程序将用户上传的电子表格存储为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}
这第二个我尚未开始工作,而且我不知道它可能有多少开销,但我确信它是可行的。
所以在我深入挖掘之前,我来问:有没有人处理过这种行到表的关系? 这个有哪些好的做法?
答案 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个模型以覆盖所有可能的数据集请求仍然会更好。