从关系型数据库转移至NoSQL数据库——比如从MySQL转移到Couchbase,你需要对你的数据进行再思考。至于为什么是Couchbase而不是MongoDB什么的,因为博文的作者MC Brown是现任Couchbase副总裁,所以你懂得;同时这篇Couchbase博文还涉及到迁移后对查询的影响。 以下为译文:
如果你有一个建立在MySQL上的数据库,你可能就会考虑是否需要以及更重要的如何将数据库(和你的应用程序)转移到Couchbase上。最大的 绊脚石不在Couchbase建立或者是存储信息方面(尽管他们也很重要),而是数据的重思,你需要使用另一种方式去处理你的数据,然后对应用程序作出相 应的变化。 首先:数据结构的重思
MySQL(以及其它的SQL类型并且以表格为基础的数据库)强迫你将数据打造成表格的形式。你所有的数据就是一张表,当你储存复杂结构类型数据 时,一个单独的数据片可能拆分成多于一张的表格。对于一些应用程序以及数据类型,如此存储数据是一个完美的逻辑以及合理的途径。而同样对于某些应用程序, 使用这样的方法去存储数据并不是很适合。 这个结构有一些潜在的好处,一些特定的操作可以非常简单的完成。举个例子,比如说查询一些包含原料“carrot(胡萝卜)”的recipe(食 谱)。你可以从Ingredients表中查找“carrot”,并鉴于这点得到一个匹配的recipe列表。通过使用join你可以获得一个 recipe列表,从中获取他们的title以及一些其它的信息,通过搜索Ingredient表,使用join连接两张表中的recipe ID。
当然这种查询方法很简单,可以收集到一个食谱的所有信息。然而当你想给用户演示这个食谱时,将会变得很复杂。你可以通过一个单独的查询来完成,然而 有时候通过几个查询来完成这个更容易,分别获取recipe、ingredients、metadata等表格的数据。在应用程序层,通过建立对象就可以 自动的完成这些操作,同时这也是此类操作的基础方法。 { "title" : "Carrot and Coriander Soup" "servings" : 4, "subtitle" : "Delicious with wholemeal bread", "preptime" : 8, "cooktime" : 12, "totaltime" : 20, "ingredients" : [ { "amount" : 250, "ingredient" : "Carrots", "measure" : "g" }, { "amount" : 75, "ingredient" : "Coriander", "measure" : "g" }, { "amount" : 250, "ingredient" : "Vegetable Stock", "measure" : "ml" } ], "method" : [ "Chop carrots", "Cook all ingredients in pan", "Liquidize" } ], } 现在只需要在一处就可以对整个recipe进行操作,也就是只需要一个操作就可以从Couchbase数据库中获得你想要的信息。 这里对内容没有强制的结构或者是定义,Couchbase数据库中的任何文档都可以储存任何的信息和结构。然而你还可以使用一个验证程序来检查提供给数据库文档的结构,验证可以同时针对字段以及字段的类容。 鉴于这里没有严格的数据结构类型,它可以给存储带来更高的灵活性。举个例子,你不需要额外的操作就可以向recipe文档中添加新的部分“食谱的提供人”。 这里同样没有多重表这个概念,这里只有数据库,数据库中只包含了文档。如果你想让同一个数据库支持各种不同类型的信息,你可以向文档中加入字段。比如你可以如此来定义一个recipe: { "type" : "recipe", "title" : "Carrot and Coriander Soup" "servings" : 4, "subtitle" : "Delicious with wholemeal bread", ... }
那么type就可以作为标记在数据库其它的地方使用,用以识别(选择)你正在加载的数据。
其次:如果什么都是文档,那么你该如何查询
View使用JavaScript在一个设计文档中进行定义,使用一个文档作为参数的函数。一旦view被构造,数据库中的每个文档都会提 供给view,然后view查询并输出你需要的结果。不用担心JavaScript,JavaScript将只在服务器上执行(不会在客户端上执行)。 当在MySQL上运行一个查询,MySQL服务器从一张或者多张表中取得信息,然后构建输出结果列表: 在Couchbase中,View从单一的文档中获取记录,并且在处理过程中附带建立一个索引。结果则是view抓取的所有文档列表。 在MySQL中执行一个带where的查询,索引一般被期望帮助你查询需要的记录: 而在Couchbase中,生成的view就是你的表格,当你对view进行查询,Couchbase使用这些键的值(以及生成的相关索引)和过滤后(你指定)的返回信息,生成最终的匹配列表。
转载请保留固定链接: https://linuxeye.com/database/1461.html |