0

ユーザーがアップロードしたスプレッドシートを PostgreSQL のテーブルとして保存するアプリがあります。ユーザーがスプレッドシートをアップロードするたびにDataset、物理テーブル名、そのエイリアス、および所有者を含むテーブルにレコードを作成します。特定のデータセット情報を取得できます

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

私の知る限り、行と物理テーブルの関係をDatasetFK で強制することはできません。少なくとも、PostgreSQL の information_schema で FK を作成している人を見たことがなく、FK でテーブルを削除できない、またはできますか? そのため、孤立したテーブル、またはその中のレコードが Dataset 存在しないテーブルを指していることがよくあります。ビジネスロジックとクリーニングタスクでこれを管理しました。

ここで、これらの物理テーブルの 1 つにアクセスするには、たとえば呼び出されたものnba_teamsにループバックで NbaTeams モデルを宣言し、アプリを再起動して、そのレコードを次のようにクエリする必要があります。

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

しかし、特に 1 日に 100 件ほどのアップロードがある場合は、これでは拡張できません。したがって、私が立っている場所からは、次の 2 つの方法があります。

1.- 1 つのモデルを作成し、テーブル名を文字列として受け入れる 4 つのカスタム メソッドを追加し、生のクエリを介してそのテーブル名に対して次の CRUD 操作を実行します。たとえば、レコードを一覧表示するには:

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

または、1 つのチームを更新するには

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

これはエレガントではないように聞こえますが、機能するはずです。

2.- テーブル名を文字列として受け入れるカスタム メソッドを作成します。これにより、エフェメラル モデルが作成され、HTTP 動詞と残りの引数がそれに転送されます。

dataSource.discoverAndBuildModels('nba_teams', {
    owner: 'uploader'
}, function (err, models) {
    console.log(models);
    models.NbaTeams.find(function (err, act) {
        if (err) {
            console.error(err);
        } else {
            console.log(act);
        }
        dataSource.disconnect();
    });
});

この 2 番目のものはまだ作業していません。オーバーヘッドがどれくらいかかるかはわかりませんが、実行可能であると確信しています。

そこで、深く掘り下げる前に、次の質問をするようになりました。この行と表の関係を扱った人はいますか? これの良い習慣は何ですか?

4

1 に答える 1

1

最後に、私は独自のハッキーな回避策を実行し、いつか誰かを助けるかもしれないと考えました.

私がしたことは、 /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 モデルを作成して、考えられるすべてのデータセット リクエストをカバーするよりはましです。

于 2014-11-13T13:09:06.967 に答える