gpt4 book ai didi

php - 处理标签

转载 作者:行者123 更新时间:2023-11-29 02:31:23 25 4
gpt4 key购买 nike

我们正计划使用类似于此站点上实现的标记系统。

我们有实际的标记前端和自动完成等功能。

但我对在后端处理它的最佳方式感到困惑。

基本上,当我们在后端获取标签时,我们最终会得到一个如下所示的数组:

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(),它会显示标签并存储 id,以便将其发回。

因此,具有值 123 的标签是从自动完成中选择的标签。
值为 Third Tag 的标签不是从自动完成中选择的标签,它可能已经存在也可能不存在于数据库中,但已被手动输入。

现在有一个变化,用户实际上可以创建一个恰好是数字的标签,因此

array(
'value' => 3,
'label' => 3
)

可以通过,但还不存在,所以我们不能假设如果值是 int 那么它已经存在。

所以,这个问题的第一部分是,我该如何管理它,以免最终出现重复标签?

我目前的方法是,当标记插件通过自动完成请求标记时,我会发回一个数组,如

(术语='pin')

array(
array(
'value' => '||1',
'label' => 'pink'
),
array(
'value' => '||4',
'label' => 'pin cushion'
)
)

然后在后端假设任何具有以 || 开头的值的标签来自自动完成并且已经存在。

然后,我们查询数据库中的所有标签,对于其余的标签,我们检查以找出 value 是否存在数组的 label 键,如果存在,我们就保持原样,如果不存在,我们创建它,然后我们用原始数组中的新 id 切换出值。

但这对我来说感觉很老套,这意味着我们正在使用填充项 (||) 一定有更优雅的方法吗?

问题的下一部分是,将这些标签实际链接到一个项目。这更多是在编辑本网站上的问题的情况下,

一些标签已经与问题相关联。您如何处理它才不会在问题上出现重复的标签引用?

到目前为止,我看到了两个选项:从问题中删除所有指向标签的链接,然后再次插入它们。(2 个查询)
或者
在数据库中查询与问题相关的所有标签,循环遍历数组,从数组中删除这些标签,然后插入其余部分。 (2 个查询)

哪种方法比另一种更好?还是有第三个版本?

最佳答案

通过在相关字段上添加唯一约束,可以在数据库级别解决任何类型的重复键问题。您的所有代码与标签的交互都应使用文本标签完成,文本标签应作为标签的唯一标识符。任何类型的数字 ID 对应用程序本身都没有用处,因此不需要从存储库层后面窥视。这也将解决区分现有/新标签的问题......实际上应用程序并不关心并将标签视为持久化的值对象而不是担心任何类型的实体样式生命周期。在标签与文章相关联的存储库调用中,如果标签不存在,请创建标签。在执行标记查询所需的 JOIN 时(实际上在其他任何地方都没有),ID 将主要有利于提高性能,这也是应用程序不应该在执行连接的存储库之外关心的事情。

更新标签(包括删除)的最安全和最简单的方法是爆破现有标签并编写新标签。这确保持久状态完全一致地匹配 UI 输入,并且实际上这不会是一个昂贵的操作,也不会经常执行以关心(尽管一个简单的程序检查以查看是否需要更新将有助于防止不必要的写)。它是 2 个查询,应该包含在一个事务中并且可以一起批处理,特别是 DELETE 应该非常便宜,只要适当的索引就位,所以它不是您需要担心的那种多重查询。

如果出于某种奇怪的原因,您过于担心尽量减少数据库的工作量,您可以事先存储一个版本的标签,然后在之后进行适合于增量的查询,但这要脆弱得多,并且可以还引入了许多复杂的并发问题。

关于php - 处理标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12760463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com