Bigtable 和复合主键

Posted

技术标签:

【中文标题】Bigtable 和复合主键【英文标题】:Bigtable and Compound Primary Keys 【发布时间】:2014-10-06 16:39:21 【问题描述】:

我知道 GAE 数据存储不是 SQL,复合主键的概念也不是与 SQL 的 1:1 映射。但我想我想创造一个类似的东西,并正在寻找关于它如何工作的共识。这是我的数据模型:

汽车公司 主键:公司名称 型号 主键:公司名称、型号名称 汽车 主键:公司名称、型号名称、VIN

在 SQL 中,模型上的“公司名称”和“模型名称”将是我的主键(其中的“公司名称”也是外键)。那么 Car 会有一个复合外键 Car(company name, model name) -> Model(Company name, model name)

ndb 库中,Key 实际上是一组键/值对,但看起来与祖先相关,用于事务。我不需要为此的事务(事实上,由于祖先将整个实体组限制为每秒大约一次事务,我根本不想在这里使用祖先)。所以我的问题是:

    Key 是一组键值对这一事实是否可以将其用作等效的复合主键,还是会自动创建祖先关系?是否可以在不使用祖先并限制我的交易率的情况下拥有具有多个组件的密钥?这些是无情地联系在一起,还是不相关且大多只是一起使用?

    人们通常如何处理 Google Datastore/Bigtable 中的这个概念?我可以通过将键连接成一个字符串来伪造复合键(而不是像[Ford, Focus] 这样的列表,我可以只创建像"Ford/Focus" 这样的字符串),这是大多数人做的吗?

【问题讨论】:

【参考方案1】:

回答你的两个问题:

    我不熟悉 ndb,但 Datastore 中的键由 Kind-ID(长)或 Kind-name(字符串)对的层次结构组成。所以,是的,创建该组键值对将强加实体组,这样 Car 将位于 Model 的实体组中,而 Model 的实体组将位于 Car Company 的实体组中。 This page 解释更详细。

    您的数据模型实际上将取决于您希望如何查询和更新它,但值得注意的是,Datastore 不会对您的数据实施任何约束,您的应用程序将需要这样做。所以,是的,创建一个唯一的字符串,例如 ford.focus 可能是创建模型标识符的一种方法。然后,您可以使用 ford.focus.12345 之类的东西作为汽车标识符。或者,您可以只允许 Datastore 自动为您创建一个 Long ID,然后让您的 Car 实体将一个 Key 存储到其 Model 中,而后者又可以有一个引用其 Car Company 实体的 Key。您可能希望在规范化上有一些冗余,并在您的 Car 实体中拥有 Model 和 Car Company 的键 - 同样,这取决于您需要查询/获取的数据以及频率。

要记住的重要一点是,通过键获取比查询更好,因此您的应用程序的需求将对您的实体模型产生影响。

【讨论】:

“要记住的重要一点是,按键获取比查询更好”这正是我提出问题的动力,是的。谢谢!

以上是关于Bigtable 和复合主键的主要内容,如果未能解决你的问题,请参考以下文章

复合主键?还是具有唯一复合索引的自动增量主键? [关闭]

如何在 SQL 中定义复合主键?

MySQL 中的复合主键性能缺陷

使用复合/复合主键的缺点是啥?

SpringData JPA复合主键

hibernate 复合主键映射