2015-05-06 55 views
5

我正在構建一個系統,用戶將標籤與帖子相關聯,與SO不同。我有一個麻煩點實施tag synonyms如何將標籤映射到標籤同義詞?

在這裏,我有一個名爲標籤表:

| TagName | 
|------------| 
| Python  | 
| JavaScript | 
| Node  | 

而且我還有一個叫TagSynonyms

| SynonymId | SourceTagName | TargetTagName | 
|-----------|---------------|---------------| 
| 1   | Py   | Python  | 
| 2   | Python2  | Python  | 

服務器使用節點實現與用戶輸入一些標籤作爲逗號分隔的字符串:

var input = 'Py,Flask' 
var tags = request.tags.split(','); 

在這種情況下,用戶已輸入其中,根據TagSynonyms表,應映射到標籤的Python標籤PY。第二個標籤Flask沒有同義詞,應該保持不變。

我管理使用必要的代碼來實現此功能:

tags.forEach(function (tag) { 
    connection.query('SELECT TargetTagName FROM TagSynonyms WHERE SourceTagName = ?', tag, function(err, rows) { 
    if (rows.length !== 0) { 
     console.log(rows[0].TargetTagName); 
    } else { 
     console.log(tag); 
    } 
    }); 
}); 

這裏,用戶輸入

['Py','Flask'] 

結果如下輸出

Python 
Flask 

我想要做什麼是,推遲這個邏輯到數據庫引擎,因爲我認爲使用循環是一種代碼味道。我也認爲數據庫引擎會更高效。什麼是適當的查詢來做到這一點?

+1

你可以只選擇'從TargetTagName WHERE TagSynonyms在SourceTagName,tags',在一個查詢中選擇數據庫中的所有值? – vanadium23

+0

同義詞似乎多餘 – Strawberry

+0

@Strawberry是的,我也在想。我不確定此刻還有什麼可以用作主鍵。 –

回答

3

你需要一個UNION和聯接:

select TagName 
    from Tags 
    where TagName in (?,?,?,...) 
union 
    select TagName 
    from Tags 
    join TagSynonyms 
     on Tags.TagName = TagSynonyms.TargetTagName 
    where TagSynonyms.SourceTagName in (?,?,?,...) 

注意union可能會很慢,因爲它會嘗試刪除重複。如果您遇到這種情況,請使用union all並刪除應用程序代碼中的重複項。

(?,?,?,...)代表輸入值列表;請檢查您的數據庫驅動程序文檔以瞭解您需要使用的確切語法以避免SQL注入。

更新:這裏是實現將是什麼樣子的節點:

var query = 
'SELECT TagName \ 
FROM Tags \ 
WHERE TagName IN (?) \ 
UNION \ 
SELECT TagName \ 
FROM Tags \ 
JOIN TagSynonyms \ 
    ON Tags.TagName = TagSynonyms.TargetTagName \ 
WHERE TagSynonyms.SourceTagName IN (?)' 

connection.query(query, [tags, tags], function(err, rows) { 
    tags = rows.map(function(row) { 
    return row.TagName 
    }); 
}); 
+0

我在Workbench中測試了這個,我認爲它很理想。我現在要在Node中嘗試這個功能,我會盡快與您聯繫。謝謝你,亞倫! –

+0

我不確定標籤表的要點在這裏。 – Strawberry

+0

@Strawberry:如果沒有第一個選擇,你就不會爲輸入「Python」獲取「Python」。查詢的結果是一系列系統知道的標籤,直接或通過別名。如果您只想將別名轉換爲名稱,則可以使用第二個查詢。 –

相關問題