Google cloud platform 在云数据存储中,列表属性、多个属性和祖先密钥的权衡是什么?

Google cloud platform 在云数据存储中,列表属性、多个属性和祖先密钥的权衡是什么?,google-cloud-platform,google-cloud-firestore,google-cloud-datastore,Google Cloud Platform,Google Cloud Firestore,Google Cloud Datastore,我的应用程序具有以下模型: class Employee: name = attr.ib(str) department = attr.ib(int) organization_unit = attr.ib(int) pay_class = attr.ib(int) cost_center = attr.ib(int) 它可以正常工作,但我想将我的应用程序重构为更多的微核(插件)模式,其中有一个核心员工模型,可能只有名称,插件可以添加其他属性。我想一个可能的解决方案可能是:

我的应用程序具有以下模型:

class Employee:
  name = attr.ib(str)
  department = attr.ib(int)
  organization_unit = attr.ib(int)
  pay_class = attr.ib(int)
  cost_center = attr.ib(int)
它可以正常工作,但我想将我的应用程序重构为更多的微核(插件)模式,其中有一个核心员工模型,可能只有名称,插件可以添加其他属性。我想一个可能的解决方案可能是:

class Employee:
  name = attr.ib(str)
  labels = attr.ib(list)
员工可能是这样的:

Employee(
   name='John Doe'
   labels=['department:123',
           'organization_unit:456',
           'pay_class:789',
           'cost_center:012']
)
也许另一种解决方案是只为每个“标签”创建一个实体,核心员工作为祖先密钥。该解决方案的一个问题是,当前对实体组的写入限制为每秒1次,但一旦谷歌将现有数据存储升级到新的“数据存储模式下的云Firestore”,该限制将消失(希望很快消失):

我假设list属性和祖先键方法之间的应用程序级权衡是,list方法将插件与核心更紧密地耦合,而祖先键具有某种程度上更解耦的数据方案(尽管不完全如此)


我是否还需要考虑性能或其他方面的权衡?

就我个人而言,出于许多原因,我会选择多个属性,但可以根据应用程序的要求,将所有这些解决方案混合使用,以获得不同程度的灵活性。主要的权衡是

a) 您不能在数据存储中进行连接,因此在多个实体中存储相关数据将防止使用复杂的where子句进行查询(祖先键方法) b) 如果将数字字段和日期字段作为标签,则无法执行范围查询(列表属性方法) c) 若您为标签字段编制索引,并且实际上只需要为一小部分标签编制索引,那个么索引可能会很大,而且代价也很高

所以,混合这三种元素的一种方法是

a) 对于静态数据和应用程序逻辑,请使用多个属性。 b) 对于不用于查询的动态数据,可以使用标签列表。 c) 对于插件需要查询但不需要与静态数据连接的可插入数据,您可以创建另一个实体,再次使用a)和b),以便插件将所有相关数据存储在一起