Какой тип данных рекомендуется для столбцов ID?

Используйте BasicDBObjectBuilder для преобразования вашего POJO в экземпляр DBObject , который DBCollection может сохранить:

import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DBObject;

public class Employee {
    private long no;
    private String name;

    // Getters and Setters

    public DBObject toDBObject() {
        BasicDBObjectBuilder builder = BasicDBObjectBuilder
                .start("no", no)
                .append("name", name);
        return builder.get();
    }
}

Для того, чтобы сохранить, просто вызовите toDBObject() для экземпляра POJO и предоставьте его в коллекцию:

public class test {

    public static void main(String[] args) throws UnknownHostException,
            MongoException {
        ...
        DBCollection dbCollection = db.getCollection("NameColl");

        Employee employee = new Employee();
        employee.setNo(1L);
        employee.setName("yogesh");

        dbCollection.save(employee.toDBObject());
    }
}

Используя этот подход:

  • Вам не нужно вручную создавать DBObject каждый раз
  • Вам не нужно портить ваш POJO, расширяя классы Mongo (что, если ваш POJO уже расширяет класс?)
  • Вам не нужен картограф Json [и его аннотации к полям POJO]
  • У вас есть зависимость только от java-mongo-driver jar

7
задан Tomas Aschan 31 May 2009 в 14:18
поделиться

8 ответов

Любой целочисленный тип достаточного размера для хранения ожидаемых диапазонов данных. Обычно 32-битные целые числа считаются слишком маленькими (правильно или ошибочно) для таблиц с большим количеством строк или изменений. 64-битного int достаточно. Многие базы данных не имеют или не будут использовать этот целочисленный тип, но будут использовать тип ЧИСЛО с указанным масштабом и точностью. 10-15 цифр - довольно распространенный размер.

Целочисленные типы выбирают по двум причинам:

  1. Размер; и
  2. Скорость.

Размер целого числа:

  • 32 бита: 4 байта;
  • 64 бита: 8 байтов;
  • Десятичное число с двоичным кодированием: две цифры на байт плюс столько же байт для знака, масштаба и / или точности.

Сравните это с GUID , который составляет 128 бит или обычную строку, который составляет по крайней мере один байт на символ (больше в некоторых кодировках символов) плюс накладные расходы, которые могут составлять всего один байт (завершение нулем) или могут быть намного больше в некоторых случаях.

Сортировка целых чисел тривиальна и, если они уникальны, а диапазон достаточно мал, фактически может быть выполнено за O (n) время по сравнению, в лучшем случае, с O (n log n).

также, что не менее важно, большинство баз данных могут генерировать уникальные идентификаторы с помощью столбцов и / или последовательностей с автоинкрементом. В противном случае гарантировать уникальность в приложении довольно сложно и, как правило, приводит к раздуванию ключей.

Плюс автоматически сгенерированные целочисленные ключи обычно либо слабо, либо абсолютно упорядочены (в зависимости от базы данных и конфигурации), что является полезным качеством. Случайно сгенерированные идентификаторы GUID в основном неупорядочены, что гораздо менее полезно.

предполагая, что они уникальны и диапазон достаточно мал, на самом деле может быть выполнено за O (n) время по сравнению с, в лучшем случае, O (n log n).

также, что не менее важно, большинство баз данных могут генерировать уникальные идентификаторы с помощью автоприращения столбцов и / или последовательностей. В противном случае гарантировать уникальность в приложении довольно сложно и, как правило, приводит к раздуванию ключей.

Плюс автоматически сгенерированные целочисленные ключи обычно либо слабо, либо абсолютно упорядочены (в зависимости от базы данных и конфигурации), что является полезным качеством. Случайно сгенерированные идентификаторы GUID в основном неупорядочены, что гораздо менее полезно.

предполагая, что они уникальны и диапазон достаточно мал, на самом деле может быть выполнено за O (n) время по сравнению с, в лучшем случае, O (n log n).

также, что не менее важно, большинство баз данных могут генерировать уникальные идентификаторы с помощью автоприращения столбцов и / или последовательностей. В противном случае гарантировать уникальность в приложении довольно сложно и, как правило, приводит к раздуванию ключей.

Плюс автоматически сгенерированные целочисленные ключи обычно либо слабо, либо абсолютно упорядочены (в зависимости от базы данных и конфигурации), что является полезным качеством. Случайно сгенерированные идентификаторы GUID в основном неупорядочены, что гораздо менее полезно.

