When to use entity groups in GAE's Datastore

2020-02-28 04:02发布

问题:

Following up on my earlier question regarding GAE Datastore entity hierarchies, I'm still confused about when to use entity groups.

Take this simple example:

  • Every Company has one or more Employee entities
  • An Employee cannot be moved to another Company, and users that deal with one Company can never see the Employees of another Company

This looks like a case where I could make Employee a child entity of Company, but what are the practical consequences? Does this improve scalability, hurt scalability, or have no impact? What are other advantages/disadvantages of using or not using an entity hierarchy?

(Entity groups enable transactions, but assume for this example that I do not need transactions).

回答1:

Nick stated clearly that you should not make the groups larger than necessary, the Best practices for writing scalable applications has some discussion one why.

Use entity groups when you need transactions. In the example you gave, a ReferenceProperty on employee will achieve a similar result.

Aside from transactions, entity groups can be helpful because key-fetches and queries can be keyed off of a parent entity. However, you might want to consider multitenancy for these types of use-cases.

Ultimately large entity groups might hurt scalability, entities within an entity group are stored in the same tablet. The more stuff you cram into one entity group, the more you reduce the amount of work that can be done in parallel -- it needs done serially instead.



回答2:

If you don't need transactions, don't use entity groups. They slow things down in some cases, and never speed anything up. Their only benefit is that they enable transactions.

As far as I can tell, the best place to use entity groups is on data that isn't likely to be accessed by many users at the same time, and that you'll frequently want to include in a transaction. So, if you stored the contents of a shopping cart, which probably only the owner of that cart will deal with frequently, those contents might be good for an entity group - it'll be nice to be able to use a transaction for that data when you're adding or updating an entity, and you're not locking anyone else out of anything when you do so.