我有两个列表的订单,
ID OPEN CLOSE
1 {} {}
2 {} NULL
3 {} {}
OPEN/CLOSE
列是JSONB
列,包含来自第三方API的收据,它们通常只在以后用于分析原因而不被查询。为了区分已完成的订单和仍在等待的订单,如果NOT NULL
订单已完成,我检查CLOSE
列值。然而,由于第三方API的变化,我将不得不在CLOSE
列中保留一些JSON
值。我的计划是创建名为STATUS
的第三列枚举类型,并使用该枚举跟踪订单的状态。我的问题是如何将数据从CLOSE
迁移到STATUS
,每个NOT NULL
应该得到一个enum休息另一个。
ID OPEN CLOSE STATUS
1 {} {} FILLED
2 {} NULL WAITING
3 {} {} FILLED
根据CLOSE是否有值,用两个可能的值之一填充STATUS:
update orders set STATUS = (case when CLOSE is null then 'WAITING' else 'FILLED' end);
(未测试)
另一个选项是创建一个名为ClosedDate
的DateTime
列。新列中的NULL
值将继续以与当前处理Close
列中的NULL
值相同的方式处理;任何东西都能告诉你交易结束的确切时间。这将使用更少的存储空间,同时为您提供更多的信息。
…当然,现有数据除外,因为您无法通过模式获得这些信息。对于这些记录,您可以分解现有的JSON数据来找到您想要的值,或者您可以使用一个预先确定的值来表示在跟踪数据之前关闭了记录。
你可以这样做迁移现有的数据:
UPDATE Orders
SET ClosedDate = CASE WHEN Close IS NULL THEN NULL ELSE CURRENT_DATE END
如果你继续使用status
字段(这与我的建议有一个很好的争论,因为它为你在未来设置了更多不同的顺序状态),使用更短的状态代码可能会更好;不需要将整个单词存储在表中。这将适合每页多一些记录,并帮助任何索引使用更少的内存。