我正在构建一个系统,用户将标签与帖子相关联,与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是的,我也在想。我不确定此刻还有什么可以用作主键。 –