管çããã«ã®ã€ã³ããã¯ã¹ïŒãŸãäžäœã®ãã£ã«ã¿ãæé©å
管çããã«åãã®ã€ã³ããã¯ã¹ïŒãŠãŒã¶ãŒãæãã¯ãªãã¯ãããã£ã«ã¿ïŒã¹ããŒã¿ã¹ãæ åœè ãæ¥ä»ç¯å²ãããã¹ãæ€çŽ¢ïŒããå®éã®ã¯ãšãªãã¿ãŒã³ã«åºã¥ããŠåªå ããŠæé©åããæ¹æ³ã

ãªã管çããã«ã®ãã£ã«ã¿ãé
ããªãã®ã\n\n管çããã«ã¯æåã¯çŽ æ©ãæããããšãå€ãã§ãããªã¹ããéããã¹ã¯ããŒã«ããã¬ã³ãŒããã¯ãªãã¯ããŠæ¬¡ãžââãšããæµããããã人ã
ãå®éã«äœ¿ããã£ã«ã¿ïŒãæªå¯Ÿå¿ãã±ããã®ã¿ããMayaã«å²ãåœãŠããå
é±äœæããæ³šæIDã«1047ãå«ãããªã©ïŒãé »ç¹ã«äœ¿ãå§ãããšé
å»¶ãç®ç«ã£ãŠããŸããã¯ãªãã¯ã®ãã³ã«åŸ
ã¡ãçºçãããªã¹ãããã£ããããŠæããããŸãã\n\nåãããŒãã«ã§ãããããã£ã«ã¿ã§ã¯éããå¥ã®ãã£ã«ã¿ã§ã¯éåžžã«é
ããªãããšããããŸããã¹ããŒã¿ã¹ãã£ã«ã¿ã¯è¡ãå°ããçµã£ãŠããè¿ãããšããããŸããã"ããæéã«äœæããã"ãã£ã«ã¿ã¯å·šå€§ãªç¯å²ãèªãŸããããšããããŸããæ
åœè
ãã£ã«ã¿ã¯åäœã§ã¯éããŠããã¹ããŒã¿ã¹ããœãŒããšçµã¿åããããšé
ããªãããšããããŸãã\n\nã€ã³ããã¯ã¹ã¯ããŒã¿ããŒã¹ãå
šè¡šãèªãããšãªã該åœè¡ãèŠã€ããããã®è¿éã§ãããã ãã€ã³ããã¯ã¹ã¯ç¡æã§ã¯ãããŸããã空éãåããæ¿å
¥ãæŽæ°ãããé
ãããŸããé床ã«è¿œå ãããšæžã蟌ã¿ãé
ããªããæ¬åœã®ããã«ããã¯ã¯è§£æ±ºããªããŸãŸã«ãªãããšããããŸãã\n\nãã¹ãŠãã€ã³ããã¯ã¹ããã®ã§ã¯ãªããåªå
ãã¹ããã£ã«ã¿ã¯æ¬¡ã®ç¹åŸŽãæã€ãã®ã§ãïŒ\n\n- åžžã«äœ¿ãããŠãã\n- å€ãã®è¡ã«è§Šãã\n- ç®ã«èŠããåŸ
ã¡æéãçã\n- åçŽã§é©åããã€ã³ããã¯ã¹ã§å®å
šã«æ¹åã§ãã\n\nçŠç¹ãæå³çã«çãããŠããŸãã管çãªã¹ãã®æåã®ããã©ãŒãã³ã¹èŠæ
ã¯ã»ãšãã©ã®å Žåãåã4çš®é¡ã®ãã£ã«ã¿ïŒã¹ããŒã¿ã¹ãæ
åœè
ãæ¥ä»ç¯å²ãããã¹ãïŒã«ãããã®ã§ãããããããªãæåãéãã®ããçè§£ããã°ãæ¬¡ã®æé ã¯æå¿«ã§ãïŒå®éã®ã¯ãšãªãã¿ãŒã³ã確èªããããã«åããã£ãšãå°ããªã€ã³ããã¯ã¹ã远å ããé
ãçµè·¯ãæ¹åããããæ€èšŒããŸãã\n\n## å®éã®ç®¡çäœæ¥ã«çŸããã¯ãšãªãã¿ãŒã³\n\n管çããã«ãé
ããªãã®ã¯å·šå€§ãªã¬ããŒããåå ãšãããããæ°ç»é¢ãåå
æäžäœ¿ãããŠãããããããå°ããªã¯ãšãªãäœåºŠãç¹°ãè¿ãããšãå€ãããã§ãã\n\nOpsããŒã ã¯éåžžããã±ãããæ³šæããŠãŒã¶ãŒãæ¿èªãå
éšãªã¯ãšã¹ããšãã£ãå°æ°ã®äœæ¥ãã¥ãŒã䜿ãç¶ããŸãããããã®ããŒãžã§ããçŸãããã£ã«ã¿ã¯æ¬¡ã®éãã§ãïŒ\n\n- ã¹ããŒã¿ã¹ïŒNewãOpenãPendingãDoneãªã©ïŒ\n- æ
åœè
ïŒèªåã®é
ç®ãæªå²ãåœãŠïŒ\n- æ¥ä»ç¯å²ïŒ"å
é±äœãèµ·ããïŒ"ïŒ\n- æ€çŽ¢ïŒæ³šæçªå·ãã¡ãŒã«ã§æ¢ç¥ã®é
ç®ãžãžã£ã³ãããããã¯ã¡ã¢ããã¬ãã¥ãŒã®ããã¹ããã¹ãã£ã³ïŒ\n\nããŒã¿ããŒã¹ã®ä»äºã¯æå³ã«ãã£ãŠå€ãããŸãïŒ\n\n- ãã©ãŠãºïŒææ°é ã§æµãèŠãïŒã¯ã¹ãã£ã³ã«è¿ããã¿ãŒã³ãéåžžãææ°ã¢ã€ãã ã衚瀺ãå Žåã«ãã£ãŠã¯ã¹ããŒã¿ã¹ã§çµããcreatedã§ãœãŒãããšãã£ã圢ã§ããŒãžã³ã°ãããŸãã\n- ç¹å®ã¢ã€ãã ãèŠã€ããïŒIDãã¡ãŒã«ããã±ããçªå·ãç¥ã£ãŠããïŒã¯ã«ãã¯ã¢ããåã§ãå°æ°ã®è¡ã«ãžã£ã³ãããŠã»ããæåŸ
ããããŸãã\n\n管çããã«ã§ã¯ãã£ã«ã¿ãäºæž¬å¯èœãªçµã¿åããã§äœ¿ãããŸãïŒ"Open + Unassigned"ã"Pending + Assigned to me"ã"éå»30æ¥ã§å®äº"ãªã©ãã€ã³ããã¯ã¹ã¯åã®äžèЧã«åããããããããããå®éã®ã¯ãšãªåœ¢ç¶ã«åããšãã«æã广çã§ãã\n\nããAppMaster (appmaster.io)ã§ç®¡çããŒã«ãäœããªããæã䜿ããããªã¹ãç»é¢ãšããã©ã«ããã£ã«ã¿ãèŠãã°ãããã®ãã¿ãŒã³ã¯ã ãããææ¡ã§ããŸããã€ãŸãæ¥åžžæ¥åãé§åããéšåã«ã€ã³ããã¯ã¹ãéäžãããããªããŸãã\n\n## ã©ã®ã€ã³ããã¯ã¹ãåªå
ãããã®éžã³æ¹\n\nã€ã³ããã¯ã¹äœæ¥ã¯ããªã¢ãŒãžã®ããã«æ±ã£ãŠãã ããããã£ã«ã¿ã®ããããããŠã³ã«çŸãããã¹ãŠã®åã«æãä»ããã®ã§ã¯ãªããåžžã«å®è¡ãããŠäººã
ãæãèç«ãããŠããå°æ°ã®ã¯ãšãªããå§ããŸãã\n\n### å®éã«äœ¿ãããŠãããã£ã«ã¿ãèŠã€ãã\n\n誰ã䜿ããªããã£ã«ã¿ãæé©åããŠãç¡é§ã§ããããããã¹ãèŠã€ããã«ã¯è€æ°ã®ã·ã°ãã«ãçµã¿åãããŸãïŒ\n\n- UIè§£æïŒã©ã®ç»é¢ãããèŠãããŠããããã©ã®ãã£ã«ã¿ãããã¯ãªãã¯ãããã\n- DBãAPIãã°ïŒæãé »ç¹ã«å®è¡ãããã¯ãšãªãšæãé
ãäžäœããŒã»ã³ã\n- å
éšããã®ãã£ãŒãããã¯ïŒ"æ€çŽ¢ãé
ã"ã¯éåžžç¹å®ã®ç»é¢ãæããŸã\n- ããã©ã«ãã®ã©ã³ãã£ã³ã°ãªã¹ãïŒç®¡çè
ãããã«ãéãããšãã«ããèµ°ããã®\n\nå€ãã®ããŒã ã§ã¯ãããã©ã«ããã¥ãŒããOpen ticketsãããNew ordersãã®ãããªãã®ã§ããªãã¬ãã·ã¥ãã¿ãåãæ¿ããè¿ä¿¡åŸã®åŸ©åž°ããšã«å®è¡ãããŸãã\n\n### ãã£ãŒã«ãåã§ã¯ãªãã¯ãšãªåœ¢ç¶ããšã«ã°ã«ãŒãåãã\n\nã€ã³ããã¯ã¹ã远å ããåã«ããã䜿ãããã¯ãšãªããã®æ¯ãèãããšã«ã°ã«ãŒãåããŠãã ããã管çãªã¹ãã®ã¯ãšãªã¯å€§æµä»¥äžã®ããããã§ãïŒ\n\n- ç䟡ãã£ã«ã¿ïŒstatus = 'open'ãassignee_id = 42\n- ç¯å²ãã£ã«ã¿ïŒcreated_atããã2ã€ã®æ¥æã®é\n- ãœãŒããšããŒãžã³ã°ïŒORDER BY created_at DESCã§ããŒãž2ãååŸ\n- ããã¹ãæ€çŽ¢ïŒå®å
šäžèŽïŒæ³šæçªå·ïŒããã¬ãã£ãã¯ã¹ïŒemail starts withïŒã嫿æ€çŽ¢\n\nåãããç»é¢ã«ã€ããŠWHEREã»ORDER BYã»ããŒãžã³ã°ãå«ã圢ç¶ãæžãåºããŠãã ãããUIäžã¯äŒŒãŠèŠããŠããããŒã¿ããŒã¹äžã®æåã¯å€§ããç°ãªãããšããããŸãã\n\n### å°ããªæåã®ããããéžã¶\n\nåªå
ã¿ãŒã²ãã1ã€ããå§ããæ¬¡ã«é »åºŠã®é«ã2ã3ã¯ãšãªãéžã³ãŸããããã ãã§æå€§ã®é
å»¶ãæžãããããšãå€ããããŒã¿ããŒã¹ãã€ã³ããã¯ã¹åç©é€šã«ããŠããŸãäºæ
ãé¿ããããŸãã\n\näŸïŒãµããŒãããŒã ãTicketsãªã¹ããstatus = 'open'ã§éããææ°é ã«ãœãŒããããªãã·ã§ã³ã§æ
åœè
ãšæ¥ä»ç¯å²ãæå®ãããšããŸãããŸãã¯ãã®æ£ç¢ºãªçµã¿åãããæé©åããŠãã ãããéããªã£ããå©çšç¶æ³ã«å¿ããŠæ¬¡ã®ç»é¢ãžç§»ããŸãã\n\n## ã¹ããŒã¿ã¹ãã£ã«ã¿ã®ã€ã³ããã¯ã¹åïŒãããããªãïŒ\n\nã¹ããŒã¿ã¹ã¯æåã«è¿œå ãããã¡ã§ãæ£ããã€ã³ããã¯ã¹åããªããšå¹æãåºãªãããšãå€ããã£ãŒã«ãã§ãã\n\nå€ãã®ã¹ããŒã¿ã¹åã¯ã«ãŒãæ§ãäœãïŒopen, pending, closedãªã©å°æ°ã®å€ïŒãã€ã³ããã¯ã¹ã¯çµæãå°ããçµããå Žåã«å¹æãçºæ®ããŸãããã80ã95%ã®è¡ãåãã¹ããŒã¿ã¹ãæã£ãŠãããªããstatusåç¬ã®ã€ã³ããã¯ã¹ã¯ã»ãšãã©å¹æããªããã€ã³ããã¯ã¹èªäœããªãŒããŒãããã«ãªããŸãã\n\n广ãåºãããã®ã¯æ¬¡ã®ã±ãŒã¹ã§ãïŒ\n\n- ããã¹ããŒã¿ã¹ãçšïŒäŸïŒescalatedïŒ\n- ã¹ããŒã¿ã¹ã奿¡ä»¶ãšçµã¿åããã£ãŠçµæãå°ãããªã\n- ã¹ããŒã¿ã¹ãšãœãŒããå
±éã®ãã¥ãŒã«åèŽãã\n\näžè¬çãªãã¿ãŒã³ã¯"æªè§£æ±ºãææ°é ã§è¡šç€º"ã§ãããã®å Žåããã£ã«ã¿ãšãœãŒããçµã¿åãããã€ã³ããã¯ã¹ã¯ãstatusåäœã®ã€ã³ããã¯ã¹ããæå©ã«ãªããŸãã\n\n广ãåºãããçµã¿åããäŸïŒ\n\n- status + updated_atïŒã¹ããŒã¿ã¹ã§çµã£ãŠæè¿ã®å€æŽã§ãœãŒãïŒ\n- status + assignee_idïŒã¯ãŒã¯ãã¥ãŒãã¥ãŒïŒ\n- status + updated_at + assignee_idïŒãã®æ£ç¢ºãªãã¥ãŒãéåžžã«å€ã䜿ãããå Žåã®ã¿ïŒ\n\næ¯ç¹ãšããŠéšåã€ã³ããã¯ã¹ã¯æçšã§ããopenãäž»èŠãªãã¥ãŒãªãopenã ããã€ã³ããã¯ã¹ããããã«ãããšã€ã³ããã¯ã¹ãå°ããä¿ãŠãæžã蟌ã¿ã³ã¹ããäœããªããŸãã\n\n```sql
-- PostgreSQL example: index only open rows, optimized for newest-first lists
CREATE INDEX CONCURRENTLY tickets_open_updated_idx
ON tickets (updated_at DESC)
WHERE status = 'open';
```\n\nå®çšçãªãã¹ãïŒé
ã管çã¯ãšãªãã¹ããŒã¿ã¹ãã£ã«ã¿ããã»ãªãã§å®è¡ããŠã¿ãŠãã ãããã©ã¡ããé
ããªããstatusåç¬ã®ã€ã³ããã¯ã¹ã§ã¯æããŸããããŸãã¯ãœãŒããšãçµæãæ¬åœã«å°ãããã第äºã®ãã£ã«ã¿ã«æ³šç®ããŸãããã\n\n## æ
åœè
ãã£ã«ã¿ïŒç䟡ã€ã³ããã¯ã¹ãšãã䜿ãããçµã¿åãã\n\nå€ãã®ç®¡çããã«ã§ã¯assignee_idãã¬ã³ãŒãäžã®ãŠãŒã¶ãŒIDãšããŠä¿åãããŠããŸããããã¯å
žåçãªç䟡ãã£ã«ã¿ã§ãåçŽãªã€ã³ããã¯ã¹ã§éããªãããšãå€ãã§ãã\n\næ
åœè
ãã£ã«ã¿ã¯ä»ã®ãã£ã«ã¿ãšçµã¿åãããŠãã䜿ãããŸããäŸãã°ãµããŒããªãŒãã"Alexã«å²ãåœãŠããããã®"ãšçµã£ãåŸã§"Open"ã«çµãããšãã£ãå
·åã§ãããããããã¥ãŒãé
ãå Žåã¯åäžåã€ã³ããã¯ã¹ããè€åã€ã³ããã¯ã¹ãå¿
èŠã§ãã\n\nåºçºç¹ãšããŠé©åãªã®ã¯ããã䜿ãããçµã¿åããã«åãããè€åã€ã³ããã¯ã¹ïŒ\n\n- (assignee_id, status) ã¯ãèªåã«å²ãåœãŠãããæªè§£æ±ºãåã\n- (assignee_id, status, updated_at) ã¯äžèЧãæè¿ã®æŽ»åã§ãœãŒããããå Žåã«æå¹\n\nè€åã€ã³ããã¯ã¹ã§ã¯é åºãéèŠã§ããç䟡ãã£ã«ã¿ãå
ã«ïŒå€ãã®å Žåassignee_idïŒããœãŒããç¯å²åïŒupdated_atïŒãåŸã«çœ®ããŸãããããããŒã¿ããŒã¹ãå¹çããå©çšã§ãã圢ã§ãã\n\næªå²ãåœãŠã¯ããããèœãšã穎ã§ããå€ãã®ã·ã¹ãã ãassignee_idãNULLã§æªå²ãåœãŠã衚çŸããŠãããNULLã¯ããŒã¿ããŒã¹ãã¯ãšãªåœ¢ç¶ã«ãã£ãŠå®è¡èšç»ãå€ããã®ã§ãæ
åœè
ã«ããŸãå¹ãã€ã³ããã¯ã¹ãæªå²ãåœãŠã«ã¯å¹ããªãããšããããŸãã\n\næªå²ãåœãŠãäž»èŠãªã¯ãŒã¯ãããŒãªããæç¢ºãªæ¹éãæ±ºããŠãã¹ãããŠãã ããïŒ\n\n- assignee_idãnullableã®ãŸãŸã«ããå ŽåãWHERE assignee_id IS NULLããã¹ãããŠå¿
èŠãªãã€ã³ããã¯ã¹åããã\n- ç¹å¥ãªãUnassignedããŠãŒã¶ãŒå€ã䜿ãã®ã¯ããŒã¿ã¢ãã«ã«åãå Žåã«æ€èšããã\n- ããŒã¿ããŒã¹ããµããŒããããªãæªå²ãåœãŠè¡ã«å¯Ÿããéšåã€ã³ããã¯ã¹ãäœãã\n\nAppMasterã§ç®¡çããã«ãäœããªããããŒã ãæã䜿ããã£ã«ã¿ãšãœãŒãããã°ã«åãããããã®ãã¿ãŒã³ã«åãããå°æ°ã®ã€ã³ããã¯ã¹ãçšæããã®ã广çã§ãã\n\n## æ¥ä»ç¯å²ïŒãŠãŒã¶ãŒã®ãã£ã«ã¿æ¹æ³ã«åãã€ã³ããã¯ã¹\n\næ¥ä»ãã£ã«ã¿ã¯ãéå»7æ¥ããéå»30æ¥ããšãã£ãããªã»ããããéå§ã»çµäºãéžã¶ã«ã¹ã¿ã ããã«ãŒã§ãã䜿ãããŸããèŠãç®ã¯åçŽã§ãã倧ããªããŒãã«ã§ã¯éåžžã«ç°ãªãäœæ¥ãçºçãããŸãã\n\nãŸãããŠãŒã¶ãŒãã©ã®ã¿ã€ã ã¹ã¿ã³ãåãæããŠããããæç¢ºã«ããŠãã ããã䜿ãåãã®äŸïŒ\n\n- created_at ã¯ãæ°ããã¢ã€ãã ããã¥ãŒçš\n- updated_at ã¯ãæè¿å€æŽãããããã¥ãŒçš\n\nãã®åã«éåžžã®btreeã€ã³ããã¯ã¹ã匵ã£ãŠãã ãããããããªããšãéå»30æ¥ãã®ã¯ãªãã¯ãå
šè¡šã¹ãã£ã³ã«å€ããããšããããŸãã\n\nããªã»ããç¯å²ã¯ãã created_at >= now() - interval '30 days' ã®ããã«ãªããŸããããã¯ç¯å²æ¡ä»¶ãªã®ã§ãcreated_atã€ã³ããã¯ã¹ã¯å¹ççã«äœ¿ãããŸããUIãææ°é ã«ãœãŒãããå ŽåããœãŒãæ¹åïŒäŸïŒcreated_at DESCïŒã«åããããšãããŒãŠãŒã¹ããããªã¹ãã§ã¯æå©ã§ãã\n\næ¥ä»ãä»ã®ãã£ã«ã¿ïŒã¹ããŒã¿ã¹ãæ
åœè
ïŒãšçµã¿åããããšãã¯éžæçã«ãè€åã€ã³ããã¯ã¹ã¯ãã®çµã¿åãããé »ç¹ã«äœ¿ãããå Žåã«ã®ã¿äœãã¹ãã§ãããã§ãªããã°æžã蟌ã¿ã³ã¹ãã ããå¢ããŸãã\n\nå®è·µçãªã«ãŒã«ïŒ\n\n- ã»ãšãã©ã®ãã¥ãŒãã¹ããŒã¿ã¹ã§çµã£ãããšæ¥ä»ã§çµããªãã(status, created_at)ã圹ç«ã€ã\n- ã¹ããŒã¿ã¹ã¯ä»»æã ãã©æ¥ä»ãåžžã«ãããªããåçŽãªcreated_atã€ã³ããã¯ã¹ãä¿ã¡ãè€åãä¹±ç«ãããªãã\n- ãã¹ãŠã®çµã¿åãããäœããªããã€ã³ããã¯ã¹ã¯å¢ããã»ã©ã¹ãã¬ãŒãžãé£ããæžã蟌ã¿ãé
ãããã\n\nã¿ã€ã ãŸãŒã³ãšå¢çã¯ãã¬ã³ãŒããè¶³ããªãããã°ãåŒãèµ·ãããããã§ãããŠãŒã¶ãŒãæ¥ä»ã ããéžã¶å Žåãçµäºæ¥ãã©ãè§£éããããæ±ºããŠãã ãããå®å
šãªãã¿ãŒã³ã¯éå§ãå
å«ã§çµäºãæä»ã«ããããšïŒcreated_at >= start ãš created_at < end_next_day ã®ããã«ããã¿ã€ã ã¹ã¿ã³ãã¯UTCã§ä¿åããŠãŠãŒã¶ãŒå
¥åãã¯ãšãªåã«UTCã«å€æããŸãã\n\näŸïŒéçšç®¡çè
ã1æ10æ¥ãã12æ¥ãéžãã§1æ12æ¥ã®å
šæ¥åãèŠãããšæåŸ
ãããšããŸããããã¯ãšãªã <= '2026-01-12 00:00' ã䜿ã£ãŠãããšã1æ12æ¥ã®ã»ãšãã©ãèœãšããŠããŸããŸããã€ã³ããã¯ã¹ã®åé¡ã§ã¯ãªãå¢çåŠçã®åé¡ã§ãã\n\n## ããã¹ããã£ãŒã«ãïŒå®å
šäžèŽãšå
嫿€çŽ¢ã®åé¢\n\nããã¹ãæ€çŽ¢ã¯å€ãã®ç®¡çããã«ã§é
ããªããã€ã³ãã§ãããªããªã人ã
ã¯äžã€ã®æ€çŽ¢ããã¯ã¹ã«ãã¹ãŠãæåŸ
ããã¡ã ããã§ãããŸãã¯äºã€ã®ããŒãºãåããŠãã ããïŒå®å
šäžèŽïŒéãäºæž¬å¯èœïŒãšå
嫿€çŽ¢ïŒæè»ã ãéãïŒã\n\nå®å
šäžèŽãã£ãŒã«ãã«ã¯æ³šæIDããã±ããçªå·ãã¡ãŒã«ãé»è©±ãå€éšåç
§ãªã©ãå«ãŸããŸãã管çè
ãIDãã¡ãŒã«ã貌ãä»ããŠæ€çŽ¢ããããšãå€ããã°ãéåžžã®ã€ã³ããã¯ã¹ã§å³ææ§ãå®çŸã§ããŸãã\n\nå
嫿€çŽ¢ã¯ããŠãŒã¶ãŒããrefundãããjohnãã®æçã§ååãã¡ã¢ãæ¢ãå Žåã§ããã°ãã° LIKE %term% ãšããŠå®è£
ãããŸããå
é ãã¯ã€ã«ãã«ãŒãã®ããéåžžã®B-treeã€ã³ããã¯ã¹ã¯äœ¿ãããå€ãã®è¡ãã¹ãã£ã³ããŠããŸããŸãã\n\nè² è·ããããã«æ€çŽ¢ãèšèšããå®çšçãªæ¹æ³ïŒ\n\n- å®å
šäžèŽæ€çŽ¢ïŒIDãã¡ãŒã«ããŠãŒã¶ãŒåïŒã第äžçŽã®äœ¿ãæ¹ãšããŠæç¢ºã«ããã\n- ãå
é äžèŽãïŒterm%ïŒã¯éåžžã®ã€ã³ããã¯ã¹ã§å©ãããããååæ€çŽ¢ãªã©ã«ã¯ååãªããšãå€ãã\n- å
嫿€çŽ¢ã¯ãã°ãäžæºã瀺ãå Žåã«ã®ã¿è¿œå ããã\n- 远å ãããªããLIKE %term%ã«éåžžã€ã³ããã¯ã¹ã§æåŸ
ããã®ã§ã¯ãªããPostgreSQLã®å
šææ€çŽ¢ãããªã°ã©ã ã€ã³ããã¯ã¹ãªã©é©åãªããŒã«ã䜿ãã\n\nå
¥åã«ãŒã«ã¯å€ãã®ããŒã ãéå°è©äŸ¡ããŠããã»ã©å¹æçã§ããè² è·ãæžããçµæãäžè²«ãããŸãïŒ\n\n- å
嫿€çŽ¢ã®æå°æåæ°ãèšå®ïŒäŸïŒ3æå以äžïŒ\n- 倧æåå°æåãæ£èŠåãããã倧æåå°æåç¡èŠã®æ¯èŒãäžè²«ããŠäœ¿ã\n- ååŸã®ã¹ããŒã¹ãããªã ããé£ç¶ã¹ããŒã¹ãçž®ãã\n- ã¡ãŒã«ãIDã¯ããã©ã«ãã§å®å
šäžèŽãšããŠæ±ãïŒäžè¬æ€çŽ¢ããã¯ã¹ã«å
¥ã£ãŠãïŒ\n- æ¡ä»¶ãåºãããå Žåã¯ãŠãŒã¶ãŒã«çµã蟌ã¿ãä¿ã代ããã«å€§èŠæš¡ã¯ãšãªãå®è¡ããªã\n\nå°ããªäŸïŒãµããŒããããŒãžã£ãŒããannãã§é¡§å®¢ãæ¢ãå Žåãã·ã¹ãã ãååã»ã¡ã¢ã»äœæã§ LIKE %ann% ãå®è¡ãããšæ°åè¡ãã¹ãã£ã³ããããšã«ãªããŸãããŸãIDãã¡ãŒã«ãªã©ã®å®å
šäžèŽã確èªããå¿
èŠã«å¿ããŠè³¢ãããã¹ãã€ã³ããã¯ã¹ã«ãã©ãŒã«ããã¯ããããšã§æ€çŽ¢è² è·ãæããããŸãã\n\n## ã€ã³ããã¯ã¹ãå®å
šã«è¿œå ããããã®æ®µéçã¯ãŒã¯ãããŒ\n\nã€ã³ããã¯ã¹ã¯è¿œå ã¯ç°¡åã§ãããåŸæãç°¡åã§ããå®å
šãªã¯ãŒã¯ãããŒã¯ç®¡çè
ãé Œããã£ã«ã¿ã«éäžããããã¶ã圹ç«ã€ãã€ã³ããã¯ã¹ãåŸã§æžã蟌ã¿ãé
ãããäºæ
ãé¿ããŸãã\n\nå®äœ¿çšããå§ããŠãã ãããäžäœã¯ãšãªãäºã€ã®èгç¹ã§æœåºããŸãïŒ\n\n- æãé »ç¹ã«å®è¡ãããã¯ãšãª\n- æãé
ãã¯ãšãª\n\n管çããã«ã§ã¯éåžžããããã¯ãã£ã«ã¿ãšãœãŒãã䌎ããªã¹ãããŒãžã§ãã\n\n次ã«ãããŒã¿ããŒã¹ãèŠãæ£ç¢ºãªã¯ãšãªåœ¢ç¶ãååŸããŸããWHEREãORDER BYããœãŒãæ¹åãäžè¬çãªçµã¿åããïŒäŸïŒstatus = 'open' AND assignee_id = 42 ORDER BY created_at DESCïŒãæ£ç¢ºã«æžãåºããŠãã ãããå°ããªéããã©ã®ã€ã³ããã¯ã¹ãå¹ãããå€ããŸãã\n\nã·ã³ãã«ãªã«ãŒããåããŸãããïŒ\n\n- 1ã€ã®é
ãã¯ãšãªãš1ã€ã®ã€ã³ããã¯ã¹å€æŽãéžã¶ã\n- åäžã®ã€ã³ããã¯ã¹ã远å ãŸãã¯èª¿æŽããã\n- åããã£ã«ã¿ã»åããœãŒãã§å枬å®ããã\n- æ¿å
¥ãæŽæ°ãèããé
ããªã£ãŠããªãã確èªããã\n- 察象ã¯ãšãªãæç¢ºã«æ¹åããå Žåã®ã¿å€æŽãä¿æããã\n\nããŒãžã³ã°ãå¥éãã§ãã¯ãå¿
èŠã§ããOFFSET 20000ã®ãããªoffsetããŒã¹ã®ããŒãžã³ã°ã¯æ·±ãè¡ãã»ã©é
ããªããã¡ã§ãããŠãŒã¶ãŒãéåžžã«æ·±ãããŒãžãžé »ç¹ã«é£ã¶ãªããã«ãŒãµãŒåããŒãžã³ã°ïŒããã®ã¿ã€ã ã¹ã¿ã³ã/IDããåã®é
ç®ã衚瀺ãïŒãæ€èšããŠãã ãããã€ã³ããã¯ã¹ã倧ããªããŒãã«ã§äžè²«ããä»äºãã§ããããã«ãªããŸãã\n\næåŸã«ãå°ããªèšé²ãæ®ããŠã€ã³ããã¯ã¹äžèŠ§ãæ°ã¶æåŸã§ãçè§£ã§ããããã«ããŸãïŒã€ã³ããã¯ã¹åãããŒãã«ãåïŒé åºïŒãšããã®ã€ã³ããã¯ã¹ããµããŒãããã¯ãšãªã\n\n## 管çããã«ã§ããããã€ã³ããã¯ã¹ã®èª€ã\n\n人ã
ãå®éã«ã©ã®ããã«ãã£ã«ã¿ã»ãœãŒãã»ããŒãžã³ã°ãããã確èªããã«ã€ã³ããã¯ã¹ã远å ãããšã管çããã«ã¯ããã£ãŠé
ãæããããããšããããŸããã€ã³ããã¯ã¹ã¯ã¹ãã¬ãŒãžã䜿ãããã¹ãŠã®æ¿å
¥ãšæŽæ°ã«è¿œå äœæ¥ãçã¿ãŸãã\n\n### ããèŠããã誀ã\n\n次ã®ãã¿ãŒã³ãå€ãã®åé¡ãçã¿ãŸãïŒ\n\n- ã念ã®ãããã«ãã¹ãŠã®åã«ã€ã³ããã¯ã¹ã匵ã\n- 誀ã£ãåé ã§è€åã€ã³ããã¯ã¹ãäœã\n- ãœãŒããšããŒãžã³ã°ãç¡èŠãã\n- LIKE '%term%'ã®ãããªå
嫿€çŽ¢ãéåžžã€ã³ããã¯ã¹ã§çŽããšæåŸ
ãã\n- UI倿ŽåŸã«å€ãã€ã³ããã¯ã¹ãæ®ãç¶ãã\n\nããããã·ããªãªïŒãµããŒãããŒã ãStatus = Openã§ãã±ããããã£ã«ã¿ããupdatedæéã§ãœãŒãããŠããŒãžã³ã°ãããšããŸããstatusã ãã«ã€ã³ããã¯ã¹ã匵ããšãããŒã¿ããŒã¹ã¯ãã¹ãŠã®Openãã±ãããåéããŠãœãŒãããªããã°ãªããªããããããŸããããã£ã«ã¿ãšãœãŒãã®äž¡æ¹ã«åãã€ã³ããã¯ã¹ãããã°ããŒãž1ãçŽ æ©ãè¿ããŸãã\n\n### ãããã®åé¡ãçºèŠããç°¡åãªæ¹æ³\n\n管çUIã®å€æŽååŸã§ç°¡åã«ã¬ãã¥ãŒãè¡ã£ãŠãã ããïŒ\n\n- äžäœã®ãã£ã«ã¿ãšããã©ã«ãã®ãœãŒããåæããããã«åãWHERE + ORDER BYãã¿ãŒã³ããµããŒãããã€ã³ããã¯ã¹ãååšããã確èªããã\n- å
é ã¯ã€ã«ãã«ãŒãïŒLIKE '%term%'ïŒããã§ãã¯ããå
嫿€çŽ¢ãæ¬åœã«å¿
èŠã倿ããã\n- éè€ãéãªãåãã€ã³ããã¯ã¹ãæ¢ãã\n- æªäœ¿çšã€ã³ããã¯ã¹ããã°ãã远跡ããäžèŠãªãåé€ããã\n\nAppMasterã§PostgreSQLã䜿ã£ãŠç®¡çããã«ãäœãå Žåãç»é¢ãå
¬éãããã³ã«ãã®ã¬ãã¥ãŒãçµã¿èŸŒããšè¯ãã§ããUIãå®éã«äœ¿ããã£ã«ã¿ãšãœãŒãããé©åãªã€ã³ããã¯ã¹ãå°ãããããšãå€ãããã§ãã\n\n## ç°¡åãªãã§ãã¯ã𿬡ã®äžæ\n\nããã«å€ãã®ã€ã³ããã¯ã¹ã远å ããåã«ãæ¢åã®ã€ã³ããã¯ã¹ãæ¥åžžçã«äœ¿ããããã£ã«ã¿ã«å¹ããŠãããã確èªããŠãã ãããè¯ã管çããã«ã¯ãçšãªæ€çŽ¢ã§ã¯ãªãããã䜿ãããçµè·¯ããå³æã«æãããããã®ã§ãã\n\nããã€ãã®ãã§ãã¯ã§å€ãã®åé¡ãé²ããŸãïŒ\n\n- æãäžè¬çãªãã£ã«ã¿ã®çµã¿åããïŒã¹ããŒã¿ã¹ãæ
åœè
ãæ¥ä»ç¯å²ãããã©ã«ããœãŒãïŒãéããããŒãã«ã倧ãããªã£ãŠãé«éã確èªããã\n- åé
ããã¥ãŒã«ã€ããŠãã¯ãšãªãWHEREãšORDER BYã®äž¡æ¹ã«åãã€ã³ããã¯ã¹ã䜿ã£ãŠããã確èªããã\n- ã€ã³ããã¯ã¹äžèЧã¯çãä¿ã¡ãåã€ã³ããã¯ã¹ã®ç®çãäžæã§èª¬æã§ããçšåºŠã«ããã\n- ã€ã³ããã¯ã¹è¿œå åŸã«äœæã»æŽæ°ãé
ããªã£ãŠããªããç£èŠãããé
ããªã£ãŠãããªãã€ã³ããã¯ã¹ãå€ããããéè€ããŠããå¯èœæ§ãããã\n- UIã§ã®ãæ€çŽ¢ããäœãæå³ãããïŒå®å
šäžèŽããã¬ãã£ãã¯ã¹ãå
å«ïŒã決ããããã«åãã€ã³ããã¯ã¹èšç»ãç«ãŠãã\n\nå®çšçãªæ¬¡ã®äžæã¯ããŽãŒã«ãã³ãã¹ãå¹³æãªæç« ã§æžãåºãããšã§ããäŸïŒ"ãµããŒãæ
åœã¯æªè§£æ±ºãã±ããããèªåã«å²ãåœãŠããããã®ãéå»7æ¥åãææ°é ã§ãã£ã«ã¿ãã"ããã®æã䜿ã£ãŠãããããæç¢ºã«ãµããŒãããå°ããªã€ã³ããã¯ã¹éåãèšèšããŠãã ããã\n\nãŸã æ§ç¯ã®åææ®µéãªããããŸãå€ãã®ç»é¢ãäœãåã«ããŒã¿ãšããã©ã«ããã£ã«ã¿ãã¢ãã«åããŠãããšè¯ãã§ããAppMaster (appmaster.io)ã䜿ãã°ç®¡çãã¥ãŒãçŽ æ©ãå埩ã§ããå®éã®äœ¿çšã§ããããã¹ãæããã«ãªã£ãŠããå°æ°ã®ã€ã³ããã¯ã¹ã远å ã§ããŸãã
ãããã質å
ãŸãã¯åžžã«å®è¡ãããã¯ãšãªããå§ããŠãã ããïŒç®¡çè ãæåã«èŠãããã©ã«ãã®ãªã¹ããã¥ãŒãšãæ¥äžã«äœåºŠãã¯ãªãã¯ããã2ã3åã®ãã£ã«ã¿ã§ããé »åºŠãšäœæïŒæãé ãã»æã䜿ããããã®ïŒãèšæž¬ããç¹å®ã®ã¯ãšãªåœ¢ç¶ã§åŸ ã¡æéã確å®ã«ççž®ãããã®ã ãã«ã€ã³ããã¯ã¹ãä»ããŸãã
ç°ãªããã£ã«ã¿ãç°ãªãäœæ¥éãããŒã¿ããŒã¹ã«èª²ãããã§ãããããã£ã«ã¿ã¯è¡ãå°ããçµã蟌ã¿å³åº§ã«çµæãè¿ããŸãããå¥ã®ãã£ã«ã¿ã¯åºãç¯å²ãèªã¿åã£ãã倧éã®çµæããœãŒããããããããæéãããããŸããããã¯ãšãªã¯ã€ã³ããã¯ã¹ãããŸã䜿ããå¥ã®ã¯ãšãªã¯ã¹ãã£ã³ã倧ããªãœãŒããäœåãªããããŸãã
åžžã«ã§ã¯ãããŸãããå€ãã®è¡ãåãã¹ããŒã¿ã¹ãå
±æããŠããå Žåãstatusåç¬ã®ã€ã³ããã¯ã¹ã§ã¯ã»ãšãã©æ¹åããªãããšãå€ãã§ããã¹ããŒã¿ã¹ãçšã§ããå Žåããããã¯ã¹ããŒã¿ã¹ãšãœãŒããä»ã®ãã£ã«ã¿ãçµã¿åããããšãã«çµæã»ãããæ¬åœã«çµã蟌ããå Žåã«å¹æãåºãŸãã
ãŠãŒã¶ãŒã®æäœã«åãããè€åã€ã³ããã¯ã¹ã䜿ããŸããäŸãã°ã¹ããŒã¿ã¹ã§çµã£ãŠã¢ã¯ãã£ããã£é ã«äžŠã¹ããã¥ãŒãªããstatusãå«ãè€åã€ã³ããã¯ã¹ãéšåã€ã³ããã¯ã¹ïŒPostgreSQLã®äŸãªã©ïŒãæå¹ã§ããéšåã€ã³ããã¯ã¹ã¯ãããã¹ããŒã¿ã¹ïŒäŸïŒopenïŒãäž»èŠãªãã¥ãŒã§ããå Žåã«å°ããä¿ãŠãã®ã§æžã蟌ã¿ã³ã¹ããæããããŸãã
assignee_idã¯å€ãã®å Žåã¬ã³ãŒãäžã®ãŠãŒã¶ãŒIDïŒå€éšããŒïŒãšããŠä¿åãããç䟡ãã£ã«ã¿ãšããŠåçŽãªã€ã³ããã¯ã¹ã§å¹æãçºæ®ããŸããããŒã ã®ã¯ãŒã¯ãããŒã§ãèªåã«å²ãåœãŠãããæªè§£æ±ºããé »ç¹ã«äœ¿ããªããè€åã€ã³ããã¯ã¹ã®æ¹ãåäžåã€ã³ããã¯ã¹ããé«éã«ãªãããšãå€ãã§ããé åºãšããŠã¯ç䟡ãã£ã«ã¿ïŒassignee_idïŒãå
ã«ããœãŒããç¯å²ã®åïŒupdated_atãªã©ïŒãåŸãã«çœ®ããŸãã
å€ãã®ã·ã¹ãã ã§æªå²ãåœãŠã¯NULLã§è¡šçŸãããWHERE assignee_id IS NULLã¯WHERE assignee_id = 123ãšæåãå®è¡èšç»ãå€ããããšããããŸããæªå²ãåœãŠãã¥ãŒãéèŠãªãããã®ã¯ãšãªãåå¥ã«ãã¹ãããå¿
èŠãªãéšåã€ã³ããã¯ã¹ãæç€ºçãªå¯ŸåŠãè¡ã£ãŠãã ããã
人ãéåžžæå³ããã¿ã€ã ã¹ã¿ã³ãåãæç¢ºã«ãããŸããã®åã«å¯ŸããŠB-treeã€ã³ããã¯ã¹ã匵ããŸããcreated_atã¯æ°èŠã¢ã€ãã çšãupdated_atã¯æè¿å€æŽããããã®çšãšäœ¿ãåããŠãã ãããUIããææ°é ãã«ãœãŒãããã®ã§ããã°ããœãŒãæ¹åã«åãã€ã³ããã¯ã¹ïŒäŸïŒPostgreSQLã§ã®created_at DESCïŒãéçšããããªã¹ãã§å¹æçã§ãããã ãè€åã€ã³ããã¯ã¹ã¯ãã³ã³ãããŒã·ã§ã³ãé »ç¹ã«äœ¿ãããå Žåã ãã«éå®ããã®ãå®å
šã§ãã
LIKE %term%ã®ãããªå
é ã¯ã€ã«ãã«ãŒãã䌎ãcontainsæ€çŽ¢ã¯éåžžã®B-treeã€ã³ããã¯ã¹ãå©çšã§ãããå€ãã®è¡ãã¹ãã£ã³ããŠããŸããŸããIDãã¡ãŒã«ã¢ãã¬ã¹ãªã©ã®å®å
šäžèŽããŸãåªå
ããŠé«éã«ããcontainsæ€çŽ¢ãæ¬åœã«å¿
èŠãªå Žåã¯PostgreSQLã®å
šææ€çŽ¢ãããªã°ã©ã ã€ã³ããã¯ã¹ãªã©é©åãªææ®µãæ€èšããŠãã ããã
ãã¹ãŠã®ãã£ã«ã¿å¯èœãªåã«ç¡å·®å¥ã«ã€ã³ããã¯ã¹ã远å ãããšãã¹ãã¬ãŒãžãå¢ããæ¿å
¥ãæŽæ°ãé
ããªããŸãããŸãå®éã®ããã«ããã¯ãWHERE + ORDER BYã®äžäžèŽã§ããå Žåã¯ããã§ã解決ããŸãããå®å
šãªã«ãŒãã¯äžåºŠã«1ã€ã®ã€ã³ããã¯ã¹å€æŽãå ãããã®ã¯ãšãªã§å枬å®ããŠæç¢ºã«æ¹åã確èªã§ãããã®ã ããæ®ãããšã§ãã管çç»é¢ãAppMasterã§äœããªããããŒã ãæã䜿ããã£ã«ã¿ãšãœãŒãããã°ã«åããããã«åãããå°ããªã€ã³ããã¯ã¹éåãäœãã®ãè¯ãã§ãããã


