Плюсы и минусы способов хранения беззнакового целого числа без типа данных беззнакового целого числа

StackOverflow https://stackoverflow.com/questions/2288881

Вопрос

У меня есть значения, которые представляют собой 64-битные беззнаковые целые числа, и мне нужно сохранить их в mongodb, который не имеет типа беззнакового целого числа.Я вижу три основные возможности для их хранения в полях других типов и преобразования при входе и выходе:

Использование подписанного целого числа, вероятно, является самым простым и наиболее эффективным способом использования пространства, но у него есть тот недостаток, что он не читается человеком, и если кто-то забудет выполнить преобразование, некоторые из них будут работать, что может скрыть ошибки.

С необработанным двоичным кодом, вероятно, труднее всего иметь дело неопытным программистам, а также он страдает от нечитаемости для человека.

Строковое представление является наименее эффективным с точки зрения использования пространства (~ 40 байтов в Юникоде против 8 байтов на поле), но тогда, по крайней мере, все возможные значения будут отображаться правильно, и для запроса требуется только преобразование в строку вместо более сложного преобразования. .

Мне нужно, чтобы эти значения были доступны на разных платформах, поэтому единое решение для конкретного драйвера не является вариантом.

Какие-нибудь важные плюсы и минусы, которые я пропустил?Какой из них вы бы использовали?

Это было полезно?

Решение

Я бы просто запихнул числа в строки.Это самое простое и наиболее совместимое решение.Большинство распространенных языков программирования предоставляют строку для нумерации в своих стандартных библиотеках.Если кому-то позже понадобится прочитать вашу базу данных с помощью другой программы, ему не нужно выяснять ваш двоичный формат хранения.Еще один бонус: при необходимости вы можете хранить числа, большие, чем беззнаковый int64.

Другие советы

Я бы сказал, используйте двоичный код - это единственное решение, описанное выше, в котором правильное получение порядка сортировки запросов будет тривиальным.

Почему строковое значение должно быть в Юникоде?Вы знаете, что значение всегда будет цифрами, поэтому вы можете использовать стандартный varchar, что означает не более 20 байт.Честно говоря, это действительно зависит от того, как значение будет использоваться.Будет ли он использоваться во многих соединениях с источником, который использует беззнаковые 64 целых числа?Если да, то в каждой строке необходимо будет выполнить преобразование.Будет ли он использоваться только для справки или для фильтрации определенных значений (в отличие от присоединения к mongodb)?Если да, то строковое значение будет работать достаточно хорошо.

Другим решением, если это возможно, было бы добавить в mongodb столбец целого числа с 64 знаками, который представляет подписанную версию целого числа без знака 64, а затем использовать это целое число со знаком в вашей базе данных.Таким образом, вы можете присоединиться к яблокам и яблокам и сравнить значения из одной системы с другой.

Учитывая то, что вы сказали, я по-прежнему утверждаю, что столбец varchar будет работать достаточно хорошо и сделает значение удобочитаемым для человека.

РЕДАКТИРОВАТЬ Другим решением было бы сохранить значение в виде 64-битного целого числа со знаком и добавить к элементу метод, который вычисляет 64-битное значение без знака, чтобы пользователи могли проверить это значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top