无关系问题

时间:2010-02-09 17:21:45

标签: mongodb couchdb nosql

我愿意认真对待MongoDB和CouchDB。到目前为止,我已经和Mongo做了一些工作,但我对Couch的RESTful方法也很感兴趣。

与关系数据库合作多年后,我仍然没有得到用非关系数据库完成某些事情的最佳方法。

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

任何帮助表示感谢。

4 个答案:

答案 0 :(得分:3)

我只能跟CouchDB说话。

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

然后使用map / reduce创建数据的规范化索引。所以,如果你想要每辆车的索引,首先按车间排序,然后按车型排序,你会发出每辆车的索引为[车间,车型]。

Map reduce一开始看起来有点吓人,但你不需要理解所有复杂的东西甚至是btree,你需要了解的是密钥排序的工作原理。

http://wiki.apache.org/couchdb/View_collation

只有这一点,您可以使用CouchDB中的map reduce系统在不同的文档上创建惊人的规范化索引。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

从HBase / BigTable的角度来看,通常您会完全对数据进行非规范化,并使用“列表”字段或多维地图列(有关更好的说明,请参阅此link)。

  

单词“column”是另一个加载的   像“桌子”和“基地”这样的词   带着多年的情感包袱   RDBMS经验

     相反,我觉得更容易思考   关于这就像一个多维地图    - 如果你愿意的话,可以使用地图。

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

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

  问:[Michael Dagaev]你好吗?   为多对多设计一个Hbase表   两个实体之间的关联,为   示例学生和课程?

     

我愿意   定义两个表:学生:学生   id学生数据(姓名,地址,......)   课程(使用课程ID作为专栏   这里有资格)课程:课程ID   课程数据(姓名,教学大纲......)   学生(使用学生ID作为专栏   这里有资格)这有意义吗?

     

A [Jonathan Gray]:你的设计确实如此   合理。正如你所说,你是   可能有两个列族   每个学生和课程表。   一个用于数据,另一个用于   每个学生或课程的专栏。对于   例如,学生行可能会看起来   喜欢:学生:id / row / key = 1001   data:name =学生姓名数据:地址   = 123 ABC St课程:2001 =(如果您需要更多相关信息   例如,如果它们是关联的   在等候名单上)课程:2002 =   ...此架构可让您快速访问   查询,显示所有类   学生(学生表,课程   家庭),或所有班级的学生   (课程表,学生家庭)。

答案 3 :(得分:0)

在关系数据库中,概念非常明确:一个用于汽车的表,其中包含“car_id,car_type,car_name,car_price”等列,另一个用于列为“shop_id,car_id,shop_name,sale_count”,“car_id”的商店的表“将两个表链接在一起以获取数据Ops。在创建数据库时必须很好地定义所有列。

没有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]}",  
.....  

在您的系统在线为您的管理层提供服务后,您可能会发现您的数据库结构设计存在一些缺陷,您希望为将来的记录添加一个“shop”列“员工”。然后你的新记录如下:

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

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