我应该检查是否存在带有sql请求的外键,或者我应该尝试插入并捕获它是否失败?

我可以检查我引用的密钥是否存在。

我的问题更多的是理论上的:捕获异常与每次插入一次查询db。

比如说你有两张桌子,猫和人。 Cats有一个引用Human的外键。 在我尝试插入猫之前,我应该检查是否存在具有给定猫主人列的人,或者我应该尝试盲目插入并捕获它是否失败。

===============>>#1 票数:2

这不是一个简单的答案,它实际上取决于您的应用程序要求。

虽然作为一般经验法则,您应该避免将异常作为正常应用程序流的一部分进行计数,并且使用异常存在一些问题。

  • 首先,当您收到SQL Exception时,您需要确定异常的来源,这可能是复杂的和特定于数据库的(请参阅此处了解详细信息: 如何在JDBC中捕获特定的异常?

  • 其次,即使你设法将你的异常代码限制为参照完整性代码,如果Cat引用了Human和它最喜欢的Food ,你仍将面临识别问题根源的任务。

  • 此外,即使您设法识别错误源是缺少参照完整性,也可能有一些原因(因此,而不是简单地插入新行,您需要进行一些额外的调查)。 想象一下,你想为'多萝西史密斯'插入一只猫,而你正试图这样做,多萝西结婚了(很可能这只猫是恶毒婆婆的结婚礼物;)并改名为'多萝西格里菲斯 所以现在当你尝试插入猫时,如果只是盲目地插入新记录,你将在数据库中复制Dorothy。

  • 此外,由于上述原因,使用人工创建的外键(而不是一组唯一标识用户的字段)是有意义的。 在这种情况下,您需要首先获取此内部标识(如果您不希望应用程序知道标识符,使用存储过程和使用ORM框架(如Hibernate),有几种方法可以解决此问题。最常见的一个)。

话虽如此,我仍然可以想象处理异常会带来好处的情况,主要是当您需要满足特定的性能要求时。 这种情况的例子可以是一个交易系统,在那里你可以获得货币和快速的汇率。 由于引入新货币很少发生,因此它可以被视为一种特殊情况,检查它是否存在是没有意义的(尽管在正确设计的系统中,这只会使您无法调用哈希值用于检查货币是否存在的函数,因为您确实在内部缓存所有货币,这实际上可能比使用try ... catch ... block包装db调用更快。

总而言之,尽量不要使用异常,而是通过正确定义应用程序逻辑解决问题,如果真的需要,可以回到使用异常。

  ask by interlude translate from so

未解决问题?本站智能推荐: