Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 数据库问题:将简单关系表更改为非关系表?_Mysql_Database_Database Design_Rdbms_Non Relational Database - Fatal编程技术网

Mysql 数据库问题:将简单关系表更改为非关系表?

Mysql 数据库问题:将简单关系表更改为非关系表?,mysql,database,database-design,rdbms,non-relational-database,Mysql,Database,Database Design,Rdbms,Non Relational Database,我有一个在MySQL数据库上运行的web应用程序(正在开发中)。我正在考虑将我的应用程序迁移到GoogleAppEngine,并希望更好地理解如何将我的简单关系数据库模型转换为非关系方法 我是一个长期使用关系数据库的人,我没有使用基于列的数据库(如BigTable)的经验。为了防止Google也支持关系数据库的小型部署,我想声明我的问题是一般性的,而不是特定于Google的——我想了解简单的关系模型如何在非关系数据库中表示 我的数据库(简化)如下: Items Table -----------

我有一个在MySQL数据库上运行的web应用程序(正在开发中)。我正在考虑将我的应用程序迁移到GoogleAppEngine,并希望更好地理解如何将我的简单关系数据库模型转换为非关系方法

我是一个长期使用关系数据库的人,我没有使用基于列的数据库(如BigTable)的经验。为了防止Google也支持关系数据库的小型部署,我想声明我的问题是一般性的,而不是特定于Google的——我想了解简单的关系模型如何在非关系数据库中表示

我的数据库(简化)如下:

Items Table
------------

ItemID  ItemName  ItemPriority
1       "Car"     7
2       "Table"   2
3       "Desk"    7

ItemProperties Table
---------------------

ItemID  Property        Importance 
1       "Blue"          1
1       "Four Wheels"   2
1       "Sedan"         0
2       "Rectangular"   1
2       "One Leg"       1
我有很多项,每个项都有一个名称和ID。每个项都有多个属性,每个属性都有几个参数(我只说明了每个属性的名称和“重要性”,但还有更多)。我有几千万件物品,每件都有上百种属性

使用场景:我接收一个ItemName作为输入,在items表中查找它的ID,并根据该ID获取所有属性。然后对属性列表(内存中)执行一些分析,并返回一个结果

90%的工作是基于参数的查找,这(如果我理解正确的话)是非关系数据库的难点


推荐的方法是什么?

GQL不支持联接。您可以通过两种方式解决此问题:

  • 请加入你自己
只需获取该项,检查其ItemID,并使用该ItemID查询ItemProperties。您的表将与您指定的表完全相同。当然,这是两个查询,但这两个查询很简单

  • 使用Expando模型

在Expando模型中,可以在运行时创建新字段。它们不会被编入索引,所以如果您想搜索它们,可能会比较慢,但简单地获取它们就可以了。您也可以使用复杂类型,如ListProperty。有了这种灵活性,您可以考虑将ItemProperties表中的所有内容放入Items表中,并为自己保存一个查询。要有创意。

GQL不支持联接。您可以通过两种方式解决此问题:

  • 请加入你自己
只需获取该项,检查其ItemID,并使用该ItemID查询ItemProperties。您的表将与您指定的表完全相同。当然,这是两个查询,但这两个查询很简单

  • 使用Expando模型

在Expando模型中,可以在运行时创建新字段。它们不会被编入索引,所以如果您想搜索它们,可能会比较慢,但简单地获取它们就可以了。您也可以使用复杂类型,如ListProperty。有了这种灵活性,您可以考虑将ItemProperties表中的所有内容放入Items表中,并为自己保存一个查询。要有创意。

我有一个非常相似的数据库结构(我们的“记录”和“记录条目”表反映了您的“项目”和“项目属性”),我正在考虑类似的迁移到非关系数据库。我们可能会去CouchDB或memcachedb之类的网站,而不是谷歌

像你一样,我没有使用非关系数据库的经验(我的开发人员也没有)。然而,我们提出了一些想法。我们目前的想法是(使用您的模式):

  • 首先:将每个项及其项属性折叠为一个带有字段的对象(本质上是一个XML文档),并将其填充到由标识符键入的数据库中。每次检索项目时,您也会返回所有itemProperties
请注意,我们的不同之处在于,我们在数据库之外索引我们的内容(使用Solr),因此不需要使用“name”属性查找数据库本身,因此YMMV

  • 第二:我们正在列出上面的模型不支持的所有“关系”操作。这包括两个“分组”操作,其中我们根据项表中的特殊字段查询项,以及一个查询,其中我们尝试检测最近修改的所有项(以前通过查询项表中的日期列来完成)。我们正在为每种情况发明替代实现(幸运的是,只有少数几种)
如果这证明太难,我们将用另一个模型尝试同样的练习。幸运的是,我们有时间计划

对我们来说,一个关键点是,我们使用Solr在外部执行所有索引,因此(例如)我们不需要对itemProperties值中的值进行数据库查找,也不需要对item表进行名称查找

无论如何,这可能帮不了什么忙,但我很想看看更有经验的人能想出什么样的解决方案


PS:我推断您的属性表必须有数十亿行。您运行MySQL服务器的具体数量和硬件是什么?MySQL是否存在可伸缩性问题?

我有一个非常相似的数据库结构(我们的“records”和“recordEntries”表反映了您的“items”和“itemProperties”),我正在考虑类似的迁移到非关系数据库。我们可能会去CouchDB或memcachedb之类的网站,而不是谷歌

像你一样,我没有使用非关系数据库的经验(我的开发人员也没有)。然而,我们提出了一些想法。我们目前的想法是(使用您的模式):

  • 首先:将每个项及其项属性折叠为一个带有字段的对象(本质上是一个XML文档),并将其填充到由标识符键入的数据库中。每次检索项目时,您也会返回所有itemProperties
请注意,我们的不同之处在于,我们在数据库之外为内容编制索引(使用Solr),因此不需要使用“name”p对数据库本身进行查找