Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数据库设计-使用Short代替Varchar-用于状态字段_Java_Database_Database Design_Database Performance - Fatal编程技术网

Java 数据库设计-使用Short代替Varchar-用于状态字段

Java 数据库设计-使用Short代替Varchar-用于状态字段,java,database,database-design,database-performance,Java,Database,Database Design,Database Performance,以下方法可用于在DB表中设计与状态相关的字段 方法01: 使用“VARCHAR”作为数据类型 直接状态将存储为“新建”、“正在进行”和“已关闭” 限制: 在表中搜索字符串总是需要更多的时间和资源 更改现有状态文本(例如:“已关闭”为“已完成”)需要完整的表更新 方法02: 创建状态查找表 将状态表用作从属表中的外键 限制: 维护外键关系 需要对应用程序中的所有相关查询使用JOIN 方法03: 对状态字段使用短(或)int 在应用程序接口(EJB)中使用ENUM维护状态文本 这

以下方法可用于在DB表中设计与状态相关的字段

方法01:

  • 使用“VARCHAR”作为数据类型
  • 直接状态将存储为“新建”、“正在进行”和“已关闭”
限制:

  • 在表中搜索字符串总是需要更多的时间和资源
  • 更改现有状态文本(例如:“已关闭”为“已完成”)需要完整的表更新
方法02:

  • 创建状态查找表
  • 将状态表用作从属表中的外键
限制:

  • 维护外键关系
  • 需要对应用程序中的所有相关查询使用JOIN
方法03:

  • 对状态字段使用短(或)int
  • 在应用程序接口(EJB)中使用ENUM维护状态文本
这将解决以前方法的局限性

限制:

  • 需要将整数映射到相关状态(但仍然使用枚举而不是文本是更好的方法)
我觉得第三种方法在效率方面会更高 *更快的数据库索引 *由于短(或)int字段(而不是)varchar,搜索速度更快 *当然更少的记忆指纹

请告知第三种方法在灵活性、维护和性能方面是否存在任何缺陷


提前感谢

在我们的应用程序中,我们使用了

[enum,VARCHAR(30)]
用于
流程类型

[String,VARCHAR(1)]
用于
过程状态

enum
看起来是一个更好的选择,因为它在Java代码中保存了
String
比较。
因此,我相信如果您选择的实现是一个
[enum,NUMERIC]
字段,那么它应该一直运行下去

在我们的应用程序中,我们使用了

[enum,VARCHAR(30)]
用于
流程类型

[String,VARCHAR(1)]
用于
过程状态

enum
看起来是一个更好的选择,因为它在Java代码中保存了
String
比较。
因此,我相信如果您选择的实现是一个
[enum,NUMERIC]
字段,那么它应该一直运行下去

在我们的项目中,我们使用了与您的#3非常相似的方法。在Java端,我们使用了
enum
s。在持久化到数据库时,我们使用JPA(EnumType.)将枚举映射到数字。我们将状态文本嵌入到枚举中(参见下面的示例),但它也可以完全分开

优点:

  • 与只处理数字或字符串相比,Java代码更不容易出错
  • 数据库部分,它的空间和CPU使用效率都很高
  • 您可以随意重命名
    enum
    项(但不能重命名或移动,请参见Cons部分)
缺点:

  • 数据库中的数字是枚举的数字。因此,您不能删除或重新排序Java代码中的
    enum
    项。您只能在列表的末尾添加新的。这取决于你的情况,但对我们来说这不是什么大不了的事。没有理由移动枚举项的顺序。如果我们想删除一个项目,我们只需将其重命名为
    REMOVED\u STATUS\u XY
    ,以确保代码中不再使用它


在我们的项目中,我们使用了与您的#3非常相似的方法。在Java端,我们使用了
enum
s。在持久化到数据库时,我们使用JPA(EnumType.)将枚举映射到数字。我们将状态文本嵌入到枚举中(参见下面的示例),但它也可以完全分开

优点:

  • 与只处理数字或字符串相比,Java代码更不容易出错
  • 数据库部分,它的空间和CPU使用效率都很高
  • 您可以随意重命名
    enum
    项(但不能重命名或移动,请参见Cons部分)
缺点:

  • 数据库中的数字是枚举的数字。因此,您不能删除或重新排序Java代码中的
    enum
    项。您只能在列表的末尾添加新的。这取决于你的情况,但对我们来说这不是什么大不了的事。没有理由移动枚举项的顺序。如果我们想删除一个项目,我们只需将其重命名为
    REMOVED\u STATUS\u XY
    ,以确保代码中不再使用它

方法02: 创建状态查找表 将状态表用作从属表中的外键 限制: 维护外键关系 需要对应用程序中的所有相关查询使用JOIN 只有当存储为查找表外键的值不可读,或者只有全文才合适时,才需要使用联接。如果使用整数,则始终需要联接。但对于某些表,可以使用人类可读的代码。查询char(1)可能比查询整数快。(如果您只有三个不同的值和1亿行,那么所有这些都不会非常快。)

状态\代码状态 -- N新 P进行中 C关闭

将“关闭”改为“完成”只需要更新一行,但我认为这是一个巧合。

Approach 03 : Use short (or) int for the status field Maintain the status text using ENUM in the application interfaces(EJB) 方法03: 对状态字段使用短(或)int 在应用程序接口(EJB)中使用ENUM维护状态文本 我不想维护一个只有整数的数据库

如果要在此处存储一个整数,则该整数必须是存储业务实际感兴趣的值的表的外键。应用程序枚举应该由quer生成 Approach 02 : Create a status look-up table Use the status table as a foreign key in the dependent tables Limitations : Maintaining the foreign key relationships Need to use JOIN for all the related queries in application status_code status -- N New P In progress C Closed Approach 03 : Use short (or) int for the status field Maintain the status text using ENUM in the application interfaces(EJB)