我正试图找出云扳手的最佳实践。我能想到的最简单的表是Waitlist
,其中存储了用户的email
和timestamp
。email
将是主键。在另一个数据库中,我可能会将表创建为:
CREATE TABLE waitlist (
email VARCHAR(200) NOT NULL,
timestamp TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (email)
);
在Cloud Spanner中正确的方法是什么?我的第一个想法是:
CREATE TABLE waitlist (
email STRING(MAX) NOT NULL,
timestamp TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp = true),
) PRIMARY KEY (email);
但我想知道,如果例如,我想在CreationTimestamp
或其他任何东西上添加排序键。老实说,我不太确定创建它的正确方法是什么,但也许我只是想多了。
你目前对Cloud Spanner的想法完全可以基于你在问题中给出的信息。还有一些注意事项/问题:
OPTIONS (allow_commit_timestamp = true)
与DEFAULT
值不同,但在这种情况下它可能是您想要的。不同之处在于,如果您在INSERT
语句中没有指定任何内容,DEFAULT
值将在列中为您插入一个值,而如果您在INSERT
语句中没有为列指定任何内容,OPTIONS (allow_commit_timestamp = true)
将使列为空。你需要为列指定PENDING_COMMIT_TIMESTAMP()
来实际插入提交时间戳,例如:
INSERT INTO waitlist (email, `timestamp`)
VALUES ('foo@bar.com', PENDING_COMMIT_TIMESTAMP());
- 您可能想要添加一个排序键到
CreationTimestamp
。对于接收大量写操作的表,在Cloud Spanner中添加一个(二级)索引,其中第一列包含单调递增的值,这是一种反模式,因为它将创建一个热点。见https://cloud.google.com/spanner/docs/schema-design # primary-key-prevent-hotspots。如果这个表没有收到很多写操作,那么这就不是一个问题,并且在列上建立索引可能是改进搜索/排序的一种选择。你考虑这个的原因是什么?