В противном случае гарантировать уникальность в приложении довольно сложно и, как правило, приводит к раздуванию ключей.

Плюс автоматически сгенерированные целочисленные ключи обычно либо слабо, либо абсолютно упорядочены (в зависимости от базы данных и конфигурации), что является полезным качеством. Случайно сгенерированные идентификаторы GUID в основном неупорядочены, что гораздо менее полезно.

В противном случае гарантировать уникальность в приложении довольно сложно и, как правило, приводит к раздуванию ключей.

Плюс автоматически сгенерированные целочисленные ключи обычно либо слабо, либо абсолютно упорядочены (в зависимости от базы данных и конфигурации), что является полезным качеством. Случайно сгенерированные идентификаторы GUID в основном неупорядочены, что гораздо менее полезно.

8
ответ дан 6 December 2019 в 08:17
поделиться

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

Что касается того, что использовать, это всегда выбор. Одно не ясно лучше , чем другое, у них разные характеристики, и каждый из них хорош в разных сценариях. Я использовал и то, и другое с течением времени, и в следующей схеме, с которой я работаю, я рассмотрю оба.

Плюсы GUID:

  • Должен быть уникальным на разных компьютерах.
  • Случайное, незапоминаемое липкое вещество означает, что люди, вероятно, будут его использовать. только по прямому назначению непрозрачного идентификатора.

Плюсы автоинкремента:

  • Понятно для человека.
  • Последовательное присвоение означает, что вы можете использовать кластерный индекс и влиять на производительность.
  • Подходит для разделение данных.
6
ответ дан 6 December 2019 в 08:17
поделиться

Большой недостаток использования ключей GUID заключается в том, что его трудно выполнять «специальные» запросы вручную. Иногда очень полезно сделать это:

SELECT * FROM User, где UserID = 452245

С ключами GUID это может стать очень раздражающим.

Я бы рекомендовал 64-битные целые числа

5
ответ дан 6 December 2019 в 08:17
поделиться

Скажите, какие критерии вы считаете важными.

Требуется , чтобы быть уникальным в таблице.

GUID - это глобальный вероятностно-уникальный идентификатор . Тоже большой. Если вам нужно, чтобы ваши индексы были уникальными с точностью до эпсилона по сравнению с любой другой установкой базы данных во вселенной, это хороший выбор. В противном случае он использует излишне много места.

Автоинкремент - это хорошо; он маленький и обязательно будет уникальным в пределах таблицы. С другой стороны, это не дает вам защиты от дублирования; две записи, идентичные за исключением магического числа, легко создать.

Использование некоторого значения, связанного с описываемой сущностью, позволяет избежать этого, но у вас возникает проблема с уникальностью.

2
ответ дан 6 December 2019 в 08:17
поделиться

Если вы используете long, вы можете создать более 1000 в секунду и не использовать первичные ключи в течение 29 миллионов лет.

Другие уже упоминали некоторые преимущества использования целого числа введите вместо UUID / GUID. Одно из больших преимуществ - скорость и компактность индексов.

В приложении, в котором я недавно участвовал, где я занимался проектированием базы данных, мне нужны были UUID, но я не хотел отказываться от преимуществ использования long для первичных keys, поэтому у меня была таблица allIds, которая сопоставляла каждый первичный ключ в системе с UUID. Все мои первичные ключи были сгенерированы из одной последовательности, поэтому все они были уникальными для всех таблиц.

1
ответ дан 6 December 2019 в 08:17
поделиться

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

Было бы хорошо, если бы базы данных могли обеспечивать встроенную поддержку автоинкрементов с «префиксами». Итак, в одной базе данных я получаю такие идентификаторы, как X1, X2, X3 ... и так далее, тогда как в другой базе данных это могут быть Y1, Y2, Y3 ... и так далее.

0
ответ дан 6 December 2019 в 08:17
поделиться

I asked a similar question which has a few answers that might help. Replication seems to be the biggest advantage of using GUIDs.

Reasons not to use an auto-incrementing number for a primary key

0
ответ дан 6 December 2019 в 08:17
поделиться

Follow Cletus's advice, with the additional caveat of it largely depends on what your storting. Never, ever, use a GUID. GUID's have a whole bundle of downsides, and only one or two upsides.

0
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: