python - Python 模型的 Google Cloud Datastore 真实世界示例

标签 python google-app-engine google-cloud-datastore database nosql

我是 Google Datasore 和 Python 的新手,但我有一个相关项目。即使有很棒的谷歌文档,我也错过了一个真实世界的数据建模示例。所以这里是我项目的一部分,以及模型化的提议和一些关于它的问题...... 我相信您可以帮助我更清楚地了解 Datastore,我认为这些问题可以帮助像我这样的初学者了解如何对我们的数据建模以拥有出色的应用程序!

足球 Feed 包含一些关于比赛本身的一般信息,例如:所属比赛的名称、球队名称、赛季、比赛日、获胜球队。

对于每支队伍,无论胜负,我们都有比赛期间发生的 Action 的详细信息:牌和进球。 对于卡片,我们有这些信息:颜色、发生时间、玩家 ID、原因、发生时间。 对于目标,我们有周期、玩家 ID、时间、玩家助手 ID。

我们还有每支球队的详细信息:球员姓名、他们的位置(中锋、中锋……)和出生日期。

这里是我想使用 python 将足球提要中的数据提取到数据存储区的模型:

我有一些实体:Team、Player、Match、TeamData、Card 和 Goal。 对于每场比赛,我们将有两个 TeamData 每个球队和行动细节(卡片和目标) 我在 TeamData 和 Match 之间以及 Card/Goal 和 TeamData 之间使用了 Key Property,但我认为我可以使用父关系,我不知道什么是最好的。

class Team(ndb.Model):
name = ndb.StringProperty()

class Player(ndb.Model):
teamKey = ndb.KeyProperty(Kind=Team)
name = ndb.StringProperty()
date_of_birth
position = ndb.StringProperty()

class Match(ndb.Model):
name_compet = ndb.StringProperty() 
round = ndb.StringProperty()
season
matchday
team1Key = ndb.KeyProperty(Kind=Team)
team2Key = ndb.KeyProperty(Kind=Team)
winning_teamKey = ndb.KeyProperty(Kind=Team)

class TeamData(ndb.Model):
match = ndb.ReferenceProperty(Match, collection_name=’teamdata’)
score
side(away or home) = ndb.StringProperty()
teamKey = ndb.KeyProperty(Kind=Team)

class Card(ndb.Model):
teamdata = ndb.ReferenceProperty(TeamData, collection_name=’card’)
playerKey = ndb.KeyProperty(Kind=Player)
color = ndb.StringProperty()
period = ndb.StringProperty()
reason = ndb.StringProperty()
time
timestamp

class Goal((ndb.Model):
teamdata = ndb.ReferenceProperty(TeamData, collection_name=’goal’)
period = ndb.StringProperty(Kind=Player)
playerkey = ndb.KeyProperty(Kind=Player)
time = ndb.StringProperty()
type = ndb.StringProperty()
assistantplayerKey = ndb.KeyProperty(Kind=Player)

这里是我的问题:

这个模型化是否“正确”并允许基本查询(哪支球队在某一天比赛,结果是什么,以及某场比赛的卡片和目标(球员、助理、原因、时间)的详细信息)

和更复杂的查询(某个球员在某个赛季进了多少球)?

我真的看不出 SQL 数据库和 NoSQL 数据库(如 DataStore)之间的区别,除了数据存储处理键而不是我们。你能清楚地解释一下我使用这种 NoSQL 模型化有什么优势吗?

谢谢你帮助我!

最佳答案

NoSQL 使其速度更快,并且不依赖于扫描数据的大小。对于 SQL 中的 3 TB 表,无论您返回什么,它都将花费相同的“计算时间”服务器端。在 Datastore 中,由于它直接扫描您需要的位置,返回的行/列的大小实际上决定了它需要的时间。

另一方面,它需要更多的时间来保存(因为它需要保存到多个索引),而且它不能进行服务器端计算。例如,对于数据存储,您不能求和或求平均值。数据存储仅扫描并返回,这就是它如此之快的原因。它从未打算代表您进行计算(因此“它可以进行更复杂的查询吗?”的答案是否定的。但这不是您的模型,而是数据存储)。可以帮助完成这些总和的一件事是在不同的实体中保留一个计数器并根据需要更新它(有另一个实体“totalGoals”和“keyOfPlayer”和“numberOfGoals”)

值得一提的是最终一致性。在 SQL 中,当您“插入”时,数据就在表中,可以立即检索。在 Datastore 中,一致性不是即时的(因为它需要复制到不同的索引,你无法知道何时插入完全完成)。有一些方法可以强制一致性。祖先查询就是其中之一,直接按键查询或打开数据存储区查看器也是如此。

另一件事,即使它不会触及你(本着“为其他初学者提供问题,我尽量包括我能想到的尽可能多的问题”的相同想法)是祖先查询,以确保它们安全,当您查询一个时,实际上卡住他们正在使用的实体组(实体组 = parent + child + child 的 child + 等)。

其他问题?请参阅有关 entities 的文档, indexes , queries , 和 modeling for strong consistencies .或者随时提问,我会因此编辑我的答案:)

关于python - Python 模型的 Google Cloud Datastore 真实世界示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25515498/

相关文章:

javascript - 无法对用户 API 后面的 App Engine 使用 Javascript 提取

python - 从 Python 中删除 GAE NBD 实体并刷新 Memchach 后,数据存储查看器中仍然可以看到它们

python - 比较Python列表中的数字序列

ios - 为什么 Apns 推送通知不适用于所有 iPhone

python - 如何用python写一个不间断的爬虫并在服务器上运行?

python - 为什么我的导入不再有效?

google-app-engine - Go 中奇怪的数据存储错误, "The kind is the empty string"

python - 处理 Appengine 中的 RequestTooLargeError 异常

python - 在 python 中搜索二维数组 - 最佳方法+缩进错误

python - Docker容器运行后存在且日志中没有错误