5

Google Cloud Spanner recommends против использования монотонно возрастающих целых чисел для первичных ключей. Это имеет смысл для таблиц верхнего уровня, поскольку это создавало бы горячие точки. Но как насчет чередующихся таблиц? В любом случае они будут храниться на одном узле. Они также хранятся в отсортированном порядке, поэтому использование UUID или какого-либо другого случайного идентификатора кажется субоптимальным, особенно если они будут также найдены в отсортированном порядке.Автоинкремент в Google Cloud Spanner

Считывает максимальный id и сохраняет maxId + 1 для новой строки правильное решение здесь?

ответ

3

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

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

+0

Спасибо за ответ. Какова наилучшая практика использования растущих чисел в чередующихся таблицах? Это просто: max = read ("SELECT MAX (SubId) FROM SubTable WHERE ParentId = ..."); написать ("INSERT INTO SubTable (SubId, ...) VALUES (" + (max + 1) + ", ...)") ? –

+1

Как правило, рекомендуется избегать и использовать UUID со столбцом для последовательных идентификаторов, если это необходимо. Есть много опасностей, которые скрываются там, например, чтобы убедиться, что вы делаете это в транзакции, что произойдет, если последнее (и максимальное) значение будет удалено - вы можете его повторно использовать или нет ?. Вероятно, лучше использовать другую таблицу для хранения счетчика и убедиться, что у вас есть соответствующие транзакции. –