Я хотел бы сохранить полную историю записи в базу данных по указанной таблице c. Основное использование этой таблицы - чтение последних данных, но полная аудиторская проверка всех вставок и обновлений также является бизнес-требованием. Официальный документ Spanner здесь вызывает анти-паттерны схемы, а один из них о монотонно увеличивающихся данных, используемых в качестве первичного ключа. Это касается изменения порядка первичного ключа, может распределить нагрузку, а также предлагает использовать хеширование, осколок по модулю, UUID и т. Д. c.
Это сообщение в блоге Google Cloud упоминается использование ShardId
вместо отметки времени. Предпочтительнее использовать ha sh.
Обратите внимание, однако, что использование простого ha sh сделает запросы по диапазону отметок времени очень медленными, так как получение диапазон временных меток потребует полного сканирования таблицы, чтобы охватить все хэши. Вместо этого мы рекомендуем генерировать ShardId из отметки времени.
В качестве примера настройки таблицы предоставляется запрос с использованием TimestampShardId
.
TimestampShardId = CRC32(Timestamp) % 100
CREATE TABLE Events (
TimestampShardId INT64 NOT NULL
Timestamp TIMESTAMP NOT NULL,
event_info...
) PRIMARY KEY (TimestampShardId, Timestamp DESC)
Select * from Events
WHERE
TimestampShardId BETWEEN 0 AND 99
AND Timestamp > @lower_bound
AND Timestamp < @upper_bound;
I'm не понимая, как это TimestampShardId
делает сканирование быстрее, чем простое хеширование. Похоже, что для обоих подходов нужно сканировать всю таблицу - может кто-нибудь рассказать мне, почему предпочтительнее ShardId
? Например, чтобы получить полную историю, возникнет ли проблема с таблицей истории с отметкой времени ha sh в качестве первичного ключа? Как насчет первичных ключей с UUID и отметкой времени?