作为一个例子,谷歌App Engine使用谷歌数据存储,而不是一个标准的数据库,来存储数据。 是否有人使用,而不是谷歌的数据库数据存储的任何提示? 看来我训练我的头脑去思考100%的对象关系直接映射到表结构,现在很难看到不同的东西。 我能理解一些谷歌数据存储(例如性能和分发数据的能力)的好处,但一些好的数据库功能被牺牲(如连接)。
有谁谁曾与谷歌数据存储或BigTable的工作有什么好的建议与他们合作?
作为一个例子,谷歌App Engine使用谷歌数据存储,而不是一个标准的数据库,来存储数据。 是否有人使用,而不是谷歌的数据库数据存储的任何提示? 看来我训练我的头脑去思考100%的对象关系直接映射到表结构,现在很难看到不同的东西。 我能理解一些谷歌数据存储(例如性能和分发数据的能力)的好处,但一些好的数据库功能被牺牲(如连接)。
有谁谁曾与谷歌数据存储或BigTable的工作有什么好的建议与他们合作?
有比较“传统”的关系数据库时习惯有关App Engine数据存储两两件事:
认识到事情的关键 - 后面这两个差异的原因 - 是的Bigtable基本上就像一个巨大的有序字典。 因此,放置操作只是设置为给定的键的值 - 而不管该键任何先前值,并且取操作仅限于单个获取密钥或密钥的连续范围。 更复杂的查询成为可能使用索引,这基本上只是自己的表,让您实现更加复杂的查询,对连续范围扫描。
一旦你已经吸收了这一点,你必须了解数据存储的能力和局限所需要的基本知识。 这可能看起来任意的限制可能更有意义。
这里的关键是,虽然这些都是在你可以在关系数据库中做什么限制,这些相同的限制是什么让它实用扩展到了那种Bigtable的设计处理规模的。 你根本无法执行排序的查询,看起来不错在纸面上,而是残暴在SQL数据库慢。
在如何改变你的代表数据而言,最重要的是预计算。 而不是做的加入在查询时,预先计算数据并将其存储在数据存储尽可能。 如果你想选择一个随机的记录,生成一个随机数,并将其与每个记录存储。 有这些种类的技巧和窍门的整个食谱这里编辑:菜谱是不再存在。
我一直在进行有关心灵开关的方式是关于数据库完全忘记。
在关系数据库世界中,你永远不必担心数据的标准化和你的表结构。 抛弃这一切。 只是布局你的网页。 莱大家都出去了。 现在看看他们。 你已经有2/3。
如果您忘记了概念,即数据库的大小事务,数据不应该被重复的,那么你是3/4那里,你甚至都没有写任何代码! 让你的意见左右你的模型。 你不必把你的对象,使他们2维了,因为在关系世界。 现在,您可以存储与形状的物体。
是的,这是考验一个简单的解释,但它帮助我忘掉数据库,只是提出申请。 我做了迄今使用这一理念4个App Engine应用,有更多的惊喜。
我总是暗笑当人们推出了 - 这不是关系。 我已经在Django书面cellectr,这里是我下面的模型的一个片段。 正如你所看到的,我有被管理或由用户执教联赛。 我可以从联盟得到所有的管理人员,或从给定用户,我可以回到联赛中,她的教练或经理。
只是因为没有具体的外键的支持,并不意味着你不能有关系数据库模型。
我的两个便士。
class League(BaseModel):
name = db.StringProperty()
managers = db.ListProperty(db.Key) #all the users who can view/edit this league
coaches = db.ListProperty(db.Key) #all the users who are able to view this league
def get_managers(self):
# This returns the models themselves, not just the keys that are stored in teams
return UserPrefs.get(self.managers)
def get_coaches(self):
# This returns the models themselves, not just the keys that are stored in teams
return UserPrefs.get(self.coaches)
def __str__(self):
return self.name
# Need to delete all the associated games, teams and players
def delete(self):
for player in self.leagues_players:
player.delete()
for game in self.leagues_games:
game.delete()
for team in self.leagues_teams:
team.delete()
super(League, self).delete()
class UserPrefs(db.Model):
user = db.UserProperty()
league_ref = db.ReferenceProperty(reference_class=League,
collection_name='users') #league the users are managing
def __str__(self):
return self.user.nickname
# many-to-many relationship, a user can coach many leagues, a league can be
# coached by many users
@property
def managing(self):
return League.gql('WHERE managers = :1', self.key())
@property
def coaching(self):
return League.gql('WHERE coaches = :1', self.key())
# remove all references to me when I'm deleted
def delete(self):
for manager in self.managing:
manager.managers.remove(self.key())
manager.put()
for coach in self.managing:
coach.coaches.remove(self.key())
coaches.put()
super(UserPrefs, self).delete()
我从关系数据库世界进来,然后我发现这个数据存储的东西。 花了几天的时间来获得开窍了。 也有一些我发现的。
你一定已经知道,数据存储是建立按比例的是,从RDMBS分离它的东西。 与大型数据集的规模更好,应用程序引擎已经做了一些改变(指一些很大的改变)。
RDBMS VS数据存储
结构体
在数据库中,我们通常构建我们的数据表,这是在数据存储变得行种类和实体 。
关系
在RDBMS中,大多数人的folllows一到一,多到一,多对一一对多的关系,在数据存储中,因为它没有“联接”的事情,但我们仍然可以实现使用“ 的ReferenceProperty”我们的正常化例如一对一的关系例 。
索引
通常在RDMBS我们结交主键,外键,唯一键和索引键索引,以加快搜索并提高我们的数据库的性能。 在数据存储,你必须让每样ATLEAST一个索引(它会自动生成不管你喜欢还是不喜欢),因为数据存储搜索到这些指标的基础上,你的实体,并相信我是最好的部分,在RDBMS您可以搜索使用非索引字段虽然这将需要一些时间,但它会。 在数据存储不能搜索使用非索引属性。
计数
在RDMBS,它是非常容易的COUNT(*),但在数据存储,请不要甚至认为这在正常方式(是有计数功能),因为它有1000极限 ,它会花费多达小opertion因为这是实体不够好,但我们总是有很好的选择,我们可以使用碎片计数器 。
唯一约束
在RDMBS,我们喜欢这个功能吧? 但数据存储有其自己的方式。 你不能定义一个属性作为唯一:(。
询问
GAE Datatore提供了更好的功能太多LIKE (哦,不!数据存储没有LIKE关键字),SQL是GQL 。
数据插入/更新/删除/选择
这我们都关心,在RDMBS我们需要一个查询插入,更新,删除和选择,就像RDBMS,数据存储已经把,删除,得到(不要高兴得太早了),因为数据存储放置或获得的方面写,阅读,小型作业 ( 阅读数据存储成本的呼叫 )和多数民众赞成在数据建模进入行动。 你必须尽量减少这些操作,并保持你的应用程序的运行。 为了减少读操作 ,您可以使用内存缓存 。
看看的客体文档。 在页面底部的第一个评论说:
“很高兴,虽然你写了这个描述客观化,这也是我读过的AppEngine数据存储本身的最简洁的解释之一。谢谢你。”
https://github.com/objectify/objectify/wiki/Concepts
如果你已经习惯了思考ORM映射实体那么这基本上就像谷歌的App Engine基于实体的数据存储是如何工作的。 对于类似的连接,您可以看看参考性质 。 你并不真正需要的是关心它是否使用BigTable的针对后端或别的东西,因为后端由GQL和数据存储API接口抽象。
我看数据存储的方式是,一种标识表本身,而实体是表内的个别行。 如果谷歌分别采取了一种比它只是一个大表,没有结构,你可以转储任何你在实体想要的。 换句话说,如果实体不依赖于那种你几乎可以有任何结构,以在一个位置的实体和存储(一种大文件的,没有结构的,每一行都有自己的结构)。
现在回到原来的评论,谷歌的数据存储和BigTable中是两个不同的东西,所以不要混淆谷歌的数据存储到数据存储的数据存储感。 Bigtable的比BigQuery的(主要的原因,我们没有用它去)更昂贵。 BIGQUERY确实有正确的连接和类似SQL语言的RDBMS和它便宜,为什么不使用的BigQuery。 话虽这么说,BigQuery的确实有一定的局限性,这取决于你的数据的大小,你可能会或可能不会遇到他们。
此外,在数据存储方面的思考,我认为正确的说法会被“在NoSQL数据库的角度来思考”。 有太多的人可以在那里,但这些天,当谈到谷歌的产品,除了谷歌云SQL(这是MySQL的)一切是NoSQL的。
植根于数据库领域,数据存储对我将是一个巨大的表(因此得名“大表格”)。 BigTable的是一个坏榜样,但因为它做了很多其他的事情,一个典型的数据库可能不会做,但它仍然是一个数据库。 机会是,除非你知道你需要建立像谷歌的“大表格”,你可能会用标准的数据库罚款。 他们需要的是因为他们正在处理疯狂的数据和系统整合到一起,并没有商用系统真的可以做的工作,他们可以表现出精确的方式,他们需要做的工作。
(参考Bigtable中: http://en.wikipedia.org/wiki/BigTable )