我正在开发一个应用程序,其中用户提交一个任务,而其他用户接受该任务。
很简单。
我想要跟踪任务的进展状态,并将其存储到数据库中。
更恰当的做法是:
1.数据库列中有下列枚举:
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,以此类推。
有更好的建议吗?
提前10倍,如果这个问题有太多的意见基础,很抱歉。
发布于 2015-06-03 16:37:01
我可以在您的枚举中看到冗余,这应该是两个单独的列,每个列都可以是一个枚举:
Col1的枚举:
PRICE_NEGOTIATION,
DEPOSIT_NEGOTIATION,
MISSION_CANCELEDCol2的枚举:
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.你在听吗?)
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
);让数据库强制执行数据之间的所有规则。在最低级别上很好地定义了规则之后,系统的其余部分就获得了这一保证。
发布于 2015-06-03 16:04:36
我认为将它拆分成多个枚举的方式不错,但它需要对DB进行更改。
它还将使您能够创建一个成功的付款与取消理由等。当你有一个(巨大的)枚举,它涵盖了这个逻辑列举所有允许的组合。如果没有它,您要么需要一些应用程序逻辑,要么允许枚举的全部笛卡尔乘法。
无论如何,由于枚举可以有字段和方法,所以只需升级现有的枚举即可。在其中添加一些私有字段和getter,您可以这样做:
if (missionProgress.getPaymentStatus() == PaymentStatus.CANCEL) {...}无论如何,如果您还没有在任何客户的服务器上运行应用程序(已经有大量的数据),我建议您不要使用这种巨大的枚举。
https://softwareengineering.stackexchange.com/questions/285731
复制相似问题