我正在構建一個系統,用戶將標籤與帖子相關聯,與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
我想要做什麼是,推遲這個邏輯到數據庫引擎,因爲我認爲使用循環是一種代碼味道。我也認爲數據庫引擎會更高效。什麼是適當的查詢來做到這一點?
你可以只選擇'從TargetTagName WHERE TagSynonyms在SourceTagName,tags',在一個查詢中選擇數據庫中的所有值? – vanadium23
同義詞似乎多餘 – Strawberry
@Strawberry是的,我也在想。我不確定此刻還有什麼可以用作主鍵。 –