【发布时间】:2015-07-16 13:49:08
【问题描述】:
我正在构建一个用户将标签与帖子相关联的系统,这与 SO 不同。我在实现tag synonyms 时遇到了麻烦。
这里有一个名为标签的表格:
| TagName |
|------------|
| Python |
| JavaScript |
| Node |
我还有一个叫TagSynonyms:
| SynonymId | SourceTagName | TargetTagName |
|-----------|---------------|---------------|
| 1 | Py | Python |
| 2 | Python2 | Python |
服务器使用Node实现,用户输入一些标签作为逗号分隔的字符串:
var input = 'Py,Flask'
var tags = request.tags.split(',');
在这种情况下,用户输入了标签 Py,根据 TagSynonyms 表,该标签应该映射到标签 Python .第二个标签 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
我想做的是,将此逻辑推迟到数据库引擎,因为我认为使用循环是一种代码味道。我还认为数据库引擎的性能会更高。执行此操作的合适查询是什么?
【问题讨论】:
-
你可以
SELECT TargetTagName FROM TagSynonyms WHERE SourceTagName IN ?, tags,在一个查询中从数据库中选择所有值 -
同义词似乎是多余的
-
@Strawberry 是的,我也是这么想的。目前我不确定还有什么可以用作主键。
-
@vanadium23 我认为这将返回一个表,其中一行的值为 Python 而我想要一个两行的结果 Python 和 烧瓶。有什么想法吗?
-
@Angularnoob 我猜是什么问题,将查询重写为
SELECT TargetTagName FROM TagSynonyms WHERE SourceTagName IN ('Py','Flask') OR TargetTagName IN ('Py','Flask')将返回 Flask 和 Python
标签: javascript mysql sql node.js node-mysql