2015-05-06 35 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”。查询的结果是一系列系统知道的标签,直接或通过别名。如果您只想将别名转换为名称,则可以使用第二个查询。 –

相关问题