1

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

方法 01:

  • 使用“VARCHAR”作为数据类型。
  • 直接状态将存储为 NEW, IN PROGRESS, CLOSED

限制:

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

方法 02:

  • 创建状态查找表
  • 在依赖表中使用状态表作为外键

限制:

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

方法 03:

  • 对状态字段使用 short(或)int
  • 在应用程序接口 (EJB) 中使用 ENUM 维护状态文本

这将解决以前方法的局限性

限制:

  • 需要将整数映射到相关状态(但仍然使用枚举而不是文本是更好的方法)

我觉得第三种方法在 * 更快的 DB 索引方面会更有效 * 由于短(或)int 字段(而不是)varchar 而更快的搜索 * 当然更少的内存指纹

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

提前致谢

4

3 回答 3

2
方法 02:

创建状态查找表
在依赖表中使用状态表作为外键
限制:

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

如果您存储为查找表的外键的值不是人类可读的,或者只有全文是合适的,您才需要使用连接。如果您使用整数,则始终需要连接。但是您可以对某些表使用人类可读的代码。并且查询 char(1) 可能比整数更快。(如果您只有三个不同的值和 1 亿行,这些都不会很快。)

    status_code 状态
    --
    N 新
    P 进行中
    C 关闭

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

方法 03:

对状态字段使用 short(或)int
在应用程序接口 (EJB) 中使用 ENUM 维护状态文本

我不想维护一个只有整数作为值的数据库。

如果您要在此处存储一个整数,则该整数需要是一个表的外键,该表存储业务实际感兴趣的值。您的应用程序 ENUM 也应该通过查询该表来生成。

于 2012-08-12T01:57:08.137 回答
2

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

[enum,VARCHAR(30)] 为了PROCESS TYPES

[String,VARCHAR(1)] 为了PROCESS STATUS

enum看起来是一个更好的选择,因为它可以保存StringJava 代码中的比较。所以我相信如果你选择实现作为一个[enum,NUMERIC]领域,它应该一路走下去......

于 2012-08-11T13:54:58.143 回答
1

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

优点:

  • Java 代码比仅使用数字或字符串更不容易出错。
  • 数据库部分既节省空间又节省 CPU 使用率。
  • 您可以随意重命名enum项目(但不能重命名或移动,请参阅缺点部分)。

缺点:

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

public enum Status {
    EXAMPLE_STATUS("User status message"),
    ... ;

    private Status(String label) {
        this.label = label;
    }
    private final String label;

    public final String label() {
        return label;
    }
}
于 2012-08-11T14:05:01.577 回答