这是一般软件工程原理问题。哪个更“好”:
确定。示例:您想要将新影片添加到数据库中。电影必须具有唯一的名称。你试着插入它,然后让unique constraint
抓住它。 - OR - 您是否首先进行SELECT查询以检查此类电影是否已存在?
电影也属于一个类型。您是先进行选择查询以查看数据库中是否存在该类型,还是让外键约束“捕获”/验证它?
预先检查的问题是竞争条件 - 当你验证所有内容时,其他一些线程可以插入带有该标题的电影 - 所以在多线程系统中实际上并不能保证。另一方面,您从(Postgre)SQL返回的错误消息通常是简单的英语,因此它不是结构化数据(例如json),因此需要 PARSE 才能理解出现了什么问题,因此您向最终用户生成了非技术性错误消息。
这有什么最好的实践吗?这必然是一个非常普遍的困境?
答案 0 :(得分:1)
最佳做法是让数据库完成工作以检查唯一性。
有两个主要原因。首先,如果您需要名称是唯一的,则希望数据库对数据保持此约束。因此,数据库将检查无论如何。执行额外的检查重复工作,因此只会降低性能。
其次,在多线程环境中,您可以拥有竞争条件。您在代码中进行的任何检查与insert
语句之间存在延迟。另一个线程可能同时插入相同的值。您可以通过使用事务来解决这种滞后问题,但这会降低性能。