6

我愿意认真尝试一下 MongoDB 和 CouchDB。到目前为止,我已经使用 Mongo 进行了一些工作,但我也对 Couch 的 RESTful 方法很感兴趣。

在使用关系数据库多年后,我仍然不知道使用非关系数据库完成某些事情的最佳方法是什么。

例如,如果我有 1000 家汽车商店和 1000 种汽车类型,我想指定每个商店销售的汽车类型。每辆车有 100 个功能。在关系数据库中,我会制作一个中间表,将每个汽车商店与其通过 ID 销售的汽车类型联系起来。No-sql的方法是什么?如果每家汽车商店销售 50 种汽车类型,这意味着复制大量数据,如果我必须在汽车商店中存储它销售的所有汽车类型的所有特征!

任何帮助表示赞赏。

4

4 回答 4

3

我只能和 CouchDB 说话。

将数据保存在数据库中的最佳方法是除了将其转换为 JSON 之外,根本不对其进行规范化。如果该数据是“汽车”,则将有关每辆汽车的所有数据粘贴到数据库中。

然后,您使用 map/reduce 创建数据的规范化索引。因此,如果您想要每辆车的索引,首先按商店排序,然后按汽车类型,您将发出索引为 [商店,汽车类型] 的每辆车。

Map reduce 刚开始看起来有点吓人,但是你不需要了解所有复杂的东西甚至 btree,你只需要了解 key 排序是如何工作的。

http://wiki.apache.org/couchdb/View_collat​​ion

仅凭这一点,您就可以使用 CouchDB 中的 map reduce 系统为不同的文档创建惊人的规范化索引。

于 2010-02-10T04:22:23.313 回答
1

在 MongoDB 中,一种常用的方法是在每个汽车商店中存储汽车类型的 _id 列表。所以没有单独的连接表,但基本上仍然在做客户端连接。

嵌入式文档对于不是多对多这样的案例变得更加相关。

于 2010-02-09T22:11:21.467 回答
0

从 HBase/BigTable 的角度来看,通常您会完全非规范化数据,并使用“列表”字段或多维映射列(请参阅此链接以获得更好的描述)。

“column”这个词是另一个像“table”和“base”一样的加载词,它承载了多年RDBMS经验的情感包袱。

相反,我发现把它想象成多维地图更容易——如果你愿意的话,一张地图的地图。

对于多对多关系的示例,您仍然可以创建两个表,并使用多维地图列来保存表之间的关系。

请参阅 Hadoop/HBase常见问题解答中的常见问题解答问题 20 :

问:[Michael Dagaev] 你会如何设计一个 Hbase 表来实现两个实体之间的多对多关联,例如 Student 和 Course?

我会定义两个表: 学生:学生 ID 学生数据(姓名,地址,...)课程(使用课程 ID 作为列限定符) 课程:课程 ID 课程数据(姓名,教学大纲,...)学生(使用学生ids 作为此处的列限定符)有意义吗?

A[Jonathan Gray]:你的设计确实有道理。正如您所说,您可能在每个 Student 和 Course 表中都有两个列族。一个用于数据,另一个用于每个学生或课程的列。例如,学生行可能如下所示: Student : id/row/key = 1001 data:name = Student Name data:address = 123 ABC St courses:2001 =(如果您需要有关此关联的更多信息,例如,如果他们在候补名单上)课程:2002 = ...此架构使您可以快速访问查询,显示学生的所有课程(学生表,课程家庭),或课程的所有学生(课程表,学生家庭) )。

于 2010-02-09T22:01:24.683 回答
0

在关系数据库中,这个概念很清楚:一个表用于汽车,列如“car_id, car_type, car_name, car_price”,另一表用于商店,列“shop_id, car_id, shop_name, sale_count”,“car_id”链接两个表一起用于数据操作。所有列必须在创建数据库时定义好。

没有 SQL 数据库系统不需要您预先定义这些列和表。您只需以某种格式构建记录,例如 JSON,例如:

"{car:[id:1, type:auto, name:ford], shop:[id:100, name:some_shop]}",  
"{car:[id:2, type:auto, name:benz], shop:[id:105, name:my_shop]}",  
.....  

在您的系统上线为您的管理提供服务后,您可能会发现您的db结构设计存在一些缺陷,您希望在“shop”中增加一列“employee”以备日后记录。那么你的新记录如下:

"{car:[id:3, type:auto, name:RR], shop:[id:108, name:other_shop, employee:Bill]}",  

没有 SQL 系统允许您这样做,但关系数据库对于这项工作是不可能的。

于 2016-01-12T14:54:11.120 回答