【发布时间】:2014-10-21 19:08:35
【问题描述】:
我正在根据实体“B”的自动生成 ID 为实体“A”创建字符串数据存储 ID。我应该在 A ID 前面加上“A-PREFIX”-B.IntID() 还是加上 B.IntID()+“A-PREFIX”?
我假设我应该从 B ID 开始,因为它们是均匀分布的,以防止热点?
反模式 #1:实体键的顺序编号
谢谢, 安德鲁
【问题讨论】:
标签: google-app-engine google-cloud-datastore
我正在根据实体“B”的自动生成 ID 为实体“A”创建字符串数据存储 ID。我应该在 A ID 前面加上“A-PREFIX”-B.IntID() 还是加上 B.IntID()+“A-PREFIX”?
我假设我应该从 B ID 开始,因为它们是均匀分布的,以防止热点?
反模式 #1:实体键的顺序编号
谢谢, 安德鲁
【问题讨论】:
标签: google-app-engine google-cloud-datastore
您根本不需要任何前缀。密钥由实体种类和 ID 组成。因此,两个实体可能具有相同的 ID,但如果它们属于不同的种类,它们仍然具有唯一的键。
这个例子工作得很好(Java 中的例子):
Entity userEntity = new Entity("User");
Long id = datastore.put(userEntity).getId();
Entity loginEntity = new Entity("Login", id);
datastore.put(loginEntity);
请注意,如果您使用 Long id 并将其转换为 String,您的键将占用更多空间。所以使用 Long 作为 id 是一个更好的选择。
【讨论】:
userEntity.setProperty("users_relative", otherUserEntity.getKey().getId())) 引用,或者使 C 成为 B 的子实体。我想不出任何需要前缀的用例。