よし、私は「見たい」リストを作成できる個人的なプロジェクトに取り組んでいる。ユーザーは公開 API (TheMovieDB) を使用して良いと聞いた映画を検索し、ウォッチリストに追加できます。映画が追加されるたびに、データをデータベースに保存します。次の表を使用します(質問に関係のない列を除く):
ユーザー
- ID
映画
- ID(PK)
- tmdbID (固有)
movie_users
- ID(PK)
- movie_ID (映画テーブルの ID を参照する FK)
- user_ID (FK は users テーブルの ID を参照します)
ジャンル
- ID(PK)
- 名前 (固有)
ジャンル_映画
- ID(PK)
- ジャンル_ID (FK はジャンル テーブルの ID を参照)
- movie_ID (映画テーブルの ID を参照する FK)
ON DUPLICATE KEY UPDATE 機能が必要だったため、MariaDB を使用しました。このデータベースには元のデータがないためです。たとえば、誰かが映画をデータベースに追加したいが、データベースにこの映画が既にある場合などです。 、movies_users テーブルに新しい行を追加したいだけです。同時に、ジャンルに関してはその機能も使用しています。
言語に関しては、私は NodeJS を BookshelfJS と共に使用しています。
現在、私は SQL の専門家ではないので、自分の作業方法が最適かどうかはわかりません。さらに、私は Promises に精通していません。これは、映画をデータベースに追加するときに使用するコードです: http://codeshare.io/BPWDV .
最も安全な方法だと思うので、トランザクションを使用しますか? ON DUPLICATE KEY UPDATE を使用できるように、knex.raw ( http://knexjs.org/#Raw-Queries ) も使用する必要がありました。基本的に、これは何が起こっているのかです:
- 既存の行に応じて、movies テーブルに映画を INSERT しようとしています
- 映画が既にテーブルにある場合は、映画の ID を探して、movies_users テーブルで使用できるようにします。挿入された行の ID が返されるため、映画が最初にそこになかった場合、ID を探す必要はありません。
- movie_users テーブルに行を挿入します
- 映画のさまざまなジャンルをマッピングします。映画で行ったのと同じようにすべてのジャンルについて試してみましたが、重複の可能性に応じて、挿入するか、何もしません。挿入されない場合は、既にテーブルにあるジャンルの ID を探します。
- 次に、ジャンルの ID と映画の ID を使用して、genles_movies テーブルに行を挿入します。
個人的には、これはそのようなことを達成するための恐ろしい方法のように見えるので、間違ったことをしているに違いないと感じています. 約束の連鎖全体も見た目も感じもぎこちない。それは機能しますが、もっと良い方法があると思いますか?
私はactorsテーブルとactors_moviesテーブルも使用することを計画していますが、そこにどのように収まるかはわかりません(Promise.map全体で)。
最終的に、私の質問は次のとおりです。コードが正しい場合、コードをクリーンアップするにはどうすればよいですか、またはコードがまったく最適でない場合、私がやろうとしていることを達成するためのより良い方法は何ですか?