好的,这是问题
我有三张桌子
events
- id
- name
questions
- id
- event_id
- name
answers
- id
- question_id
- description
在生成添加表单时,我只需搜索属于特定事件的所有问题,并以单一HTML格式显示问题。
但请考虑编辑方案。事件管理员可以在适当的时候添加或删除事件中的一些问题。因此,在这种情况下,当用户尝试编辑已发布的答案时,我生成HTML表单,其中新问题为空白字段,现有答案为预填充输入框。我该如何处理此表格的提交?
当用户提交时,我应该删除所有过去的答案并在答题表上对所有答案值进行INSERT吗?或者首先更新现有答案并仅插入新值是一个好习惯吗?
前者使用DELETE后跟INSERT变得更加容易。虽然后者有点单调乏味。以前解决方案的问题是每次都会增加答案表的id ..
答案 0 :(得分:3)
有些人赞成删除/插入方法,因为就像你说的那样,它更简单。
我个人认为更新/插入/删除方法虽然更多,但更正确。
如果您进行更新,则可以对特定项目的更改进行审计跟踪。只需插入/删除它就会变得更难或更难以拥有这种联系和历史。
至于如何处理表单的提交,对于可以更新的字段(即它们是现有记录),您需要能够以某种方式识别字段。就个人而言,我只是编码字段名称中的主键。
如果你这样做,你当然必须通过验证所提供的ID是否有效以及允许编辑,即永远不信任客户来确保你没有安全漏洞。
这可以采取以下形式:
<input type="text" name="name_117" value="Some value">
<input type="text" name="name_118" value="Some other value">
<input type="text" name="name_1243" value="Yet another value">
并且您必须处理所有输入参数,解码标识符并采取相应的行动。
最后,插入/删除的另一个问题是,如果要删除/插入的项与数据库中的其他表相关,则无法执行此操作(或者只是非常困难)。如果你有一个问题表并存储人们给出的答案,通常你会将问题作为外键引用。如果删除/插入而不是更新,则会丢失该关联。
答案 1 :(得分:0)
首先,不应该将ID用于任何事情,因此忽略增量是一个很好的提醒。
我更愿意处理主要问题,但是,其他一切都是平等的。用户实际上是否通过编辑建立了一组不同的问题?然后将它们保存为新集。或者原始集合是否旨在保留其概念身份?然后更新/删除/插入。这似乎更是如此。
在确保问题/答案集的完整性方面,我认为会议有责任。您应该考虑根据与会话相关的问题验证问题集。
答案 2 :(得分:0)
在线测验应用程序通常会在测验生效后锁定测验。处理完成的答案集与不断变化的问题定义是一个混乱的问题。如果您的应用程序可以处理它,我倾向于在事件首次发布后不允许更改问题。
答案 3 :(得分:0)
同意Cletus的帖子,单独写作是为了额外的理由和想法:
当您的网站获得大量流量时,删除/插入方法会出现并发问题。删除后,其他人可以插入一个插件,然后每个用户最终会有多个答案列表。
MySQL支持ON DUPLICATE KEY UPDATE语法。如果您有合适的主键,这可能是组合插入和更新的简单方法。