存储枚举 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= 没有任何问题] 查询...
我正在为我的 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= 没有任何问题] 查询...