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确定。我用一个示例更新了我的问题,但使用自动递增键,可以在几行中使用相同的字段值,因此为了避免这种情况,在尝试添加到表中之前,我必须检查是否存在值。所有这些控制都会降低我的软件性能?