なんでMongoDBのデータ登録がupsertがあるからupdateだけじゃダメなのか考える

upsertがあるのに、insertとupdateをわける必要ってあるんでしょうか?

という疑問にぶつかったので、いくつか書いてみます。

upsertとは

upsertとは、登録データの中に例えばidとかのUNIQUEキーが入っているかどうかによって、insertかupdateか自動で切り替えてくれる機能のことです。

これは、Web系のエンジニアにはよくある状況なのではないかなと思います。

upsertは必ず状況チェックするのでは?

upsertを使うと、必ず、「このデータ登録されてるんかないなー?」とMongoちゃん(アジアンテイストにあふれた感じ)がチェックしてくれます。

でも、これ絶対に必要無い場合、ありますよね?

例えば、お客様が会員登録する場合。お客様が会員登録するときは、絶対に新規登録です。つまりupdateは必要なく、insertになります。

他にも、例えば都道府県の情報を更新する場合、新規登録の画面が無いような設計の場合は、insertは必要ありません。必ずupdateになります。

このように、upsertが必要なときとそうでないときがあり、必要ないときはupsertはいらないよね?無駄だよね?となります。

upsertがいいときって少ないのでは?

世の中のデータ設計において、データがそこにあるかどうかがわからない場面というのは、もしかしたら結構無いのかもしれません。

この前、設計していたスクレイピングのシステムにおいて、”同一URLならば上書きする”という仕組みでは、upsertを利用しました。この場合は、「取得したデータが更新されている可能性がある」「対象のデータは必ず同じ発信源の情報である」など、いくつかの条件が必要になってくると思います。

MongoDBのようなNoSQLは、大量データを取り扱うことと、非同期のデータを取り扱うことがあるので、このようにupsertっていう機能が必要な場面が多いのではないかと思います。

なんでも、楽ちんはない

DB設計をきちんとしたらValidationチェックを自動化してくれるとか、ツールを使えばソースはいてくれるとか、世の中には便利なものがたくさんあります。upsertもそういうものだと思います。

だけど、UNIQUEエラーになって、データ登録できなかったっていうのも、また大事なことです。個人的には、例えば、「ユーザー登録画面をお客様用と管理者用に作って運用していたら、たまにUNIQUEエラーになってしまう。」とかいう状況ってすごく設計者にとって大事だと思います。

設計って、非常にシンプルだし、最近のWeb系フレームワークは、設計を縛ってくることもしばしばありますが(もちろんDBの仕様で縛られることもあります)、個性のカタマリです。

楽ちんはないと思って、少しずつ画面や機能の設計が上達してくるといいですよね。

スポンサーリンク
hige1
hige1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
hige1