存储枚举 MongoDB

Store enum MongoDB

我正在为我的 Mongo 数据库中的每个用户存储排名(管理员、版主、用户...)和成就等内容的枚举。据我所知,Mongo 没有枚举数据类型,这意味着我必须使用另一种类型来存储它。

我想过使用整数来存储它,我认为使用整数 space 比存储所有可以轻松表示为整数的字符串要少。我看到使用整数的另一个好处是,如果我想重命名成就或排名,我可以轻松更改它,甚至无需接触数据库。我看到使用字符串的一个好处是数据在使用前需要更少的处理,并且更易于阅读,这有助于追踪错误。

有没有更好的方法在 Mongo 中存储枚举?是否有充分的理由使用整数或字符串? (尽量远离哪个更好的问题)

TL;DR:字符串可能是 更安全 的选择,性能差异应该可以忽略不计。对于必须为枚举编制索引的大型集合,整数​​是有意义的。 YMMV.

I have thought of storing it using integers which I would assume uses less space than storing strings for everything that could easily be expressed as an integer

正确。

other upside I see of using integers is that if I wanted to rename an achievement or rank I could easily change it without even having to touch the database.

在我看来,这是整数的一个主要优点。但是,它还要求您确保 enum 的关联值不变。如果你搞砸了,你 几乎肯定会造成严重破坏,这是一个巨大的劣势。

A benefit I see for using strings is that the data requires less processing before it is used

如果您实际上使用的是枚举数据类型,它可能在内部是某种整数,因此整数应该需要较少的处理。无论哪种方式,该开销都可以忽略不计。

Is there an strong reason to use either integers or strings?

我重复了很多已经说过的话,但也许这对其他读者有帮助。总结:

  • 混淆枚举值映射会造成严重破坏。想象一下,您的 Declined 状态突然被解释为 Accepted,因为 Declined 的值为“2”,而现在它是 Accepted,因为您重新排序了枚举并忘记了手动赋值。 .. (不寒而栗)
  • 字符串更具表现力
  • 整数占用较少space。通常,磁盘 space 无关紧要,但索引 space 会占用昂贵的 RAM。
  • 整数更新不会调整对象的大小。字符串,如果它们的长度变化很大,可能需要重新分配。不过,字符串填充和填充因子应该可以缓解这种情况。
  • 整数可以是标志(还不可查询(还),不幸的是,参见SERVER-3518
  • 整数可以通过 $gt / $lt 查询,因此您可以有效地实现复杂的 $or 查询,尽管这是一个相当神秘的要求并且 [=17= 没有任何问题] 查询...