有下表:
>发布(标识,标题,文字等)
> PostTag(PostId,TagId)
>标签(Id,名称)
现在,编辑表单(Internet解决方案)通过使用允许多个条目的Jquery Select2控件显示与帖子关联的“标签”.此输入字段返回标记ID列表.
我认为处理这些条目的正确方法是:
>带有不存在条件的insert语句的数组循环
>并且最后一个删除语句不存在(删除不再存在的标记).
或者最好删除所有然后插入新列表?
当表PostTag具有允许重复输入的字段(Id,PostId,TagId,CreatedOn)时怎么样?我相信以前的两种方法中的任何一种都是正确的…而且都是因为select2控件只返回一个标签ID列表.
我的问题适用于stackoverflow中使用的相同逻辑我们需要插入标记的问题.
用于此类数据的正确逻辑是什么?
注意:
我正在寻找的答案需要考虑性能和对DB的影响(删除(表锁定)/更新的影响),我说这是因为很容易制作一个功能性解决方案,其他一切都很糟糕.
最佳答案 六年前我几乎实现了类似的标签应用程序.但是,上层管理人员改为使用sharepoint作为应用程序平台.
>我同意你的意见:
“我认为处理这些条目的正确方法是:
带有不存在条件的insert语句的数组循环
最后一个删除语句不存在(删除不再存在的标记).“
>为什么我反对这个想法“删除所有然后插入新列表???”
为了说明我的观点,我夸大了一点.想象一下,我有一个包含100个标签的帖子.
上午8:00,我通过添加一个标签编辑帖子,并保存到数据库.然后有100个删除和101个插入.这些操作会在删除和添加操作等方面生成一些DML操作,一些事务日志,页面和索引维护.如果在PostTag表中使用自动ID字段,ID字段中将有一个间隙,因为有100个删除.
上午8:05,我通过删除一个标签编辑帖子,并保存到数据库.然后有101个删除和100个插入.副作用与上述相同.
上午8:10,我无所事事地编辑帖子,只需保存到数据库.然后有100个删除和100个插入.副作用与上述相同.
即使只有一个真正的添加和一个真正的删除标记操作,您可以看到使用此方法有很多副作用.这将对数据库造成严重的性能影响.既然你提到Stack Overflow将使用什么,想象Stack Overflow使用这种方法,有10,000个用户用10个标签编辑10,000个帖子……
>表PostTag何时具有允许重复输入的字段(Id,PostId,TagId,CreatedOn)?
我会使用这些字段来实现此功能“标签越多,条目越多”.许多网站都提供此功能.用户点击该标签的次数越多,标签就越大.
CreatedOn字段可以在以后用作商业智能分析,例如标签与帖子等相关联时.