Java 使用查找表实现提高性能的最佳实践
我想知道创建查找表的最佳方法是什么。 例如,我有一个表Java 使用查找表实现提高性能的最佳实践,java,mysql,database,hibernate,primary-key,Java,Mysql,Database,Hibernate,Primary Key,我想知道创建查找表的最佳方法是什么。 例如,我有一个表missionProfile,其中有一个字段(主键)字符串idMissionProfile和一个字段note。我所有的价值观必须彼此不同。 但是使用这种方法,链接到missionProfile的所有表都将整个字符串键作为外键,我认为它比一个Integer主键占用更多内存并需要更多时间来写入整个字符串。 但是如果我使用一个整数主键,我必须在创建它之前检查字段missionProfile是否存在,因为该键是递增的,并且可能是我的字段的重复值。 在
missionProfile
,其中有一个字段(主键)字符串idMissionProfile
和一个字段note
。我所有的价值观必须彼此不同。
但是使用这种方法,链接到missionProfile
的所有表都将整个字符串键作为外键,我认为它比一个Integer
主键占用更多内存并需要更多时间来写入整个字符串。
但是如果我使用一个整数主键,我必须在创建它之前检查字段missionProfile是否存在,因为该键是递增的,并且可能是我的字段的重复值。
在大型数据库中,根据您的经验,最好使用字符串或始终检查字段是否存在,然后写入数据库?
多谢各位
范例
任务简介:
idMissionProfile
------------------------------------------
FIRST_OIL_CHANGE_SAMPLE_&_PARAMETERS_RESET
NEDC
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);
}
在这个问题上你把一大堆东西都弄混了。我不完全确定我是否理解了您的要求-模式或者更好的SQLFIDLE会很好 第一个问题是“字符串是否比整数占用更多的空间?”。答案是肯定的,但这在现代硬件上并不重要,除非您在规模、性能或可扩展性方面处于极端状态 第二个问题是“我应该如何生成主键?”。这是一个问题;但几乎所有人都同意,主键应该是“自然”(域实体的一个属性,保证唯一且永远不会更改),或者是一个完全没有意义的东西,如自动递增的整数或GUID 从问题的字里行间可以看出,查找表的主键似乎有某种意义,因为您使用它来检查值是否存在。这是一个坏主意,因为这意味着在不检查每个相关实体的情况下,您永远无法更改该值 例如,如果您有一个“employees”表和一个“department”表,如下所示: 雇员
EmployID Name Department LeavingDate
------------------------------------------
1 Fred HR NULL
2 Angie HR 1 Jan 2010
3 Bert IT NULL
EmployID Name Department LeavingDate
------------------------------------------
1 Fred 1 NULL
2 Angie 1 1 Jan 2010
3 Bert 2 NULL
部门
DepartmentID Name
------------------------------------------------
HR HR Department
IT IT Department
DepartmentID Name ValidFrom ValidUntil
-----------------------------------------------------------
1 HR Department 1/1/1990 1/1/2016
1 People Department 1/1/2016 NULL
2 IT Department 1/1/1990 NULL
如果人力资源部在2016年1月1日更名为“人员”,你会如何处理安吉?她离开的时候部门叫人力资源部,所以你不能把它改成人。但是,在更新人力资源部门的名称时,您不想检查是否有人离开
有一把没有意义的钥匙要整洁得多。这样,您就可以在部门中构建“名称历史记录”逻辑,而不必影响链接到它的所有表
雇员
EmployID Name Department LeavingDate
------------------------------------------
1 Fred HR NULL
2 Angie HR 1 Jan 2010
3 Bert IT NULL
EmployID Name Department LeavingDate
------------------------------------------
1 Fred 1 NULL
2 Angie 1 1 Jan 2010
3 Bert 2 NULL
部门
DepartmentID Name
------------------------------------------------
HR HR Department
IT IT Department
DepartmentID Name ValidFrom ValidUntil
-----------------------------------------------------------
1 HR Department 1/1/1990 1/1/2016
1 People Department 1/1/2016 NULL
2 IT Department 1/1/1990 NULL
我想您要问的第三个问题是“我应该创建一个查找表,还是应该使用具有固有含义的属性?”这在从Excel导入时尤为重要
正式的答案是,如果你有一个实际的、可测量的问题,只需要担心性能。这一点通常是在体面的硬件上记录数千万或数亿条
更实际的答案是,这取决于您打算如何使用数据
如果您始终需要使用更为用户友好的字符串替换第一个\u OIL\u CHANGE\u SAMPLE\u和\u PARAMETERS\u RESET
,我会创建一个具有自动递增主键的查找表
如果涉及到业务逻辑-FIRST\u OIL\u CHANGE\u SAMPLE\u和\u PARAMETERS\u RESET
记录与VEHICLE\u TRANSFER
记录的处理方式不同,我会使用自动递增整数。这降低了输入错误的风险,并允许您向查找表添加逻辑标志
但是,如果您只是将此列读回,没有逻辑或替换,我会将该值直接读入表中…我不太理解您的问题!如果使用字符串值作为键,那么在使用它之前不需要检查该值是否存在吗?使用自动递增整数类型字段,可以保证密钥是唯一的。可能我解释得不够详细。我的所有值必须彼此不同,因此,如果我在调用save方法时将值存储为主键,则如果存在该值,则不会添加该值。如果我存储整数主键和我的值,我必须检查是否存在。如果您使用自动递增字段作为主键(或Neville在回答中指出的UUID),然后,当您将记录插入表中时,该键的值由mysql确定。我用一个示例更新了我的问题,但使用自动递增键,可以在几行中使用相同的字段值,因此为了避免这种情况,在尝试添加到表中之前,我必须检查是否存在值。所有这些控制都会降低我的软件性能?