首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一Enum对多Enum

一Enum对多Enum
EN

Software Engineering用户
提问于 2015-06-03 16:15:39
回答 2查看 2.3K关注 0票数 1

我正在开发一个应用程序,其中用户提交一个任务,而其他用户接受该任务。

很简单。

我想要跟踪任务的进展状态,并将其存储到数据库中。

更恰当的做法是:

1.数据库列中有下列枚举:

代码语言:javascript
复制
PRICE_NEGOTIATION, 
DEPOSIT_NEGOTIATION,
MISSION_STARTED, 
DEMO_RECEIVED, 
DEMO_APPROVED, 
DEMO_UNAPPROVED, 
PAYMENT_DONE, 
PAYMENT_PENDING,

PRICE_NEGOTIATION_UNAPPROVED_BY_CREATOR, 
PRICE_NEGOTIATION_UNAPPROVED_BY_ACCEPTOR, 
DEPOSIT_NEGOTIATION_UNAPPROVED_BY_CREATOR, 
DEPOSIT_NEGOTIATION_UNAPPROVED_BY_ACCEPTOR, 
MISSION_CANCELED_AFTER_START_BY_CREATOR, 
MISSION_CANCELED_AFTER_START_BY_ACCEPTOR, 
MISSION_CANCELED_AFTER_DEMO_UNAPPROVEMENT,

以此类推。

  1. 在数据库中有多个列,其中一个列给出了取消原因,另一个列包含了取消任务的人,还有一个列提供了支付状态的信息。

有更好的建议吗?

提前10倍,如果这个问题有太多的意见基础,很抱歉。

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2015-06-03 16:37:01

我可以在您的枚举中看到冗余,这应该是两个单独的列,每个列都可以是一个枚举:

Col1的枚举:

代码语言:javascript
复制
PRICE_NEGOTIATION,
DEPOSIT_NEGOTIATION,
MISSION_CANCELED

Col2的枚举:

代码语言:javascript
复制
UNAPPROVED_BY_CREATOR,
UNAPPROVED_BY_ACCEPTOR, 
UNAPPROVED_BY_ACCEPTOR, 
AFTER_START_BY_CREATOR,
AFTER_START_BY_ACCEPTOR,
AFTER_DEMO_UNAPPROVEMENT

您甚至可以添加一个check约束,以确保两个enum列之间的值正常(假设您使用的是支持检查约束的RDBMS - hello MySQL.你在听吗?)

代码语言:javascript
复制
alter table ... add constraint enum_sanity_chk check (
  case
    when col1='PRICE_NEGOTIATION' then
      col2 in (
        'UNAPPROVED_BY_CREATOR',
        'UNAPPROVED_BY_ACCEPTOR'
      )
    when col1='DEPOSIT_NEGOTIATION' then
      col2 in (
        'UNAPPROVED_BY_CREATOR',
        'UNAPPROVED_BY_ACCEPTOR'
      )
    when col1='MISSION_CANCELED' then
      col2 in (
        'AFTER_START_BY_CREATOR',
        'AFTER_START_BY_ACCEPTOR',
        'AFTER_DEMO_UNAPPROVEMENT'
      )
    ...
    else
      false -- col1 not matched to any expected enum
  end
);

让数据库强制执行数据之间的所有规则。在最低级别上很好地定义了规则之后,系统的其余部分就获得了这一保证。

票数 4
EN

Software Engineering用户

发布于 2015-06-03 16:04:36

我认为将它拆分成多个枚举的方式不错,但它需要对DB进行更改。

它还将使您能够创建一个成功的付款与取消理由等。当你有一个(巨大的)枚举,它涵盖了这个逻辑列举所有允许的组合。如果没有它,您要么需要一些应用程序逻辑,要么允许枚举的全部笛卡尔乘法。

无论如何,由于枚举可以有字段和方法,所以只需升级现有的枚举即可。在其中添加一些私有字段和getter,您可以这样做:

代码语言:javascript
复制
if (missionProgress.getPaymentStatus() == PaymentStatus.CANCEL) {...}

无论如何,如果您还没有在任何客户的服务器上运行应用程序(已经有大量的数据),我建议您不要使用这种巨大的枚举。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/285731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档