我有一个名为CARDS的表,其中包含列STATUS.如果记录的状态从“下载”变为“发布”,我必须将记录引用插入另一个名为CARD_ASSIGNMENTS的表中.此外,记录需要多次添加到CARD_ASSIGNMENTS中,因为SCANNERS中有活动记录.
换句话说,如果有两个主动扫描仪,我将在CARD_ASSIGNMENTS中得到两条记录,如下所示:
ID CARD_ID SCANNER_ID STATUS_ID
1 1 1 4
2 1 2 4
我的困境是我不太确定执行上述操作的最有效方法是什么.我考虑过以下选项:
>从PHP – 执行一次UPDATE查询,然后执行INSERT查询.
>创建一个存储过程,它将负责更新CARDS记录并将记录添加到CARD_ASSIGNMENTS中.然后,只需从PHP调用该存储过程.
>为CARDS表创建一个ON UPDATE触发器,它将处理INSERTS到CARD_ASSIGNMENTS表中.
PS.我的数据库的简化版本可在MySQL Fiddle上获得
谢谢,
凯特
解决方法:
有趣的问题.
我将为您提供有关如何解决问题的线索.
所以,你必须首先定义三件事:
在这里,我将详细介绍这些要点.
所以,第一点是你必须定义你的功能.通过这样做,您将能够判断添加卡是否总是意味着,在您的信息系统的所有可能的范例(对不起迂腐的词,我找不到更合适的一个)中,这张卡必须存在于根据您提供的规格,其他表格.此1-1功能链接必须为TRUE或FALSE.这非常重要.
换句话说,如果至少有一种可能性,有一天你不想将该记录复制到另一个表中,则意味着触发器是错误的解决方案,或者至少应该考虑采用紧急模式(对于例如,一个变量内部允许它在某些条件下不被执行)安装.
然后是关于访问策略的第二点.您必须知道允许的访问系统是通过使用您的应用程序层还是可以开发自己的(SAAS样式)来实现的.如果是这样,你的PHP层将是无用的,并且存储过程是一个很好的选择,因为每个技术和业务层都将通过它是或是.
最后要知道的是,有一天你是否可能要升级你的PHP层.在大多数情况下,答案是肯定的.如果是这样,您可能必须修改包含您正在讨论的sql逻辑的部分.然后,将所有内容都存储到存储过程中并将其硬编码存储到PHP中肯定会节省您的时间,并提高稳定性.
左脑右脑,我将告诉你我个人的意见.我真的很喜欢使用存储过程但不使用任何触发器.如果环境允许,我会寻找一个底层批处理,调用一组已定义的存储过程,将活动集中在在线范围之外.
优点如下:
>由于减少了操作次数,因此无法或更少地中断在线工作流程的风险
>不同的计划来分配数据库负载
>更安全的策略,因为执行存储过程只需要一个授权,而使用与PHP相同的sql则需要插入/更新授权
>更好的日志记录质量:每个作业可以有一个日志
>更好的紧急响应:当一个工作失败时(如果经过深思熟虑)你可以重新启动它,就是这样.
很长的帖子,但这很有趣,我真的想分享这些想法.
干杯!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。