【发布时间】:2016-04-19 17:35:39
【问题描述】:
我想知道创建查找表的最佳方法是什么。
例如,我有一个表missionProfile,其中一个字段(主键)字符串idMissionProfile 和一个字段note。我所有的价值观必须彼此不同。
但是通过这种方法,所有链接到missionProfile 的表都将整个字符串键作为外键,我认为与Integer 主键相比,它会占用更多内存并且需要更多时间来写入整个字符串。
但是,如果我使用整数主键,我必须在创建它之前检查字段missionProfile 是否存在,因为键是增量的,并且可能是我的字段的重复值。
在大型数据库中,根据您的经验,最好使用 String 或始终检查该字段是否存在然后写入数据库?
谢谢
例子
任务简介:
idMissionProfile
------------------------------------------
FIRST_OIL_CHANGE_SAMPLE_&_PARAMETERS_RESET
NEDC
VEHICLE_TRANSFER
或
idMissionProfile MissionProfile
-------------------------------------------
1 FIRST_OIL_CHANGE_SAMPLE_&_PARAMETERS_RESET
2 NEDC
3 VEHICLE_TRANSFER
所以在我的收购中
idAcquisition id_MissionProfile
---------------------------------
1 1
2 2
3 2
否则我会有
idAcquisition id_MissionProfile
---------------------------------
1 FIRST_OIL_CHANGE_SAMPLE_&_PARAMETERS_RESET
2 NEDC
3 NEDC
第二种方法似乎更好,但是当我添加新的任务配置文件时,我必须检查是否存在,而不是在第一种方法中,如果存在,它不会添加新的字符串值,因为它是键。 这是一个简单的案例,但是如果我有一个由几列组成的主键呢? 我正在将一个 excel 文件映射到数据库中,因此我需要选择最佳方法来提高我的性能
有了增量 id 我有:
MissionProfile missionProfile=null;
if ((value=actualRowValues.get(ExcelMappingCoordinate.missionProfile.getCoordinate()+index))!=null){
missionProfile= missionProfileServices.findByMissionProfile(value);
//TODO se esiste allora carica quello che esiste altrimenti lo crea
if (missionProfile == null){
missionProfile= new MissionProfile();
missionProfile.setMissionProfile(value);
missionProfileServices.create(missionProfile);
}
我有键值
MissionProfile missionProfile=new MissionProfile();
if ((value=actualRowValues.get(ExcelMappingCoordinate.missionProfile.getCoordinate()+index))!=null){
missionProfile.setMissionProfile(value);
missionProfileServices.create(missionProfile);
}
【问题讨论】:
-
我不太明白你的问题!如果您使用字符串值作为键,那么您不需要在使用之前检查该值是否存在吗?使用 auto_increment 整数类型字段,保证键是唯一的。
-
也许我解释得不够好。我所有的值都必须彼此不同,所以如果我在调用 save 方法时将值存储为主键,它不会添加该值(如果存在)。如果我存储整数主键和我的值,我必须检查是否存在。
-
如果您使用 auto_increment 字段作为主键(或 Neville 在他的回答中指出的 UUID),那么当您将记录插入表中时,该键的值由 mysql 确定。
-
我用一个例子更新了我的问题
标签: java mysql database hibernate primary-key