数据库最佳实践 - 状态

标签 database database-design

我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。


帮助台应用程序,其中创建作业并通过以下工作流程移动:

- 工作已创建但未分配
进行中 - 分配给工作人员的工作正在进行中
完成 - 工作完成准备开具发票
已关闭 - 已开具工作发票


因此,我创建了一个包含以下详细信息的状态表:

整数 ID
字符串 名称

和工作表上的查找列

整数 ID
字符串 名称
int 客户 ID
int StatusID -> 查询状态

所以在现实世界中,假设我们有以下要求。

  1. 用户需要获得一份报告以显示所有未完成的工作(新工作或进行中的工作)
  2. 在线下,有人会想要添加一个新状态,例如位于已完成和已关闭之间。

考虑到这一点,我最初的想法是在 Status 表上创建一个名为 SortOrder 或类似名称的新列,并为其分配数字,例如

- 10
进行中 - 20
已完成 - 30
关闭 - 40

这意味着对于上面的案例 #1,我可以简单地查询数据库以查找状态大于或等于 30 的所有作业。这对于案例 #2 也很好,因为这意味着如果我引入一个新的介于已完成和已关闭之间的状态不会破坏此报告。

我可以看到它经常出现在不同的应用程序中。有没有人实现过这样的解决方案或以前遇到过这个问题?

最佳答案

我们所做的是拥有一个状态表和一个配套的状态组表。

create table status_group (
    id integer primary key not null,
    alias varchar(20) not null,
    descr varchar(128)
)

create table status (
    id integer primary key not null,
    status_group_id integer,
    alias varchar(20) not null,
    descr varchar(128)
)

然后所有状态都位于一个位置,但组合在一起而不是拥有无数个单独的状态。

关于数据库最佳实践 - 状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9919146/

相关文章:

java - 如何像 oracle/mysql in(row1,row2,row3...) 一样按行解析 HBase 查询数据

database - 是否可以在 grails 中动态映射域对象的表名?

mysql - 错误 : could not open single-table tablespace file .\scrapers\records.ibd

成员(member)订阅付款的 SQL 表设计帮助

mysql - mysql中的表关系设计

php - php如何设计数据库实现网站导航效果?

java - SQLite - 当数据库不存在时未捕获 executeUpdate 异常? ( java )

php表单mysql更新保存数据

ruby-on-rails - 您如何保持业务规则 DRY?

mysql - mysql 中是否可以使用 getter then 运算符?