存储enum MongoDB

时间:2015-02-08 11:51:03

标签: mongodb enums

我正在为Mongo数据库中的每个用户存储排名(管理员,主持人,用户...)和成就等枚举的枚举。据我所知,Mongo没有枚举数据类型,这意味着我必须使用其他类型存储它。

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

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

1 个答案:

答案 0 :(得分:26)

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

  

我曾想过使用整数来存储它,我认为这比使用可以很容易表示为整数的所有内容存储字符串所占用的空间少

真。

  

我看到使用整数的其他好处是,如果我想重命名成就或排名,我可以轻松地更改它,甚至无需触及数据库。

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

  

我看到使用字符串的好处是数据在使用之前需要较少的处理

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

  

是否有充分理由使用整数或字符串?

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

  • 混合枚举值图会造成严重破坏。想象一下,您的Declined州突然被解释为Accepted,因为Declined的价值为' 2'现在它是Accepted,因为你重新排序枚举并忘了手动分配值...( shudders
  • 字符串更具表现力
  • 整数占用的空间更少。通常,磁盘空间并不重要,但索引空间会占用昂贵的RAM。
  • 整数更新不会调整对象的大小。字符串,如果它们的长度变化很大,可能需要重新分配。但是,字符串填充和填充因子应该可以缓解这种情况。
  • 整数可以是标志(尚不可查询),遗憾的是,请参阅SERVER-3518
  • $gt / $lt可以查询整数,因此您可以有效地实施复杂的$or查询,但这是一个相当晦涩的要求,{{{{{{ 1}}查询...