2012-03-29 128 views
3

我正在创建一个应用程序,其中对象具有状态查询。为了给出一些上下文,我们使用下面的例子。数据库最佳实践 - 状态


其中作业创建,通过以下流程移动一个服务台应用程序:

- 工作创建,但是未分配
正在进行 - 工作分配给工人,正在进行
完成 - 作业已准备好开具发票
已关闭 - 作业开具发票


所以,我创建一个状态表具有以下细节:

INT ID
名称

,并在工作表中查找列

int ID
名称
INT客户ID
INT StatusID - >查找状态

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

  1. 用户需要获得一份报告,显示所有未完成的作业(作业这是新的或INPROGRESS)
  2. 的路线,有人会想补充一点,在中间坐着一个新的状态完成和结束例如。
考虑到这一点

所以,我最初的想法是创建名为SortOrder的或类似的状态表中的新列和编号分配给它,如

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

这意味着对于上面的案例#1,我可以简单地查询数据库中所有状态大于或等于30的作业。这对情况#2也很有用,因为这意味着如果我引入了新状态在完成和关闭之间它不会打破这个报告。

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

+0

保留已弃用的数据(如已关闭的作业)将开始降低查询速度,并引入相当于不断删除死记录的逻辑。 – 2012-03-29 05:10:22

+1

已关闭并不一定代表已弃用。就帮助台系统而言,允许技术人员回顾客户的工作经历可以提供很多真实世界的使用。 – 2012-03-29 07:35:49

+0

随着系统逐渐成熟,数据库将保留大量过时的数据,无法安全地迁移数据。尽早设计此迁移可以帮助系统优雅地老化。我从来没有说过要摆脱这些数据,只是为了不把它保留在查询速度很重要的主表中。此外,您可能希望使用日期而不是代码的值,这样您可以跟踪每个活动的持续时间。为代码添加额外的表可能会节省几行,但这会增加功能。 – 2012-03-29 07:54:32

回答

0

我们所做的只有一个状态表和一个伴随状态组表。

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) 
) 

然后,所有的状态都住在一个地方,而是VS有无数个别组合在一起。

+0

感谢您的回答,我不太明白。我的情况如何使用? – 2012-03-29 07:34:10