gpt4 book ai didi

python - 在 Google App Engine 上设计可扩展的产品数据库

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:57 24 4
gpt4 key购买 nike

我建立了一个分为 3 个部分的产品数据库。每个部分都有一个包含标签的“子”部分。但是我使用它的次数越多,它就越不稳定。我所做的每一次添加都需要越来越多的代码才能让它工作。

产品由多个部分组成,每个部分都有一个类型。每个产品、部件和类型都有一个标签。每种语言都有一个标签。

产品包含 2 列表中的零件。一个默认部件列表(每种类型一个)和一个可选部件。

现在我想在组合中添加货币,并决定重新建模我处理这件事的整个方式。

我想要得到的结果是所有产品对象的列表,其中包含名称、描述、价格、所有零件以及与零件匹配的所有类型。对于这些正确的语言标签。

像这样:

product
- name
- description (by language)
- price (by currency)
- parts
- part (type name and part name by language)
- partPrice (by currency)

我当前设置的问题是 db.ReferenceProperty 和 db.ListProperty(db.key) 的混合

获取所有数据有点麻烦,需要多个 for 循环、匹配字典和数据存储调用。嗯,有点乱。

重新模型(未测试)看起来像这样

class Products(db.model)
name = db.StringProperty()
imageUrl = db.StringProperty()
optionalParts = db.ListProperty(db.Key)
defaultParts = db.ListProperty(db.Key)
active = db.BooleanProperty(default=True)

@property
def itemId(self):
return self.key().id()

class ProductPartTypes(db.Model):
name= db.StringProperty()

@property
def itemId(self):
return self.key().id()

class ProductParts(db.Model):
name = db.StringProperty()
type = db.ReferenceProperty(ProductPartTypes)
imageUrl = db.StringProperty()
parts = db.ListProperty(db.Key)

@property
def itemId(self):
return self.key().id()


class Labels(db.Model)
key = db.StringProperty() #want to store a key here
language = db.StringProperty()
label = db.StringProperty()

class Price(db.Model)
key = db.StringProperty() #want to store a key here
language = db.StringProperty()
price = db.IntegerProperty()

这里最重要的是我将标签和价格分开了。因此,这些可以包含任何产品、零件或类型的标签和价格。

所以我很好奇的是,从架构的角度来看,这是一个可靠的解决方案吗?即使每个模型中有数千个条目,这也会成立吗?

此外,欢迎提供有关以良好方式检索数据的任何提示。我当前的解决方案是首先获取所有数据,然后对它们进行循环并将它们粘贴到字典中,但感觉它随时可能会失败。

..弗雷德里克

最佳答案

您需要记住,App Engine 的数据存储要求您重新考虑设计数据库的惯用方式。一开始这与直觉相悖,但如果您希望应用程序具有可扩展性,则必须尽可能多地对数据进行非规范化。数据存储就是这样设计的。

我通常采用的方法是首先考虑在不同的用例中需要完成什么样的查询,例如。我需要同时检索哪些数据?按什么顺序?应该为哪些属性编制索引?

如果我没理解错的话,您的主要目标是获取包含完整详细信息的产品列表。顺便说一句,如果您有其他查询方案 - 即。过滤价格、类型等 - 您也应该将它们考虑在内。

为了仅从一个查询中获取您需要的所有数据,我建议您创建一个如下所示的模型:

class ProductPart(db.Model):
product_name = db.StringProperty()
product_image_url = db.StringProperty()
product_active = db.BooleanProperty(default=True)
product_description = db.StringListProperty(indexed=False) # Contains product description in all languages
part_name = db.StringProperty()
part_image_url = db.StringProperty()
part_type = db.StringListProperty(indexed=False) # Contains part type in all languages
part_label = db.StringListProperty(indexed=False) # Contains part label in all languages
part_price = db.ListProperty(float, indexed=False) # Contains part price in all currencies
part_default = db.BooleanProperty()
part_optional = db.BooleanProperty()

关于这个解决方案:

  • ListProperties 设置为indexed=False 为了避免如果你不需要,爆炸索引对它们进行过滤。
  • 为了得到合适的描述、标签或类型,您必须设置始终以相同的顺序列出值。例如:part_label[0] 是英语,part_label[1] 是西类牙语,等等。同样的价格和想法货币。
  • 从中获取实体后模型你将不得不做一些内存操作,以便以良好的方式获取数据你想要,也许在一本新词典里。

显然,采用这种设计的数据存储中会有很多冗余 - 但没关系,因为它允许您以可扩展的方式查询数据存储。

此外,这并不是要替代您心目中的架构,而是专门为您需要执行的面向用户的查询类型设计的附加模型,即。检索完整的产品/零件信息列表。

这些 ProductPart 实体可以由后台任务填充,复制位于您的其他规范化实体中的数据,这些实体将成为权威数据源。由于您在 App Engine 上有大量数据存储,这应该不是问题。

关于python - 在 Google App Engine 上设计可扩展的产品数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3785802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com