CouchDB汽车销售的例子,可能与否?

时间:2014-05-06 14:17:03

标签: couchdb

我向我的一位朋友解释了CouchDB有多棒,我实际上做得很好,直到他问我是否可以做一个汽车销售数据库。在给出了相当多的想法后,我没有回答,我认为这是不可能的。

我的困境是这样的。可以说一辆车有owner_id,制造商,年份,类型,颜色,颜色和价格。

我的第一个想法是发出所有键。但是你可能想要搜索一辆蓝色或红色或黄色的汽车,行驶在30.000到80.000英里之间并且价格范围很广。鉴于此查询,如果您不搜索颜色该怎么办?

我能想到的唯一方法就是做很多查询,并在我的数据库层代码中做一个手动暴力扩散数组。但这似乎相当过分,即使只有几千辆汽车。

那么,简而言之,这是否有可能以可行的方式做到?

2 个答案:

答案 0 :(得分:1)

CouchDB专为可扩展性而设计,无限灵活性即席查询不具备可扩展性,因此不鼓励使用。但是, 可以使用临时视图。您可以POST将您的视图(查询)作为/db/_temp_view的JSON对象。

有关详情,请参阅http://wiki.apache.org/couchdb/HTTP_view_API#Temporary_Viewshttps://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Concept

此外,this answer可能对您有用。

答案 1 :(得分:1)

正如你所说,在CouchDB中没有很好的拼写方法,就像你在支持空间索引的关系数据库中这样做一样;这并不是说根本就没有希望。例如,您可以进行一些简单的聚类来索引满足特定属性集的汽车。

里程和价格看起来很适合这种方法。大多数查询可能会将这些值指定为单个数字

function oneDigit(value) {
    var strValue = String(value);
    return (Number(strValue[0]) * Math.pow(10, strValue.length - 1);
}

有了这个,我们可以建立一个视图,根据价格和里程将汽车组织成垃圾箱。

function (doc) {
    emit([[oneDigit(doc.mileage), oneDigit(doc.price)], null]);
}

这是一个简单的问题,即所有拥有该功能的汽车:

for mileage in range(60000, 100000, 10000):
    cars.append(db.view('cars/mileageAndPrice', startkey=[mileage, minPrice], endkey=[mileage + 10000, maxPrice]))