2014-12-09 36 views
2

數據庫結構,我有具有以下結構的數據庫:爲metaquery

+------+------+--------+-------+--------+-------+ 
| item | type | color | speed | length | width | 
+------+------+--------+-------+--------+-------+ 
| 1 | 1 |  3 |  1 |  2 |  2 | 
| 2 | 1 |  5 |  3 |  1 |  1 | 
| 3 | 1 |  6 |  3 |  1 |  1 | 
| 4 | 2 |  2 |  1 |  3 |  1 | 
| 5 | 2 |  2 |  2 |  2 |  1 | 
| 6 | 2 |  4 |  2 |  3 |  1 | 
| 7 | 2 |  5 |  1 |  1 |  2 | 
| 8 | 3 |  1 |  2 |  2 |  2 | 
| 9 | 4 |  4 |  3 |  1 |  2 | 
| 10 | 4 |  6 |  3 |  3 |  2 | 
+------+------+--------+-------+--------+-------+ 

我想高效地查詢哪些字段的組合是有效的。因此,例如,我想查詢以下數據庫:

如果類型爲1,什麼顏色值有效?

ans: [3, 5, 6] 

如果類型爲2且顏色爲2,則速度的值有效?

ans: [1, 2] 

如果長度爲2且寬度爲2,哪些類型的值有效?

ans: [1, 2] 

的SQL等價物:

SELECT DISTINCT `color` FROM `cars` WHERE `type` =2 
SELECT DISTINCT `speed` FROM `cars` WHERE `type` =2 AND `width` =2 
SELECT DISTINCT `type` FROM `cars` WHERE `length` =2 AND `width` =2 

我打算使用基於雲的數據庫(Cloudant DBAAS - 基於CouchDB的)。如何實現這一點,請記住,數以千計的項目可能有數十個領域?

+0

我不知道我正確理解你的要求。在第一個例子中,你想要做什麼等價於SQL查詢,比如「Select color where type = 1」?這將很容易轉換爲CouchDB視圖。 – 2014-12-09 15:26:49

+0

用等價的SQL查詢更新了問題。 – Terry 2014-12-09 18:43:25

+0

@Terry你解決了這個問題嗎? – 2015-02-05 19:52:33

回答

0

我還沒有把太多心思到這個問題,所以有可能在方法的錯誤,但是一個選項是代表與文檔每行:

{ 
    "_id": "1db91338150bfcfe5fcadbd98fe77d56", 
    "_rev": "1-83daafc1596c2dabd4698742c2d8b0cf", 
    "item": 1, 
    "type": 1, 
    "color": 3, 
    "speed": 1, 
    "length": 2, 
    "width": 2 
} 

注意_id_rev領域已經由Cloudant爲這個例子自動生成。

然後,您可以創建在type領域的二級索引:

function(doc) { 
    if(doc.type) 
     emit(doc.type); 
} 

要搜索使用type領域:

https://accountname.cloudant.com/dashboard.html#database/so/_design/ddoc/_view/col_for_type?key=1&include_docs=true

typewidth領域的輔助指標:

function(doc) { 
    if(doc.type && doc.width) 
    emit([doc.type, doc.width]); 
} 

要搜索使用typewidth字段:

https://accountname.cloudant.com/dashboard.html#database/so/_design/ddoc/_view/speed_for_type_and_width?key=[1,2]&include_docs=true

lengthwidth領域的二次指數:

function(doc) { 
    if (doc.length && doc.width) 
     emit([doc.length, doc.width]); 
} 

要搜索使用lengthwidth字段:

https://accountname.cloudant.com/dashboard.html#/database/so/_design/ddoc/_view/type_for_length_and_width?key=[2,2]&include_docs=true

完整的設計文檔是在這裏:

{ 
    "_id": "_design\/ddoc", 
    "_rev": "3-c87d7c3cd44dcef35a030e23c1c91711", 
    "views": { 
    "col_for_type": { 
     "map": "function(doc) {\n if(doc.type)\n  emit(doc.type);\n}" 
    }, 
    "speed_for_type_and_width": { 
     "map": "function(doc) {\n if(doc.type && doc.width)\n emit([doc.type, doc.width]);\n}" 
    }, 
    "type_for_length_and_width": { 
     "map": "function(doc) {\n if (doc.length && doc.width)\n  emit([doc.length, doc.width]);\n}" 
    } 
    }, 
    "language": "javascript" 
}