用多个键模拟 table
Simulate a table with multiple keys
我的项目需要这样的存储空间
数据的形成类似于 <A,B,C>
的元组。 <A,B>
和 <A,C>
都是有效的主键。
用户可以告诉我的项目 <A,B,_>
并获得 C
,或者可以告诉我的项目 <A,_,C>
并获得 B
。
我正在努力在 Cloud Spanner 中完成这项工作。现在我有一个 table 像:
CREATE TABLE Example {
A uint64 NOT NULL,
B uint64 NOT NULL,
C string(MAX) NOT NULL,
} PRIMARY KEY (A, B)
这使得在给定 A 和 B 的情况下检索 C 变得非常容易(不失一般性),但是我找不到使用 Read API 来检索给定 A 和 C 的 B 的方法。此外,我希望有大量的行,但很少
A 的值,因此简单地检索所有以 A 为前缀的行并在客户端上进行过滤将非常昂贵。我能想到的另一种方法是有两个 <A,B,C>
的冗余 table,一个在 <A,B>
上,一个在 <A,C>
上,并且只在交易中一起更新它们,但这会使我的写入加倍,听起来会导致并发问题。有没有其他方法可以获得我想要的行为?
你想要 Secondary Index:
对于您的情况,您可以创建如下索引:
CREATE INDEX ExampleByAC ON Example(A, C)
我的项目需要这样的存储空间
数据的形成类似于 <A,B,C>
的元组。 <A,B>
和 <A,C>
都是有效的主键。
用户可以告诉我的项目 <A,B,_>
并获得 C
,或者可以告诉我的项目 <A,_,C>
并获得 B
。
我正在努力在 Cloud Spanner 中完成这项工作。现在我有一个 table 像:
CREATE TABLE Example {
A uint64 NOT NULL,
B uint64 NOT NULL,
C string(MAX) NOT NULL,
} PRIMARY KEY (A, B)
这使得在给定 A 和 B 的情况下检索 C 变得非常容易(不失一般性),但是我找不到使用 Read API 来检索给定 A 和 C 的 B 的方法。此外,我希望有大量的行,但很少
A 的值,因此简单地检索所有以 A 为前缀的行并在客户端上进行过滤将非常昂贵。我能想到的另一种方法是有两个 <A,B,C>
的冗余 table,一个在 <A,B>
上,一个在 <A,C>
上,并且只在交易中一起更新它们,但这会使我的写入加倍,听起来会导致并发问题。有没有其他方法可以获得我想要的行为?
你想要 Secondary Index:
对于您的情况,您可以创建如下索引:
CREATE INDEX ExampleByAC ON Example(A, C)