在我的数据库模式中,我有一个被标识的实体。标识符可以被重用,因此与实体之间存在一对多的关系。例如:一个人可以有一个绰号。昵称不是唯一的,可以在许多人之间共享。因此,模式可能如下所示:
PERSON
id
name
nickname_id
NICKNAME
id
name
问题是,在插入新人员时,我必须首先查询NICKNAME
以查看昵称是否存在。如果不存在,则必须在NICKNAME
中创建一行。在插入许多人员时,这可能会很慢,因为每个人员插入都会导致对NICKNAME
的查询。
我可以通过先为所有昵称查询昵称来优化大型插入。JPA查询语言:
SELECT n FROM NICKNAME n WHERE name in ( Krusty , Doppy , Flash , etc)
然后根据需要创建新的昵称,接着将昵称 ID 设置到人员上。
这会使软件变得有些复杂,因为它必须在内存中暂时存储昵称。此外,一些数据库对IN
子句的参数有限制(例如SQL Server为2100),因此我必须执行多个查询。
我很好奇其他人如何处理这个问题。更具体地说,当一个数据库被规范化并且一个实体有与另一个实体的关系时,插入一个新实体基本上会导致必须检查另一个实体。对于大型插入,除非将操作提升到代码域中,否则这可能会很慢。是否有一种自动插入相关表行的方式? 我很好奇其他人如何处理这个问题。更具体地说,当一个数据库被规范化并且一个实体有与另一个实体的关系时,插入一个新实体基本上会导致必须检查另一个实体。对于大型插入,除非将操作提升到代码域中,否则这可能会很慢。是否有一种自动插入相关表行的方式?
FYI,我正在使用Hibernate对JPA的实现