Bigtable和复合主键

时间:2014-10-06 16:39:21

标签: google-app-engine app-engine-ndb bigtable google-cloud-datastore

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

  • 汽车公司
    • 主键:公司名称
  • 模型
    • 主键:公司名称,型号名称
  • 汽车
    • 主键:公司名称,型号名称,VIN

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

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

  1. Key是一组键值对,是一种将它用作复合主键等价物的方式,还是自动创建祖先关系?是否可以在不使用祖先和限制我的交易率的情况下拥有包含多个组件的密钥?这些是无情地联系在一起,还是不相关的,而且大多只是一起使用?

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

    < / LI>

1 个答案:

答案 0 :(得分:1)

回答你的两个问题:

  1. 我不熟悉ndb但数据存储区中的密钥由Kind-ID(长整数)或Kind-name(字符串)对的层次结构组成。所以,是的,创建这组键值对将强加实体组,这样汽车将在模型的实体组中,该实体组将在汽车公司的实体组中。 This page更详细地解释。

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

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