1. ホーム
  2. mongodb

[解決済み] ストア enum MongoDB

2022-02-10 21:23:33

質問

Mongoデータベースに、各ユーザーのランク(管理者、モデレーター、ユーザー...)や実績などのenumを保存しているのですが、このenumはどのようなものですか?私の知る限り、Mongo には enum データ型がないので、他の型を使って保存する必要があります。

整数で簡単に表現できるものはすべて文字列で保存するよりも、より少ないスペースで保存できると考えています。整数を使うことのもうひとつの利点は、業績やランクの名前を変更したい場合、データベースに触れることなく簡単に変更できることです。文字列を使う利点は、データを使用する前の処理が少なくて済むことと、人間が読みやすいので、バグを追跡するのに役立つことです。

Mongo で列挙型を保存する良い方法はありますか?整数か文字列のどちらかを使うべきという強い理由はありますか? (どっちがいいかという質問は避けてください)

どのように解決するのですか?

TL;DR: 文字列は、おそらく より安全 を選択し、パフォーマンスの差は無視できるほど小さいはずです。整数値は、列挙型をインデックス化する必要がある巨大なコレクションに適しています。YMMV。

<ブロッククオート

私は整数を使用してそれを格納することを考えたが、それは簡単に整数で表現できるすべてのために文字列を格納するよりも少ないスペースを使用すると仮定します

本当ですね。

整数を使うことのもうひとつの利点は、実績やランクの名前を変えたいとき、データベースに触れることなく簡単に変更できることです。

これは整数の重要な利点だと思います。しかし、そのためには、関連する値を enum は変更しないでください。もし、それをしくじると ほぼ間違いなく大惨事になる これは大きなデメリットです。

文字列を使用する利点は、データを使用する前に必要な処理が少なくて済むということです。

実際にenumデータ型を使っているのであれば、内部的には何らかの整数であるはずなので、整数の方が処理が少なくて済むはずです。いずれにせよ、そのオーバーヘッドは無視できるほど小さいはずです。

整数と文字列のどちらを使うべきかという強い理由はあるのでしょうか?

私は多くの言われたことを繰り返していますが、多分それは他の読者の助けになります。要約すると

  • enumの値マップを混同すると大混乱になる。想像してみてください。 Declined の状態が、突然 Accepted というのも Declined は値 '2' を持っていましたが、現在は Accepted 列挙の順番を変えて、手動で値を割り当てるのを忘れてしまったからです... ( 震え声 )
  • 文字列はより表現力が豊か
  • 整数の方が容量が少ない。ディスクスペースは通常問題にはなりませんが、インデックススペースはRAMを消費し、高価になります。
  • 整数の更新では、オブジェクトのサイズは変更されません。文字列は、その長さが大きく変化する場合、再割り当てが必要になることがあります。しかし、文字列のパディングとパディング係数がこれを軽減するはずです。
  • 整数は、フラグ(残念ながら(まだ)クエリ可能ではありません。 SERVER-3518 )
  • 整数を問い合わせるには $gt / $lt を実装することで、複雑な $or クエリで使用することができますが、これはかなり難解な要求で $or クエリ