éè€ãçªå·ã®æ¬ èœãé²ãåæå®è¡å®å šãªè«æ±æžçªå·ä»ã
è€æ°ã®ãŠãŒã¶ãŒãåæã«è«æ±æžããã±ãããäœæããŠããçªå·ã®éè€ãäºæããªãæ¬ çªãé²ãããã®å®è·µçãªãã¿ãŒã³ãåŠã³ãŸãã

äºäººãåæã«ã¬ã³ãŒããäœæãããšäœãåé¡ã«ãªãã
ååŸ4æ55åã®å¿ãããªãã£ã¹ãæ³åããŠãã ãããäºäººãè«æ±æžã宿ãããã»ãŒåæã«ä¿åãã¿ã³ãæŒããŸããäž¡æ¹ã®ç»é¢ã«äžæçã«ãè«æ±æž #1042ããšè¡šç€ºããããçæ¹ã®ã¬ã³ãŒãã ããä¿åãããããææªã®å Žåã¯äž¡æ¹ãåãçªå·ã§ä¿åãããŠããŸãããããå®åã§æãããèŠãããçç¶ã§ãïŒè² è·æã«ã®ã¿çŸããéè€çªå·ã
ãã±ããã§ãåãããšãèµ·ããŸããäºäººã®ãšãŒãžã§ã³ããåæã«åã顧客ã®ãã±ãããäœæããããªãã®ã·ã¹ãã ããæ¬¡ã®çªå·ããæè¿ã®ã¬ã³ãŒããèŠãŠæ±ºããŠãããšãäž¡æ¹ãåããææ°å€ããèªã¿åã£ãŠããŸããåãæ¬¡çªå·ãéžã¶ããšããããŸãã
äºã€ç®ã®çç¶ã¯ãã埮åŠã§ãïŒçªå·ã®æ¬ èœã§ãã#1042 ã®æ¬¡ã #1044 ã§ #1043 ããªãããšããããšãèµ·ããŸããããã¯å€ãã®å Žåãšã©ãŒããªãã©ã€ã®åŸã«èµ·ããŸãããããªã¯ãšã¹ããçªå·ã確ä¿ããåŸãããªããŒã·ã§ã³ãšã©ãŒãã¿ã€ã ã¢ãŠãããŠãŒã¶ãŒãã¿ããéããããšã§ä¿åã倱æããããããã¯ããã¯ã°ã©ãŠã³ããžã§ãããããã¯ãŒã¯ã®äžæçãªäžå ·åã§ãªãã©ã€ããæåã®è©Šè¡ãæ¢ã«çªå·ãæ¶è²»ããŠããã«ãé¢ãããæ°ããçªå·ãæŽãã§ããŸãã
è«æ±æžã§ã¯ãçªå·ä»ãã¯ç£æ»èšé²ã®äžéšãªã®ã§éèŠã§ããäŒèšæ åœè ã¯åè«æ±æžãäžæã«èå¥ãããããšãæåŸ ããŸãããé¡§å®¢ã¯æ¯æãããµããŒãã®ã¡ãŒã«ã§è«æ±æžçªå·ãåç §ããããšããããŸãããã±ããã§ã¯ããã®çªå·ãäŒè©±ãã¬ããŒãããšã¯ã¹ããŒãã§äœ¿ããããã³ãã«ã§ããéè€ã¯æ··ä¹±ãæããŸããæ¬ çªã¯äœãäžæ£ããªãã£ããšããŠãã¬ãã¥ãŒæã«çåãçãããšããããŸãã
ããã§æ©ãã«äŒããŠããããäž»èŠãªæåŸ ã¯ïŒãã¹ãŠã®çªå·ä»ãæ¹æ³ãåæå®è¡å®å šæ§ã𿬠çªã®äž¡æ¹ãæºãããããã§ã¯ãªãããšããããšã§ããå€äººæ°ã§ãéè€ãèµ·ããªãåæå®è¡å®å šãªè«æ±æžçªå·ä»ãïŒéè€ãªãïŒã¯éæå¯èœã§ãããè²ããªãèŠä»¶ã«ããã¹ãã§ããæ¬ çªããªãããšãå¯èœã§ããã远å ã«ãŒã«ãèšããå¿ èŠãããããã©ããã倱æãåãæ¶ãã®æ±ããå€ããããšãå€ãã§ãã
åé¡ãæŽçããè¯ãæ¹æ³ã¯ãçªå·ã«äœãä¿èšŒããŠã»ããããåãããšã§ãïŒ
- 絶察ã«ç¹°ãè¿ããªãããšïŒåžžã«äžæïŒ
- ãªãã¹ãå¢å é ã§ããããšïŒããã°è¯ãïŒ
- æ¬ çªããªãããšïŒãããæ±ãããªãèšèšäžæç¢ºã«ããïŒ
ã«ãŒã«ã決ããã°ãæè¡çãªè§£æ±ºçã®éžæããã£ãšç°¡åã«ãªããŸãã
ãªãéè€ã𿬠çªãèµ·ããã®ã
å€ãã®ã¢ããªã¯åçŽãªãã¿ãŒã³ã«åŸããŸãïŒãŠãŒã¶ãŒãä¿åãã¯ãªãã¯ãããšãã¢ããªããæ¬¡ã®è«æ±æžçªå·ããåãã«è¡ãããã®çªå·ã§æ°ããã¬ã³ãŒããæ¿å ¥ããŸããåç¬ã§æäœããŠãããšãã¯ããã§åé¡ãããŸããã
åé¡ã¯äºã€ã®ä¿åãã»ãšãã©åæã«èµ·ãããšãã«å§ãŸããŸããäž¡æ¹ã®ãªã¯ãšã¹ãããæ¬¡ã®çªå·ãååŸãããæ®µéã«å°éããã©ã¡ããæ¿å ¥ãå®äºããåã«åããæ¬¡ãã®å€ãèªããšãäž¡æ¹ãåãçªå·ãæžã蟌ãããšããŸããããã¯ç«¶åç¶æ ïŒã¬ãŒã¹ã³ã³ãã£ã·ã§ã³ïŒã§ãçµæã¯ããžãã¯ã§ã¯ãªãã¿ã€ãã³ã°ã«äŸåããŸãã
å žåçãªã¿ã€ã ã©ã€ã³ã¯æ¬¡ã®éãã§ãïŒ
- ãªã¯ãšã¹ã A ãæ¬¡ã®çªå·ãèªã¿åãïŒ1042
- ãªã¯ãšã¹ã B ãæ¬¡ã®çªå·ãèªã¿åãïŒ1042
- ãªã¯ãšã¹ã A ãè«æ±æž 1042 ãæ¿å ¥ãã
- ãªã¯ãšã¹ã B ãè«æ±æž 1042 ãæ¿å ¥ããïŒãããã¯äžææ§ã«ãŒã«ã§å€±æããïŒ
ããŒã¿ããŒã¹ãäºåç®ã®æ¿å ¥ãæ¢ããªããšéè€ãçºçããŸããã¢ããªåŽã§ããã®çªå·ãæ¢ã«äœ¿ãããŠãããïŒããšã ããã§ãã¯ããŠãããšããã§ãã¯ãšæ¿å ¥ã®éã®ç«¶åã«è² ããããšããããŸãã
æ¬ çªã¯å¥ã®åé¡ã§ããçªå·ãã確ä¿ããããããã®ã¬ã³ãŒããå®éã®ã³ãããæžã¿è«æ±æžããã±ããã«ãªããªãå Žåã«çºçããŸããäžè¬çãªåå ã¯æ¯æã倱æãåŸã§èŠã€ãã£ãããªããŒã·ã§ã³ãšã©ãŒãã¿ã€ã ã¢ãŠããçªå·ãå²ãåœãŠãããåŸã«ãŠãŒã¶ãŒãã¿ããéããããšãªã©ã§ããæ¿å ¥ã倱æããŠäœãä¿åãããªããŠããçªå·ã¯æ¢ã«æ¶è²»ãããŠããããšããããŸãã
é ããåæå®è¡ã¯ãããæªåãããŸããåé¡ã¯åã«ãäºäººã®äººãä¿åãã¯ãªãã¯ãããã ãã§ã¯ãããŸãããæ¬¡ã®ãããªããšããããŸãïŒ
- 䞊åã«ã¬ã³ãŒããäœã API ã¯ã©ã€ã¢ã³ã
- ãããã§èµ°ãã€ã³ããŒãåŠç
- å€éã«è«æ±æžãçæããããã¯ã°ã©ãŠã³ããžã§ã
- åç·ãäžå®å®ãªã¢ãã€ã«ã¢ããªããã®ãªãã©ã€
ã€ãŸãæ ¹æ¬åå ã¯ïŒ(1) è€æ°ãªã¯ãšã¹ããåãã«ãŠã³ã¿å€ãèªãã¿ã€ãã³ã°ã®è¡çªã(2) ãã©ã³ã¶ã¯ã·ã§ã³æåã確å®ããåã«çªå·ãå²ãåœãŠãŠããŸãããšãã§ããã©ã®æ¹éã蚱容ãããïŒéè€ãªããæ¬ çªãªãããããã¯ãã®äž¡æ¹ïŒã決ããå¿ èŠããããŸãã
解決çãéžã¶åã«çªå·ä»ãã«ãŒã«ã決ãã
åæå®è¡å®å šãªè«æ±æžçªå·ä»ããèšèšããåã«ãçªå·ãããžãã¹äžã§äœãæå³ããã®ããæžãåºããŠãã ãããããããééãã¯ãæè¡çæ¹æ³ãå ã«éžãã§ããŸããäŒèšãæ³åã®èŠä»¶ãšé£ãéãããšã§ãã
ãŸãæ··åãããã¡ãªäºã€ã®ç®æšãåããŠèããŸãïŒ
- äžææ§ïŒUniqueïŒïŒäºã€ã®è«æ±æžããã±ãããåãçªå·ãæããªãããšã
- æ¬ çªãªãïŒGaplessïŒïŒçªå·ãäžæã§ããã€å³å¯ã«é£ç¶ããŠããããšïŒæ¬ çªããªãïŒã
å€ãã®å®ã·ã¹ãã ã¯ãäžææ§ã®ã¿ããç®æããæ¬ çªã蚱容ããŸããæ¬ çªã¯æ£åžžãªçç±ã§èµ·ãåŸãŸãïŒãŠãŒã¶ãŒããã©ãããéããŠæŸæ£ãããæ¯æãã倱æããŠçªå·ã確ä¿ãããããããã¯äœæåŸã«ãã®ã¬ã³ãŒããç¡å¹åããçããã«ããã¹ã¯ã®ãã±ããã§ã¯æ¬ çªã¯ã»ãšãã©åé¡ã«ãªããŸãããè«æ±æžã§ããæ¬ çªãç£æ»èšé²ïŒç¡å¹ããã£ã³ã»ã«ããã¹ãçïŒã§èª¬æã§ããã°åãå ¥ããããããšãå€ãã§ããæ¬ çªç¡ããæããªãã远å ã«ãŒã«ãšéçšäžã®æ©æŠãå¿ èŠã«ãªããŸãã
次ã«ãã«ãŠã³ã¿ã®é©çšç¯å²ïŒã¹ã³ãŒãïŒã決ããŠãã ãããèšãåãã®å°ããªéããèšèšã倧ããå€ããŸãïŒ
- å šäœã§äžã€ã®ã·ãŒã±ã³ã¹ããäŒç€ŸïŒããã³ãããšã®å¥ã·ãŒã±ã³ã¹ãïŒ
- æ¯å¹Žãªã»ãããããïŒ2026-000123 ã®ããã«ïŒãããšããªã»ããããªããïŒ
- è«æ±æžã貞æ¹ç¥šããã±ããã§å¥ã®ã·ãªãŒãºãå¿ èŠãïŒ
- 人éã«åªããæžåŒïŒãã¬ãã£ãã¯ã¹ãåºåãïŒããå éšçšã®çªå·ã ãã§ãããïŒ
å ·äœäŸïŒè€æ°ã®ã¯ã©ã€ã¢ã³ãäŒç€Ÿãæã€ SaaS ãªããè«æ±æžçªå·ã¯äŒç€Ÿããšã«äžæã§å¹ŽåºŠããšã«ãªã»ããããå¿ èŠãããããã±ããã¯ã°ããŒãã«ã«äžæã§ãªã»ããããªãããšããèŠä»¶ãããåŸãŸããããã¯äºã€ã®ç°ãªãã«ãŠã³ã¿èšèšãå¿ èŠã§ãã
æ¬åœã«æ¬ çªãªããå¿ èŠãšãããªããçªå·ãå²ãåœãŠãããåŸã«ã©ã®ã€ãã³ãã蚱容ãããæç¢ºã«ããŠãã ãããäŸïŒè«æ±æžãåé€ã§ãããããã£ã³ã»ã«ã®ã¿ãããŠãŒã¶ãŒããã©ãããä¿åã§ãããçªå·ã¯æçµæ¿èªæã«å²ãåœãŠããããããã®éžæã¯ããŒã¿ããŒã¹æè¡ãããéèŠãªå Žåãå€ãã§ãã
æ§ç¯åã«çã仿§ãæžãåºããŠãã ããïŒ
- ã©ã®ã¬ã³ãŒãã¿ã€ããã·ãŒã±ã³ã¹ã䜿ããïŒ
- ãã€çªå·ããäœ¿çšæžã¿ããšã¿ãªããïŒãã©ãããéä¿¡æžã¿ãå ¥éæžã¿ãªã©ïŒïŒ
- ã¹ã³ãŒãã¯äœãïŒã°ããŒãã«ãäŒç€Ÿããšã幎床ããšãã·ãªãŒãºããšïŒïŒ
- ç¡å¹åãèšæ£ã¯ã©ãæ±ããïŒ
AppMaster ã§ã¯ããã®çš®ã®ã«ãŒã«ã¯ããŒã¿ã¢ãã«ãšæ¥åããã»ã¹ãããŒã®æšªã«çœ®ãã¹ãã§ããããããã°ããŒã å šå¡ã APIãWeb UIãã¢ãã€ã«ã§åãæ¯ãèããå®è£ ã§ããŸãã
ããããã¢ãããŒããšããããã®ä¿èšŒ
ãè«æ±æžçªå·ä»ããã®è©±ã«ãªããšãå€ãã®äººãäºã€ã®ç°ãªãç®çïŒ(1) åãçªå·ãäºåºŠçæããªãã(2) æ¬ çªãåºããªãïŒãæ··åããŸããã»ãšãã©ã®ã·ã¹ãã ã¯æåã®ç®çãç°¡åã«ä¿èšŒã§ããŸããäºã€ç®ã¯ãã£ãšé£ããããã©ã³ã¶ã¯ã·ã§ã³å€±æããã©ããæŸæ£ãã¬ã³ãŒãç¡å¹åã®ãã³ã«æ¬ çªãçãåŸãŸãã
ã¢ãããŒã 1ïŒããŒã¿ããŒã¹ã®ã·ãŒã±ã³ã¹ïŒé«éã§äžæïŒ
PostgreSQL ã® sequence ã¯ãè² è·äžã§ãäžæã§å¢å ããçªå·ãææ©ãæäŸããæãã·ã³ãã«ãªæ¹æ³ã§ããããŒã¿ããŒã¹ã¯åæå®è¡ã«åŒ·ãã倿°ã®ãŠãŒã¶ãŒãåæã«ã¬ã³ãŒããäœãå Žåã§ãã·ãŒã±ã³ã¹å€ãéããã«æž¡ããŠãããŸãã
åŸããããã®ïŒäžææ§ãšïŒã»ãŒïŒå¢å é ãåŸãããªããã®ïŒæ¬ çªã®äžçºçãæ¿å ¥ã倱æããåŸã«çªå·ãå²ãåœãŠãããŠããã°ããã®çªå·ã¯âæ¶è²»âãããæ¬ çªã«ãªããŸãã
ã¢ãããŒã 2ïŒäžæå¶çŽïŒãªãã©ã€ïŒããŒã¿ããŒã¹ã«æ±ºå®ãä»»ããïŒ
ã¢ããªåŽã§åè£çªå·ãçæããŠä¿åããäžæå¶çŽã§è¡çªãåŒŸãæ¹æ³ã§ããè¡çªãèµ·ãããæ°ããçªå·ã§ãªãã©ã€ããŸãã
äœãåæå®è¡ãªãæ©èœããŸãããé«è² è·ã§ã¯ãªãã©ã€ãå€çºããŠãã©ã³ã¶ã¯ã·ã§ã³å€±æããããã°ãé£ããã¹ãã€ã¯ãçãããšããããŸããæ¬ çªãªããä¿èšŒããã«ã¯å³æ ŒãªäºçŽã«ãŒã«ãšçµã¿åãããå¿ èŠããããè€éããå¢ããŸãã
ã¢ãããŒã 3ïŒããã¯ä»ãã®ã«ãŠã³ã¿è¡ïŒã®ã£ããã¬ã¹ãç®æãïŒ
æ¬ çªãæ¬æ°ã§é¿ããããªããå°çšã®ã«ãŠã³ã¿ããŒãã«ïŒåã¹ã³ãŒãããšã«äžè¡ïŒã䜿ãããã®è¡ããã©ã³ã¶ã¯ã·ã§ã³å ã§ããã¯ããŠã€ã³ã¯ãªã¡ã³ãããŸãã
ãããéåžžã®ããŒã¿ããŒã¹èšèšã§ã®ã£ããã¬ã¹ã«æãè¿ãæ¹æ³ã§ãããã³ã¹ãããããŸãïŒãã¹ãŠã®æžã蟌ã¿ããã®ãããã¹ããããåŸ ã€ããã¹ã«ãŒããããèœã¡ãŸãããé·ããã©ã³ã¶ã¯ã·ã§ã³ãã¿ã€ã ã¢ãŠãããããããã¯ã®ãªã¹ã¯ãé«ãŸããŸãã
ã¢ãããŒã 4ïŒå¥ãµãŒãã¹ã«ããäºçŽïŒç¹æ®ã±ãŒã¹åãïŒ
çªå·çºè¡ãå¥ãµãŒãã¹ã«éäžãããããšã§ãè€æ°ã®ã¢ããªãããŒã¿ããŒã¹ããŸãããã«ãŒã«ãçµ±äžã§ããŸããè€æ°ã®ã·ã¹ãã ãçªå·ãçºè¡ããŠããçµ±åã§ããªãç¶æ³ã§æå¹ã§ãã
ãã ãéçšäžã®ãªã¹ã¯ãå¢ããŸãïŒå¥ã®ãµãŒãã¹ãæ£ãããé«å¯çšã«ããã€äžè²«ããŠåãããã°ãªããŸããã
å®åçã«èãããšæ¬¡ã®ããã«æŽçã§ããŸãïŒ
- ã·ãŒã±ã³ã¹ïŒäžæãéããæ¬ çªã¯èš±å®¹ãã
- äžæïŒãªãã©ã€ïŒäžæãäœè² è·ã§ã¯ç°¡åãé«è² è·ã§ã¯ã¹ã©ãã·ã³ã°ãåŸã
- ããã¯ä»ãã«ãŠã³ã¿è¡ïŒã®ã£ããã¬ã¹ã«ã§ãããé«è² è·æã¯é ããªã
- å¥ãµãŒãã¹ïŒè€æ°ã·ã¹ãã ã§æè»ã ãæãè€éã§æ éã¢ãŒããå¢ãã
AppMaster ã®ãããªããŒã³ãŒãããŒã«ã§æ§ç¯ããå Žåãéžæè¢ã¯åãã§ãïŒæçµçãªæ£ããã¯ããŒã¿ããŒã¹ã®å¶çŽãšãã©ã³ã¶ã¯ã·ã§ã³ã«å§ããã¹ãã§ãã¢ããªããžãã¯ã¯ãªãã©ã€ãåããããããšã©ãŒã¡ãã»ãŒãžã§è£å©ãã圹å²ã§ãã
ã¹ããããã€ã¹ãããïŒã·ãŒã±ã³ã¹ãšäžæå¶çŽã§éè€ãé²ã
éè€é²æ¢ãæåªå ïŒæ¬ çªã¯èš±å®¹ããïŒãªããæãç°¡æœã§ä¿¡é Œã§ãããã¿ãŒã³ã¯ïŒå éšããŒã¯ããŒã¿ããŒã¹çæã«ãã顧客åãã®è¡šç€ºçªå·ã¯äžæå¶çŽã§ä¿è·ããããšã§ãã
äºã€ã®æŠå¿µãåé¢ããŸããå éšçµåã»ç·šéã»ãšã¯ã¹ããŒãçšã«ããŒã¿ããŒã¹çæã® IDïŒidentity/sequenceïŒã䜿ããinvoice_no ã ticket_no ã¯è¡šç€ºçšã®å¥ã«ã©ã ãšããŠæ±ããŸãã
PostgreSQL ã«ãããå®çšçãªèšå®äŸ
次ã«ç€ºãäžè¬ç㪠PostgreSQL ã®æ¹æ³ã¯ããæ¬¡ã®çªå·ãããžãã¯ãããŒã¿ããŒã¹å ã«çœ®ããåæå®è¡ãæ£ããæ±ããŸãã
-- Internal, never-shown primary key
create table invoices (
id bigint generated always as identity primary key,
invoice_no text not null,
created_at timestamptz not null default now()
);
-- Business-facing uniqueness guarantee
create unique index invoices_invoice_no_uniq on invoices (invoice_no);
-- Sequence for the visible number
create sequence invoice_no_seq;
衚瀺çšçªå·ã¯æ¿å
¥æã«çæããŸãïŒselect max(invoice_no) + 1 ã®ãããªããæ¹ã¯é¿ããïŒãäžã€ã®ã·ã³ãã«ãªãã¿ãŒã³ã¯ INSERT ã®äžã§ã·ãŒã±ã³ã¹å€ããã©ãŒãããããæ¹æ³ã§ãïŒ
insert into invoices (invoice_no)
values (
'INV-' || lpad(nextval('invoice_no_seq')::text, 8, '0')
)
returning id, invoice_no;
50 人ãåæã«ãè«æ±æžãäœæãããŠããåæ¿å ¥ã¯ç°ãªãã·ãŒã±ã³ã¹å€ãåŸãã®ã§äžæã€ã³ããã¯ã¹ãéè€ãé²ããŸãã
è¡çªãèµ·ãããšãã®å¯Ÿå¿
ãã¬ãŒã³ãªã·ãŒã±ã³ã¹ã§ã¯è¡çªã¯çšã§ããè¡çªãèµ·ãããããªãã®ã¯ã幎床ããšã«ãªã»ããããããããã³ãããšã«åãããããŠãŒã¶ãŒãç·šéã§ããçªå·ãèš±ãããšãã£ã远å ã«ãŒã«ãå ããå Žåã§ããã ããããäžæå¶çŽã¯éèŠã§ãã
ã¢ããªåŽã§ã¯ãäžæå¶çŽéåãå°ããªãªãã©ã€ã«ãŒãã§åŠçããŸããåçŽãã€äžéãèšãããªãã©ã€æ¹éã䜿ã£ãŠãã ããïŒ
- INSERT ã詊ã¿ã
- invoice_no ã«å¯Ÿããäžæéåãè¿ã£ãŠãããå詊è¡ãã
- å°ããªåæ°ã ãå詊è¡ãã倱æãããåããããããšã©ãŒã衚瀺ãã
ããã¯éåžžããŸãåããŸãããªãã©ã€ãçºçããã®ã¯ç°åžžæã®ã¿ã§ãäºã€ã®ã³ãŒããã¹ãåããã©ãŒãããçªå·ãçæãããããªçããã±ãŒã¹ã ãã§ãã
ã¬ãŒã¹ãŠã£ã³ããŠãå°ããä¿ã€
çªå·ã UI åŽã§èšç®ããããå ã«èªã¿åã£ãŠããæ¿å ¥ãããããªäºçŽæ¹åŒã¯é¿ããŠãã ãããçªå·çæã¯ããŒã¿ããŒã¹æžã蟌ã¿ã«æ¥µåè¿ãå Žæã§è¡ããŸãã
AppMaster ãš PostgreSQL ãçµã¿åããããªããData Designer ã§ id ã identity primary key ã«èšå®ããinvoice_no ã«äžæå¶çŽãä»ããcreate ãããŒå ã§ invoice_no ãçæããŠæ¿å ¥ãšäžç·ã«è¡ãããã«ããŸããããããããšã§ããŒã¿ããŒã¹ãçå®ã®ãœãŒã¹ãšãªããåæå®è¡åé¡ã¯ PostgreSQL ã®åŸæåéã§åŠçãããŸãã
ã¹ããããã€ã¹ãããïŒè¡ããã¯ã§ã®ã£ããã¬ã¹ãªã«ãŠã³ã¿ãäœã
æ¬åœã«æ¬ çªãé¿ãããå Žåããã©ã³ã¶ã¯ã·ã§ãã«ãªã«ãŠã³ã¿ããŒãã«ãšè¡ããã¯ã䜿ããŸããèãæ¹ã¯åçŽã§ãïŒç¹å®ã¹ã³ãŒãã®æ¬¡çªå·ãåãã®ã¯åæã«äžã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã ãã«ããé çªã©ããçªå·ãæž¡ãããã«ããŸãã
ãŸãã¹ã³ãŒããæ±ºããŸããå€ãã®ããŒã ã¯äŒç€Ÿããšã幎床ããšãã·ãªãŒãºããšã«å¥ã ã®ã·ãŒã±ã³ã¹ãå¿ èŠã§ããã«ãŠã³ã¿ããŒãã«ã¯åã¹ã³ãŒãã®æåŸã«äœ¿ãããçªå·ãä¿åããŸãã
PostgreSQL ã®è¡ããã¯ã䜿ã£ãå®çšãã¿ãŒã³ã¯æ¬¡ã®éãã§ãïŒ
number_countersã®ãããªããŒãã«ãäœããcompany_id,year,series,last_numberãæããã(company_id, year, series)ã«ãŠããŒã¯ããŒã匵ãã\n2. ããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³ãéå§ããã\n3.SELECT last_number FROM number_counters WHERE ... FOR UPDATEã§è©²åœè¡ãããã¯ããã\n4.next_number = last_number + 1ãèšç®ããã«ãŠã³ã¿è¡ãlast_number = next_numberã«æŽæ°ããã\n5.next_numberã䜿ã£ãŠè«æ±æžããã±ããè¡ãæ¿å ¥ããã³ãããããã
éèŠãªã®ã¯ FOR UPDATE ã§ããè² è·æã§ãéè€ã¯çºçããŸããããäºäººãåãçªå·ãåŸããããšããªããäºçªç®ã®ãã©ã³ã¶ã¯ã·ã§ã³ã¯æåãã³ããããŸãã¯ããŒã«ããã¯ãããŸã§åŸ
æ©ããŸãããã®åŸ
æ©ãã®ã£ããã¬ã¹ãåŸã代åã§ãã
æ°ããã¹ã³ãŒãã®åæå
æ°ããäŒç€Ÿã幎床ãã·ãªãŒãºãçŸãããšãã®æ¹éãå¿ èŠã§ããäžè¬çãªéžæè¢ïŒ
- äºåã«ã«ãŠã³ã¿è¡ãäœã£ãŠããïŒããšãã°ç¿å¹Žåã12æã«äœãïŒ
- å¿
èŠæã«äœæããïŒ
last_number = 0ã§æ¿å ¥ã詊ã¿ãæ¢ã«ååšããã°éåžžã®ããã¯ã»ã€ã³ã¯ãªã¡ã³ããããŒã«ãã©ãŒã«ããã¯ãã
ããŒã³ãŒãããŒã«ã§äœãå Žåããããã¯ãã€ã³ã¯ãªã¡ã³ããæ¿å ¥ãæäœãäžã€ã®ãã©ã³ã¶ã¯ã·ã§ã³å ã«ãŸãšããŠããã¹ãŠãæåããããã¹ãŠããªãã£ãããšã«ãªãããã«ããŸãã
äŸå€ã±ãŒã¹ïŒãã©ãããä¿å倱æããã£ã³ã»ã«ãç·šé
å€ãã®çªå·ä»ããã°ã¯æ··æ²ãšããéšåã«çŸããŸãïŒæçš¿ãããªããã©ãããä¿åã倱æãããã®ãè«æ±æžã®ç¡å¹åã誰ããçªå·ãèŠãåŸã®ç·šéãªã©ãåæå®å šãªçªå·ä»ããç®æããªããçªå·ããã€ãå®éã®ãã®ãã«ãªãããæç¢ºã«å®ããå¿ èŠããããŸãã
æå€§ã®æ±ºæã¯ã¿ã€ãã³ã°ã§ãã誰ãããæ°èŠè«æ±æžããã¯ãªãã¯ããç¬éã«çªå·ãå²ãåœãŠããšãæŸæ£ããããã©ããããæ¬ çªãçããŸããè«æ±æžã確å®ïŒpostedïŒissued ãªã©ïŒãããšãã«ã®ã¿çªå·ãå²ãåœãŠãã°ãçªå·ã¯ããã¿ã€ãã§èª¬æãããããªããŸãã
倱æãããŒã«ããã¯ãæåŸ ãšããŒã¿ããŒã¹æåã§é£ãéãããšããããããŸããæšæºçãªã·ãŒã±ã³ã¹ã§ã¯ãäžåºŠçªå·ãåããããšãã©ã³ã¶ã¯ã·ã§ã³ããã®åŸå€±æããŠãçªå·ã¯æ¶è²»ãããŸããããã¯æ£åžžãã€å®å šãªåäœã§ããæ¬ çªãçã¿ãŸããæ¬åœã«æ¬ çªãèš±ããªãæ¹éãªããçªå·ã¯æçµã¹ãããã§ã®ã¿å²ãåœãŠããã©ã³ã¶ã¯ã·ã§ã³ãã³ããããããšãã«ã¯ãããŠç¢ºå®ããå¿ èŠããããŸããéåžžã¯åäžã®ã«ãŠã³ã¿è¡ãããã¯ããæçµçªå·ãæžã蟌ãã§ã³ãããããèšèšã«ãªããŸãã
ãã£ã³ã»ã«ãç¡å¹åã§çªå·ãåå©çšããŠã¯ãããŸãããçªå·ãšå±¥æŽã¯ãã®ãŸãŸæ®ããã¹ããŒã¿ã¹ã倿ŽããŠçç±ãèšé²ããŸããç£æ»äººã顧客ã¯èšæ£ããã£ããšããå±¥æŽãä¿ãããããšãæåŸ ããŸãã
ç·šéã¯ããåçŽã§ãïŒçªå·ãå€éšã«èŠããŠããŸã£ãããããã¯æä¹ çãªãã®ãšããŠæ±ããŸããå ±æããšã¯ã¹ããŒããå°å·ãããåŸã§è«æ±æžããã±ããã®çªå·ãæžãæããŠã¯ãããŸãããèšæ£ãå¿ èŠãªãæ°ããããã¥ã¡ã³ããçºè¡ããŠå ã®ãã®ãåç §ããïŒäŸïŒã¯ã¬ãžããããŒãã眮æããã¥ã¡ã³ãïŒã¹ãã§ãã
å€ãã®ããŒã ãæ¡ãå®çšçãªã«ãŒã«ïŒ
- ãã©ããã¯æçµçªå·ãæããªãïŒå éš ID ããDRAFTãã䜿ãïŒ
- çªå·ã¯ãPost/Issueããªã©ã®ç¢ºå®æã«åäžãã©ã³ã¶ã¯ã·ã§ã³å ã§å²ãåœãŠã
- ç¡å¹åããã£ã³ã»ã«ã¯çªå·ãä¿æããæç¢ºãªã¹ããŒã¿ã¹ãšçç±ãä»ãã
- å°å·ïŒã¡ãŒã«éä¿¡æžã¿ã®çªå·ã¯å€æŽããªã
- ã€ã³ããŒãã¯å ã®çªå·ãä¿æããã«ãŠã³ã¿ãæå€§å€ã®æ¬¡ã«æŽæ°ãã
ãã€ã°ã¬ãŒã·ã§ã³ãã€ã³ããŒãã¯æ éã«æ±ã£ãŠãã ãããæ¢åã®è«æ±æžçªå·ããã®ãŸãŸç§»è¡ããŠãããã«ãŠã³ã¿ãã€ã³ããŒãæžã¿ã®æå€§å€ä»¥éã§éå§ããã®ãäžè¬çã§ãããã©ãŒããããæ··åšããå Žåã¯ã衚瀺çªå·ããã®ãŸãŸä¿åããå éšããŒãå¥ã«æã€ã®ãå®å šã§ãã
äŸïŒãã«ããã¹ã¯ã¯é«éã§ãã±ãããäœããå€ãã¯ãã©ããã§ãããšãŒãžã§ã³ãããéä¿¡ããæŒãããšãã«ã®ã¿ãã±ããçªå·ãå²ãåœãŠãã°ãæŸæ£ãã©ããã§çªå·ãç¡é§ã«ããŸãããAppMaster ã®ãããªããŒã³ãŒãããŒã«ã§ãåãèãæ¹ãé©çšãããŸãïŒãã©ããã¯å ¬éçªå·ãªãã§ä¿åãããsubmitãããžãã¹ããã»ã¹ã®äžã§æçµçªå·ãçæããŠç¢ºå®ãããŸãã
éè€ãäºæãã¬æ¬ çªãåŒãèµ·ãããããããã¹
ã»ãšãã©ã®çªå·ä»ãåé¡ã¯äžã€ã®åçŽãªèãæ¹ããæ¥ãŸãïŒçªå·ã衚瀺çšã®å€ãšããæ±ã£ãŠããªãããšã§ããè€æ°ã®äººãåæã«ä¿åããå Žåãæ¬¡ã®çªå·ã決ããæç¢ºãªåäžã®å Žæãšã倱ææã®äžæãªã«ãŒã«ãå¿ èŠã§ãã
å€å
žçãªééãã¯ã¢ããªã±ãŒã·ã§ã³ã³ãŒãå
ã§ SELECT MAX(number) + 1 ã䜿ãããšã§ããåäœã§ã¯åé¡ãªãèŠããŸãããäºã€ã®ãªã¯ãšã¹ããã©ã¡ãã MAX ãèªã¿åããšãåãæ¬¡å€ãçæããŠããŸããŸãããã§ãã¯ããŠãªãã©ã€ããããã«ããŠããããŒã¯ãã©ãã£ãã¯æã«äœèšãªè² è·ãã¹ãã€ã¯ãäœãããšããããŸãã
å¥ã®å žåäŸã¯ã¯ã©ã€ã¢ã³ãåŽïŒãã©ãŠã¶ãã¢ãã€ã«ïŒã§çªå·ãçæããŠããä¿åããããšã§ããã¯ã©ã€ã¢ã³ãã¯ä»ã®ãŠãŒã¶ãŒã®æäœãç¥ããªããããä¿åã倱æãããšãã«å®å šã«çªå·ãäºçŽã§ããŸãããã¯ã©ã€ã¢ã³ãçæã®çªå·ã¯ãDraft 12ãã®ãããªäžæã©ãã«ã«ã¯äœ¿ããŸãããæ£åŒãªè«æ±æžããã±ãã ID ã«ã¯åããŸããã
PostgreSQL ã®ã·ãŒã±ã³ã¹ãæ¬ çªãªãã§ãããšæåŸ ããŠããŸãã®ã誀ãã§ããã·ãŒã±ã³ã¹ã¯äžææ§ã®ããã«èšèšãããŠããããã©ã³ã¶ã¯ã·ã§ã³ã®ããŒã«ããã¯ã ID ã®ããªãã§ãããããŒã¿ããŒã¹åèµ·åã§çªå·ãé£ã¶ããšããããŸããèŠä»¶ããéè€ãªããã§ããã°ã·ãŒã±ã³ã¹ãšäžæå¶çŽã®çµã¿åãããéåžžã¯æé©ã§ããæ¬åœã«ãæ¬ çªãªãããå¿ èŠãªãè¡ããã¯çã®å¥ãã¿ãŒã³ãšã¹ã«ãŒãããã®ãã¬ãŒããªããåãå ¥ããå¿ èŠããããŸãã
ããã¯ç¯å²ãåºããããšé广ã«ãªãããšããããŸããå šãŠã®çªå·ä»ãã«å¯ŸããŠåäžã®ã°ããŒãã«ããã¯ã䜿ããšããã¹ãŠã®äœæåŠçãçŽååãããäŒç€Ÿãå°ç¹ãããã¥ã¡ã³ãã¿ã€ãããšã«åããããã¯ãã®äœæ¥ãŸã§é ããªãããŠãŒã¶ãŒãä¿åã§ãããŸã«ãè©°ãŸãããã«æããåå ã«ãªããŸãã
å®è£ æã«ãã§ãã¯ãã¹ããã¹ïŒ
MAX + 1ã䜿ã£ãŠããŠãããŒã¿ããŒã¹ã¬ãã«ã®äžæå¶çŽããªã- æçµçªå·ãã¯ã©ã€ã¢ã³ãåŽã§çæããåŸã§ç«¶åããçŽãããšããã
- PostgreSQL ã·ãŒã±ã³ã¹ãæ¬ çªãªãã ãšæåŸ ããæ¬ çªããšã©ãŒæ±ãããŠããŸã
- ãã¹ãŠãäžã€ã®å ±æã«ãŠã³ã¿ã§ããã¯ããåå²å¯èœãªã«ãŠã³ã¿ã䜿ããªã
- 1 ãŠãŒã¶ãŒã§ãããã¹ãããŠããããã¬ãŒã¹æ¡ä»¶ãæ¬çªã§åºã
å®çšçãªãã¹ãæ¡ïŒäžŠåã§ 100ã1,000 ã¬ã³ãŒããäœæããéè€ãäºæããªãæ¬ çªããªãã確èªãããAppMaster ã®ãããªããŒã«ã§ããæçµçªå·å²ãåœãŠã¯ãµãŒããŒãµã€ãã®åäžãã©ã³ã¶ã¯ã·ã§ã³å ã§è¡ããUI ãããŒã«åæ£ãããªãããã«ããŸãã
åºè·åã®ç°¡åãã§ãã¯ãªã¹ã
è«æ±æžããã±ããã®çªå·ä»ãããªãªãŒã¹ããåã«ãè² è·ã®é«ãç¶æ³ã§å€±æããããéšåãç°¡åã«ç¹æ€ããŠãã ãããç®çã¯ã·ã³ãã«ã§ãïŒåã¬ã³ãŒããããžãã¹çªå·ãã¡ããã©äžã€æã¡ã50 人ãåæã«ãäœæããæŒããŠãã«ãŒã«ãå®ãããããšã
åºè·åã®å®çšãã§ãã¯ãªã¹ãïŒ
- ããžãã¹çªå·ãã£ãŒã«ãã«ããŒã¿ããŒã¹ã¬ãã«ã®äžæå¶çŽãããããšã確èªããïŒUI ã®ãã§ãã¯ã ãã§ã¯äžååïŒãããã¯æåŸã®é²è¡ç·ã§ãã
- çªå·ãã¬ã³ãŒããä¿åããã®ãšåãããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³å ã§å²ãåœãŠãããŠããããšã確èªãããçªå·å²ãåœãŠãšä¿åãè€æ°ã®ãªã¯ãšã¹ãã«åãããŠãããšããããéè€ãåºãŸãã
- æ¬ çªã蚱容ããªããªããã¬ã³ãŒãã確å®ãããšãïŒãã©ããã§ã¯ãªããçºè¡æãªã©ïŒã«ã®ã¿çªå·ãå²ãåœãŠãããã«ããããã©ãããæŸæ£ãæ¯æã倱æãæ¬ çªã®äž»ãªåå ã§ãã
- çšãªç«¶åã®ããã«ãªãã©ã€æŠç¥ãçšæãããè¡ããã¯ãã·ãŒã±ã³ã¹ã䜿ã£ãŠããŠããçŽååãšã©ãŒããããããã¯ãäžæéåãçºçããããšã¯ããåŸãŸããçãããã¯ãªãä»ãã®åçŽãªãªãã©ã€ã§ååãªããšãå€ãã§ãã
- UIãå ¬é APIããã«ã¯ã€ã³ããŒããªã©ããã¹ãŠã®å ¥åçµè·¯ã§ 20ã100 䞊åã§äœæããè² è·ãã¹ããè¡ããããŒã¹ããé ããããã¯ãŒã¯ãäºééä¿¡ã®æ··åšãªã©çŸå®çãªãã¿ãŒã³ã§è©Šãã
ã»ããã¢ãããæ€èšŒããç°¡åãªæ¹æ³ã¯ãå¿ãããã«ããã¹ã¯ã®ç¬éãã·ãã¥ã¬ãŒãããããšã§ããäºäººã®ãšãŒãžã§ã³ãããæ°ãããã±ããããã©ãŒã ãéããäžæ¹ã Web ã¢ããªããéä¿¡ããåæã«ã€ã³ããŒããžã§ããã¡ãŒã«åä¿¡ç®±ãããã±ãããæ¿å ¥ãããå®è¡åŸã«å šçªå·ãäžæã§é©åãªåœ¢åŒãã倱æãå端ãªä¿åãæ®ããŠããªãã確èªããŸãã
AppMaster ã§ã¯ãŒã¯ãããŒãäœãå Žåãåãååã§ãïŒçªå·å²ãåœãŠã¯ããŒã¿ããŒã¹ãã©ã³ã¶ã¯ã·ã§ã³å ã«åããPostgreSQL ã®å¶çŽã«é ŒããUI ãš API äž¡æ¹ã§åãæ¯ãèãããã¹ãããŠãã ãããæ¬çªã®ãŠãŒã¶ãŒãå¢ãã忥ã«é©ããªãããã«ããã§æ€èšŒããŸãã
äŸïŒæ··éãããã«ããã¹ã¯ã®ãã±ãããšæ¬¡ã«ããã¹ãããš
ãµããŒããã¹ã¯ã§ã¯ãšãŒãžã§ã³ãã Web ã¢ããªã§ãã±ãããäœæãã€ã€ãçµ±åããã£ãããã¡ãŒã«ãããã±ãããåæã«äœãããšããããŸããç㯠T-2026-000123 ã®ãããªãã±ããçªå·ãæåŸ ããåçªå·ãäžã€ã®ãã±ããã«å¯Ÿå¿ããããšãæã¿ãŸãã
çŽ æŽãªæ¹æ³ã¯ãæåŸã®ãã±ããçªå·ãèªã¿åã +1 ããŠä¿åãããã§ãããè² è·äžã§ã¯äºã€ã®ãªã¯ãšã¹ããåãæåŸã®çªå·ãèªã¿åã£ãŠããŸããäž¡è ãåãæ¬¡çªå·ãèšç®ããŠéè€ãèµ·ããŸãã倱æåŸã«ãªãã©ã€ã§çŽãããšãããšãæå³ã®ãªãæ¬ çªãçããã¡ã§ãã
ããŒã¿ããŒã¹ã«äžæå¶çŽãå ¥ããã°ãã¢ããªåŽãçŽ æŽã§ãéè€ã¯æ¢ããããŸããticket_number ã«ã©ã ã« UNIQUE ã远å ããäºã€ã®ãªã¯ãšã¹ããåãçªå·ã詊ã¿ããšãã«ã¯äžæ¹ã倱æããªãã©ã€ã§ããŸãããããè«æ±æžçªå·ä»ãå šè¬ã«ãããæ žå¿ã§ãïŒäžææ§ã¯ UI ã§ãªãããŒã¿ããŒã¹ã«åŒ·å¶ãããã
ã®ã£ããã¬ã¹ãæ±ãããªãã¯ãŒã¯ãããŒãå€ããå¿ èŠããããŸããæçµçªå·ããã±ããäœææïŒãã©ããæïŒã«å²ãåœãŠãã®ã§ã¯ãªããç¢ºå®æã«å²ãåœãŠãããã«ããŸããããããã°æŸæ£ãã©ãããçªå·ãæ¶è²»ããŸããã
åçŽãªããŒãã«èšèšäŸïŒ
- tickets: id, created_at, status (Draft, Open, Closed), ticket_number (nullable), finalized_at
- ticket_counters: key (äŸ "tickets_2026"), next_number
AppMaster ã§ã¯ Data Designer ã§ãããã¢ãã«åããBusiness Process Editor ã§æ¬¡ã®ããã«çµã¿ãŸãïŒ
- Create Ticket: status=Draftãticket_number ãªãã§ãã±ãããæ¿å ¥
- Finalize Ticket: ãã©ã³ã¶ã¯ã·ã§ã³éå§ãã«ãŠã³ã¿è¡ãããã¯ãticket_number ãèšå®ã next_number ãã€ã³ã¯ãªã¡ã³ãããŠã³ããã
- ãã¹ã: åæã«äºã€ã® "Finalize" ã¢ã¯ã·ã§ã³ãèµ°ãããŠãéè€ãçºçããªãããšã確èªãã
次ã«ããããšïŒã«ãŒã«ïŒäžæã®ã¿ãæ¬åœã«æ¬ çªãªããªã®ãïŒã決ãããæ¬ çªã蚱容ã§ãããªããããŒã¿ããŒã¹ã·ãŒã±ã³ã¹ïŒäžæå¶çŽã§ååã§æµããã·ã³ãã«ã§ããæ¬ çªãªããå¿ èŠãªããçªå·å²ãåœãŠã確å®ã¹ãããã«ç§»ãããã©ãããæ£ããæ±ããè€æ°ãšãŒãžã§ã³ãã API ã®ããŒã¹ãã§è² è·ãã¹ãããŠããæ¬çªãžé²ãã§ãã ããã


