我在MongoDB中有一个用户集合。 _id目前是标准的MongoDB生成的ObjectId。对于必要的电子邮件,我也有一个独特的关键约束条件。领域。这似乎是一种浪费。
我有什么理由不放弃电子邮件'字段并将该数据作为_id字段?
答案 0 :(得分:10)
我已经阅读了Neil的回答,我对此表示赞同(我也非常怀疑'显着的性能提升')。我在你的问题中找不到的一件事是“你打算用这封电子邮件做什么”。你打算用它搜索还是只是保存在那里?而在之前的答案中没有解决的最重要的事情之一是它会被改变吗?
使用您的系统的人将会更改他们的电子邮件(丢失/不再使用)并不罕见。如果您将_id
作为电子邮件,则无法轻松更改(您无法在mongo中修改_id
)。在这种情况下,你需要复制,删除添加新元素(这不是原子的)。
所以我认为这是不这样做的一个重要原因。但您需要决定是否允许人们更改电子邮件地址。
答案 1 :(得分:3)
一般来说,没有真正的理由,事实上,如果你确实使用了你的电子邮件,那么可以实现显着的性能提升。作为主键。
您的大多数查询实际上都在该主键上。即使为不同的字段创建一个唯一的密钥,MongoDB也经过优化,以便"查找" _id
字段索引是明智之举。它始终在那里。
没有用于索引的额外空间。因此,再次查找主键时,除了默认索引之外,不需要引入任何其他内容,除了可能产生的I / O成本之外,还可以自然节省磁盘空间。
也许唯一真正相关的考虑因素是分片。只有当你的用例更适合某些不同形式的" bucketed"分配"高/低"例如,卷用户。在这种情况下,为了促进这一点,将需要一些其他形式的主键。
通常占据ObjectId
字段的默认_id
类型很棒,因为它维护了自然的广告订单,甚至还可以执行基于通用范围的查询或基于时间的查询等操作(在合理范围内)。因此,在需要自然插入顺序的情况下,它通常是最佳选择,并且具有高度的碰撞安全性。
但是,如果您通常希望有效查找主键值,那么任何充当自然主键的内容都理想地放在集合的_id
字段中,只要它有合理的保证是唯一的。