Skip to content

Batch Item Table

Overview

Stores one batch request, its child job ID, and a durable SQS message. Child lifecycle rows and messages are inserted together in one transaction.

Table Definition

Logical Name Physical Name Column Name Data Type Primary Key Relation Unique Nullable Default Value Remarks
Batch Item batch_item id string โ—ฏ Backend UUIDv7 (varchar(255))
batch_id string batch:id Owning batch / ใƒใƒƒใƒ (varchar(255))
position number Zero-based input order / 0 ๅง‹ใพใ‚Šใฎๅ…ฅๅŠ›้ †ๅบ
request json Validated API request / ๆคœ่จผๆธˆใฟ API ๅ…ฅๅŠ› (jsonb)
job_id string โ—ฏ Page Import or Code2Des ID / ๅญใ‚ธใƒงใƒ– ID (varchar(255))
message json โ—ฏ Durable worker payload / ๆฐธ็ถšๅŒ–ใ—ใŸใƒฏใƒผใ‚ซใƒผๅ…ฅๅŠ› (jsonb)
dispatched_at datetime โ—ฏ SQS accepted timestamp / SQS ้€ไฟก็ขบ่ชๆ—ฅๆ™‚
lease_until datetime โ—ฏ Dispatch claim expiry / ใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒๅ–ๅพ—ใฎๆœ‰ๅŠนๆœŸ้™
dispatch_attempts number 0 Dispatch claim count / ใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒ่ฉฆ่กŒๆ•ฐ
error_message string โ—ฏ Terminal dispatch error / ใƒ‡ใ‚ฃใ‚นใƒ‘ใƒƒใƒๅคฑๆ•—็†็”ฑ (text)
cancelled_at datetime โ—ฏ Cancellation timestamp / ใ‚ญใƒฃใƒณใ‚ปใƒซๆ—ฅๆ™‚
created_at datetime CURRENT_TIMESTAMP Shared audit field / ๅ…ฑ้€š็›ฃๆŸป้ …็›ฎ
updated_at datetime CURRENT_TIMESTAMP Shared audit field / ๅ…ฑ้€š็›ฃๆŸป้ …็›ฎ
deleted_at datetime โ—ฏ Soft delete / ่ซ–็†ๅ‰Š้™คๆ—ฅๆ™‚
created_by string Cognito subject (varchar(50))
updated_by string Cognito subject (varchar(50))
deleted_by string โ—ฏ Cognito subject (varchar(50))

Relations

  • batch_id โ†’ batch.id (delete cascade)
  • job_id resolves to page_import.id or code2des.id according to batch type; no polymorphic foreign key. / ใƒใƒƒใƒ็จฎๅˆฅใซๅฟœใ˜ใŸๅญใ‚ธใƒงใƒ– IDใ€‚ๅค–้ƒจใ‚ญใƒผๅˆถ็ด„ใฏ่จญๅฎšใ—ใพใ›ใ‚“ใ€‚

Indexes

  • PRIMARY KEY (id)
  • INDEX batch_item_batch_idx (batch_id, position)
  • INDEX batch_item_dispatch_idx (dispatched_at, lease_until)

Notes

  • Aggregate status is derived from child jobs and dispatch metadata; counters are not stored separately.
  • Dispatch claims expire after 90 seconds. Row locks prevent concurrent claims. Queue delivery is attempted up to three times using the same child ID and message.
  • Workers do not connect to PostgreSQL. Existing webhooks update child job completion.

  • API status is derived: "0" processing, "1" completed, "2" failed, "3" cancelled. Queued/running are separate counts, not stored statuses.