我想将数百万条目存储到mongob数据库中。现在,我将在device_id(这是一个像aaff33raf-22daa-333fa之类的字符串)上获得大多数查询。现在,将对象保存为主键(_id)以其当前格式存储对象是一个坏主意。如何将此字符串映射到数字并将其存储到数据库中。
所以我的问题是 - 从可扩展性的角度来看(很多阅读和大量的写作)我应该如何保留我的_id字段?整数还是字符串?
答案 0 :(得分:1)
无论选择整数还是字符串作为_id字段都不会产生很大的不同。它是一个索引字段,因此通过_id拉出或通过_id更新不会有太多不同。
也许存储值的大小是一个问题,但_id可能与整个文档相比很小......所以很可能也不是问题。
重要的是可读性和调试性,如果你总是参考像“aaff33raf-22daa-333fa”这样的产品,那么你应该继续这样做。在数据库中使用相同功能可以让您保持理智。
答案 1 :(得分:0)
如果您的设备ID是不可变的,那么我会将设备ID用作文档_id
。如果设备ID可能会更改,并且您对文档引用(如外键)进行了文档记录,那么我将使用ObjectId
s并使用设备ID创建辅助索引。
最重要的是,如果您可以将设备ID转换为数字,请确保转换后不会丢失。
虽然您提供的示例显然不是有效数字(它包含字母r
),如果这是一个拼写错误并代表设备ID的另一个字符,那么所需的总字节数存储设备ID似乎超过8个字节)。
这超出了BSON中指定的Int64数字类型。 (双倍也只存储8个字节)。
鉴于此,字符串是一个更合理(和安全)的密钥,可用作文档ID。性能差异与使用数字的差异最小。它们都被编入索引,虽然搜索数字索引可能会稍快一些(想想纳秒),但它在典型的工作流程中并不重要。
此外,在早期应用程序构建期间,访问MongoDB shell通常很有用,其中将DeviceID作为字符串我想象比将它们以编码格式存储更方便。 (db.devices.find({_id: 'aaff33raf-22daa-333fa' })
)。