2017-02-16 4 views
0

У моего проекта есть потребность в хранении, так что Данные формируются как кортежи <A,B,C>. <A,B> и <A,C> являются действительными первичными ключами. Пользователи могут рассказать мой проект <A,B,_> и получить C, или можете рассказать мой проект <A,_,C> и получить B. Я изо всех сил стараюсь сделать эту работу в Cloud Spanner. Сейчас у меня есть таблица, как:Имитировать таблицу с несколькими ключами

CREATE TABLE Example { 
    A uint64 NOT NULL, 
    B uint64 NOT NULL, 
    C string(MAX) NOT NULL, 
} PRIMARY KEY (A, B) 

, что делает его очень легко получить C данную A и B (без ограничения общности), но я не могу найти способ, с помощью API чтения для извлечения B данного A и C. Более того, я ожидаю, что будет большое количество строк, но очень мало значений для A, поэтому простое получение всех строк, префикс A и фильтрация на клиенте, будет чрезмерно дорогостоящей. Еще один подход, который я могу придумать, состоит в том, чтобы иметь две избыточные таблицы <A,B,C>, один из которых связан с номером <A,B>, а один - с кодом <A,C> и только обновляет их вместе в транзакциях, но это удваивает мои записи и звучит так, как будто это приведет к проблемам параллелизма в будущем. Есть ли другой способ получить поведение, которое я хочу?

ответ

0

Вы хотите Secondary Index:

В вашем случае, вы можете создать индекс, как: CREATE INDEX ExampleByAC ON Example(A, C)

+1

4 самостоятельного ответа в течение 5 минут. Хорошая работа – RSon1234

Смежные вопросы