ユーザーがアップロードしたスプレッドシートを PostgreSQL のテーブルとして保存するアプリがあります。ユーザーがスプレッドシートをアップロードするたびにDataset
、物理テーブル名、そのエイリアス、および所有者を含むテーブルにレコードを作成します。特定のデータセット情報を取得できます
GET domain.com/v1/Datasets/{id}
私の知る限り、行と物理テーブルの関係をDataset
FK で強制することはできません。少なくとも、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 番目のものはまだ作業していません。オーバーヘッドがどれくらいかかるかはわかりませんが、実行可能であると確信しています。
そこで、深く掘り下げる前に、次の質問をするようになりました。この行と表の関係を扱った人はいますか? これの良い習慣は何ですか?