2012-06-11 4 views
3

Мы переносим некоторые данные из MySQL в Mongo и добавляем дополнительные поля в некоторые из наших таблиц БД для значения ObjectId данных перенесенных объектов данных.Кто-нибудь нашел эффективный способ хранения значений BSON ObjectId в базе данных SQL?

В данный момент мы храним их как varchar (24) latin1_general_ci, который отлично работает.

Однако для эффективного хранения/индексирования мы, вероятно, должны вернуться к 12-байтовому двоичному значению. К сожалению, MySQL только имеет native integer support up to 8 bytes. Есть ли другой вариант - двоичный?

Обновление: Я переношу из MySQL, но только определенные таблицы на данный момент. Поэтому я сначала делаю дубликаты объектов в Монго определенной таблицы. Затем я возвращаюсь к остальным таблицам, оставленным в MySQL, которые имеют ссылки на внешние ключи для этого старого идентификатора таблицы MySQL и добавляют новое поле ссылки, которое будет хранить идентификатор объекта Mongo. Затем я удалю исходное поле ссылки BIGINT.

Обновление 2: Причина, по которой я это объясняю, заключается в том, что до перемещения этих других данных может потребоваться 12 месяцев (или никогда), поэтому до тех пор она будет влиять на производительность веб-приложения в реальном времени.

+0

Вы мигрируете ** из ** MySQL или ** в ** это? –

+0

спасибо за совместное использование, я делаю то же самое, используя ту же ключевую структуру (ObejctId) в MS Sql Server 2012, MongoDb, ... – Soren

ответ

5

Диапазон 12-байтового беззнакового int будет 0..79228162514264337593543950335 (максимум 29 цифр); в соответствии с документами (один и тот же URL-адрес, который вы указали) столбец DECIMAL/упаковывает каждую группу из девяти базовых 10 цифр в четыре байта (с добавлением до байт для первых 27 цифр), при этом оставшиеся 2 цифры принимают дополнительный байт, до 13 байтов памяти для столбца DECIMAL(29).

Или вы можете сохранить их в BINARY(12).

+0

Похоже, что двоичный файл (12) может работать красиво. Я думаю, что драйверы JDBC могут даже иметь возможность автоматически марксировать hex ObjectID ... –

+0

У нас есть программное приложение с 1) компонентом в Интернете, 2) Компонент на основе мобильных устройств. Наш 1) Веб-компонент использует a) MongoDB как база данных b) ASP.NET C# Наш 2) Компонент на основе мобильной платформы использует a) Java b) SQL Lite Однако обе базы данных имеют одни и те же таблицы, но мы не создали никакой таблицы мостов между коллекциями в MongoDB и таблицами в SQL Lite. Считаете ли вы, что ваше решение может работать в моем случае? –

+1

@CSLewis SQLite3 не имеет типа «decimal». Глядя на [документацию] (https://www.sqlite.org/datatype3.html), я бы сказал, что вы, вероятно, захотите использовать тип «BLOB» (который кажется достаточно близким к типу BINARY MySQL) и хранить идентификатор объекта как двоичное значение, если вы действительно обеспокоены эффективным хранением или как 'TEXT', если вам все равно. – lanzz