Используйте UUID в качестве основного ключа и создайте на стороне клиента.
Edit:
После вашего комментария я почувствовал, что должен остановиться на том, почему это хороший способ сделать что-то.
Хотя последовательные первичные ключи являются наиболее распространенными в базах данных, использование случайно сгенерированного первичного ключа часто является лучшим выбором для распределенных баз данных или (особенно) баз данных, которые поддерживают «отключенный» пользовательский интерфейс, то есть пользовательский интерфейс, где пользователь не является постоянно подключен к базе данных в любое время.
UUID - это лучшая форма случайно сгенерированного ключа, поскольку они гарантированно будут очень уникальными; вероятность того, что один и тот же UUID будет сгенерирован дважды, настолько мала, что его практически невозможно. UUID также распространены повсеместно; почти каждая платформа имеет встроенную поддержку для их генерации, а для тех, кто этого не делает, почти всегда есть сторонняя библиотека, чтобы справиться со слабостью.
Самым большим преимуществом использования случайно сгенерированного первичного ключа является то, что вы можете построить много сложных связей данных (с первичными и внешними ключами) на стороне клиента и (когда вы будете готовы, например, сохранить) просто сбросить все в база данных в одной массовой вставке без необходимости полагаться на шаги после вставки, чтобы получить ключ для последующих вставок отношений.
С другой стороны, UUID - это 16 байтов, а не стандартный 4-байтовый int
- в 4 раза больше места. Это действительно проблема в эти дни? Я бы сказал, что нет, но я знаю некоторых, которые будут спорить иначе. Единственная реальная проблема производительности, когда дело доходит до UUID - это индексация, в частности кластеризованная индексация. Я собираюсь проникнуть в мир SQL Server, так как я не так часто разрабатываю для Oracle, и это моя текущая зона комфорта, и расскажу о том факте, что SQL Server по умолчанию создаст кластерный индекс для всех полей в первичный ключ таблицы. Это довольно хорошо работает в мире auto-increment int и обеспечивает хорошую производительность при поиске на основе ключей. Однако любой DBA, достойный его соли, будет кластеризоваться по-другому, но люди, которые не обращают внимания на эту кластеризацию и которые также используют UUID (GUID в мире Microsoft), имеют тенденцию к некоторым неприятным замедлениям для баз данных с высокой вставкой, поскольку кластеризованные Индекс должен пересчитываться при каждой вставке, и если он кластеризован на основе UUID, который может поместить новый ключ в середину кластеризованной последовательности, возможно, потребуется перегруппировать данные lot для поддержки кластеризованного индекса. , Это может или не может быть проблемой в мире Oracle - я просто не знаю, кластеры Oracle по умолчанию кластеризованы, как в SQL Server.
Если за этим предложением о выполнении было слишком сложно следовать, просто запомните следующее: если вы используете UUID в качестве первичного ключа, не кластеризуйте по этому ключу !