【问题标题】:Has anyone found an efficient way to store BSON ObjectId values in an SQL database?有没有人找到一种将 BSON ObjectId 值存储在 SQL 数据库中的有效方法?
【发布时间】:2012-09-12 04:31:55
【问题描述】:

我们正在将一些数据从 MySQL 迁移到 Mongo,并一直在为我们的一些数据库表添加额外的字段,以获取迁移数据对象的 ObjectId 值。

目前我们将它们存储为 varchar(24) latin1_general_ci ,它工作正常。

但是,为了有效的存储/索引,我们可能应该转换回 12 字节的二进制值。不幸的是,MySQL 似乎只有native integer support up to 8 bytes。还有另一种选择 - 也许是二进制?

更新:我正在从 MySQL 迁移,但目前只迁移某些表。所以我首先在某个表的 Mongo 中复制对象。然后我回到 MySQL 中剩下的任何其他表,这些表具有对旧 MySQL 表 ID 的外键引用,并添加一个新的引用字段来存储 Mongo 对象的 ID。然后,我将删除原始参考字段 BIGINT。

更新 2: 我提出这个问题的原因是,我们可能需要再过 12 个月(或永远不会)才能移动这些其他数据,因此它会对实时 Web 应用程序的性能产生影响在那之前。

【问题讨论】:

  • 您是 MySQL还是迁移到它?
  • 感谢分享,我也是这样做的,在 MS Sql Server 2012、MongoDb、...中使用相同的密钥结构(ObejctId)...

标签: mysql mongodb migration bson


【解决方案1】:

12 字节无符号整数的范围为0..79228162514264337593543950335(最多 29 位);根据文档(您引用的相同 URL),DECIMAL/NUMERIC 列将每组九个 base10 数字打包成四个字节(前 27 位加起来为 floor(29 / 9) * 4 = 3 * 4 = 12 字节),其余 2 位数字占一个额外的字节,为DECIMAL(29) 列提供最多 13 个字节的存储空间。

或者,您可以将它们存储为BINARY(12)

【讨论】:

  • 看起来 binary(12) 可能工作得很好。我认为 JDBC 驱动程序甚至可以自动编组十六进制 ObjectID...
  • 我们有一个软件应用程序,其中包含 1) 基于 Web 的组件,2) 基于移动设备的组件。我们的 1) 基于 Web 的组件使用 a) MongoDB 作为数据库 b) ASP.NET C# 我们的 2) 基于移动的组件使用 a) Java b) SQL Lite 但是,两个数据库具有相同的表,但我们没有创建MongoDB 中的集合和 SQL Lite 中的表之间的任何类型的桥接表。您认为您的解决方案适用于我的情况吗?
  • @CSLewis SQLite3 没有decimal 类型。查看the documentation,我会说您可能想要使用BLOB 类型(它似乎与MySQL 的BINARY 类型足够接近)并将对象ID 存储为二进制值,如果您真的关心高效存储, 或者 TEXT 如果你不在乎。
  • 如果你将它存储为二进制(12)你还能加入它吗?使用二进制列作为主/外键列的效率是什么?
猜你喜欢
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2013-03-26
  • 2023-03-07
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多