【发布时间】:2012-09-27 10:46:09
【问题描述】:
我们正计划使用类似于本网站实施的标记系统。
我们有实际的标记前端,自动完成等工作。
但我对在后端处理它的最佳方式感到困惑。
基本上,当我们在后端获取标签时,我们最终会得到一个如下所示的数组:
array(
array(
'value' => 1,
'label' => 'First Tag'
),
array(
'value' => 2,
'label' => 'Second Tag'
),
array(
'value' => 'Third Tag',
'label' => 'Third Tag'
),
array(
'value' => 3,
'label' => 'Fourth Tag'
),
)
标签插件在自动完成时也会通过 ajax 接收相同的数组格式json_encode()'d,它会显示标签,并存储 id 以便将其发回。
因此,具有值1、2、3 的标签是从自动完成中选择的标签。
值为Third Tag 的标签是未从自动完成中选择的标签,它可能或可能不存在于数据库中,但已手动输入。
现在有一个变化,用户实际上可以创建一个恰好是数字的标签,因此
array(
'value' => 3,
'label' => 3
)
可以通过,但不存在,所以我们不能假设如果 value 是 int 则它已经存在。
所以,这个问题的第一部分是,我如何管理这个问题,这样我就不会得到重复的标签?
我目前的方法是,当标记插件通过自动完成请求标记时,我发回一个数组,如
(术语 = 'pin')
array(
array(
'value' => '||1',
'label' => 'pink'
),
array(
'value' => '||4',
'label' => 'pin cushion'
)
)
然后在后端假设任何具有以 || 开头的值的标签来自自动完成并且已经存在。
那么,
我们在数据库中查询所有标签,
使用其余的标签,我们检查 value 是否存在数组的 label 键,如果存在,我们就保持原样,如果不存在,我们创建它,然后我们切换值在原始数组中使用新的id。
但这对我来说感觉很奇怪,这意味着我们正在使用填充项 (||) 必须有更优雅的方式来做到这一点?
问题的下一部分是,实际上将这些标签链接到一个项目。 这更多是在本网站上编辑问题的背景下,
某些标签已与问题相关联。你如何处理它,这样你就不会在一个问题上出现重复的标签引用?
到目前为止,我看到了两个选项:
从问题中删除所有指向标签的链接,然后再次将它们全部插入。(2 个查询)
或
查询数据库中与问题相关的所有标签,遍历数组,从数组中删除这些标签,然后插入剩余部分。 (2 个查询)
哪一种方法比另一种更好?还是有第三个版本?
【问题讨论】:
标签: php mysql database-design autocomplete tagging