识别SQL列更新的业务逻辑

时间:2019-04-09 10:47:38

标签: sql python-3.x postgresql

我有一个名为contacts的SQL表,其行数为n,其中n大于10拉赫(100万)行。

下面是带有伪数据的表结构

+---------------+------------+---------+-----------+---------+------------------------+
|     email     | department |  title  |   state   | country | cleansing_verification |
+---------------+------------+---------+-----------+---------+------------------------+
| xyz@email.com | h.r.       | sr. Exe | telangana | Ind     |                      - |
+---------------+------------+---------+-----------+---------+------------------------+

所以,我有4个调度程序来清理上表中显示的数据,即

  1. 部门清洁剂
  2. 标题清洁剂
  3. 状态清洁剂
  4. 乡村清洁剂

每个清洁程序将更新相应列的数据。我又添加了一个列调用cleansing_verification,以标识哪个列已更新但无法正确使用。

任何清洁人员都可以触摸一封电子邮件。这意味着所有4个都可以更新值,或者任何3个,任何2个或只有1个。

所以,我面临的问题是如何识别被触摸的电子邮件,哪些未被识别,以便剩下的我可以发送电子邮件通知。

如果还有其他需要告诉我,我会在问题中补充。

谢谢。

1 个答案:

答案 0 :(得分:1)

因此,通常在数据库设计领域中我们不这样做,但是您可以使用位域。因此,您的cleansing_verificationBIT(4)类型的列,每个清洁剂都有一些可以设置的地方:

  • 部门= B'1000'
  • 标题= B'0100'
  • state = B'0010'
  • 国家= B'0001'

在运行状态时,您将:

UPDATE contacts 
   SET cleansing_verification = cleansing_verification | B'0010'
 WHERE -- whatever conditions you want to apply

如果要检查给定清洁程序更新了哪些行,请检查是否设置了该位,例如用于状态:

SELECT * FROM contacts WHERE cleansing_verification & B'0010' = B'0010'

Working example on dbfiddle

实际上,这样做的正确方法是将一个带有外键的新表返回到contacts表中,并为清洁剂添加一个列,例如(快速实例):

CREATE TABLE contacts_verification
(
   contact_id int references contacts(id),
   cleanser int
)

然后,如果您想标记一条记录,只需插入联系人ID和某种清洁剂标识(1、2、3、4),或者如果您确实想要,则可以使用文本字段和有意义的名称:

INSERT INTO contacts_verification (contact_id, cleanser) VALUES (21386, 1)

然后只需使用JOIN即可获取由清洁剂标记的记录:

SELECT c.*
  FORM contacts c
  JOIN contacts_verification dep_verify
    ON dep_verify.contact_id = c.id
   AND dep_verify.cleanser = 1