ããŒã¿ããŒã¹ã¹ããŒãã倿Žããããã«å€ãã®æäœãåæã«å®è¡ããããšããµãŒãã¹ã¯é²é³æã«æ£ããæ©èœããŸããã éçºè
ã®Vladimir Kolyasinskyã¯ãPostgreSQLã§ã®æäœã«é·æããã¯ãå¿
èŠãªããšãšãYandex.ConnectããŒã ããã®ãããªæäœäžã«ãµãŒãã¹ãã»ãŒå®å
šã«æžã蟌ã¿å¯èœã§ããããšãä¿èšŒããæ¹æ³ã«ã€ããŠèª¬æããŸããã ããã«ãèšè¿°ãããããã»ã¹ã®äžéšãèªååããããã«èšèšãããDjangoã®ã©ã€ãã©ãªã«ã€ããŠãåŠç¿ããŸãã
è² è·ã倧ãããæ°åã®RPSããããæ°åã§ã®ããŠã³ã¿ã€ã ã¯ãã¡ããã®ããšã蚱容ç¯å²ãè¶
ããŠããŸãã ãŠãŒã¶ãŒãæ°ä»ããªããã¡ã«ç§»è¡ãè¡ãå¿
èŠããããŸãã ãããŠããã®ãããªè·ç©ããããšãæã®4æã«èµ·ããŠãè·ç©ããªããšãã«äœãã転ãããåã³å¯ãã®ã¯äžå¯èœã§ã-è·ç©ã¯24æéäŒã¿ãŸãã
-ããã°ãã¯ïŒ ç§ã®ååã¯ãŠã©ãžããŒã«ã§ããYandexã§5幎éåããŠããŸãã éå»2幎éã瀟å
ãµãŒãã¹ãšçµç¹åããµãŒãã¹ãéçºããŠããŸããã
ãããã®ãµãŒãã¹ãçµç¹ã«ãšã£ãŠäœã§ãããã«ã€ããŠå°ãã ç§ãã¡ã¯é·ãéã倿°ã®å
éšãµãŒãã¹ã䜿çšããŠããŸããïŒããŒã¿ã®ä¿åãšäº€æã®ããã®ãŠã£ããååãšã®è¿
éãªã³ãã¥ãã±ãŒã·ã§ã³ã®ããã®ã¡ãã»ã³ãžã£ãŒãäœæ¥ããã»ã¹ãæŽçããããã®ãã©ãã«ãŒãå
å€ã®èª¿æ»ãå®è¡ããããã®ãã©ãŒã ãããã³ä»ã®å€ãã®ãµãŒãã¹ã
ãã°ããåã«ãç§ãã¡ã®ãµãŒãã¹ã¯ã¯ãŒã«ã§ãããYandexå
ã ãã§ãªããå€éšã®äººã
ã«ã圹ç«ã€ãšå€æããŸããã ãã¡ã€ã³ã®ã¡ãŒã«ãªã©ã®æ¢åã®å€éšãµãŒãã¹ã远å ããŠãçµ±åYandex.Connectãã©ãããã©ãŒã ã«ããããå°å
¥ãå§ããŸããã

çŸåšããã©ãŒã ãã¶ã€ããšWikiãéçºããŠããŸãã 䜿çšãããã¹ã¿ãã¯ã¯ãäž»ã«2çªç®ãš3çªç®ã®ããŒãžã§ã³ã§Pythonã§èšè¿°ããããµãŒãã¹ã§ãã Django 1.9-1.11ã ããŒã¿ããŒã¹ãšããŠã¯ãã»ãšãã©ãPostgreSQLã§ãã ãŸãããããŒã«ãŒãšããŠMongoDBãšSQSã䜿çšããCeleryã§ãã ããã¯ãã¹ãŠDockerã§æ©èœããŸãã
ç§ãã¡ãçŽé¢ããŠããåé¡ã«ç§»ããŸãããã ãµãŒãã¹ã¯äººæ°ããããæ¯æ¥æ°åäžäººã䜿çšããããŒã¿ãèç©ãããããŒãã«ããŸããŸãå¢ããŠãããæéã®çµéãšãšãã«ãæšæ¥ãŠãŒã¶ãŒã«æ°ä»ãããã«å®è¡ãããŠããããŒã¿ããŒã¹ã¹ããŒãã倿Žããå€ãã®æäœãããµãŒãã¹ã®éåžžã®æäœã劚ãå§ããŠããŸãã
仿¥ã¯ããã®ãããªç¶æ³ã«å¯ŸåŠããæ¹æ³ãšãèªã¿åãããã³æžã蟌ã¿ãµãŒãã¹ã®é«å¯çšæ§ãå®çŸããæ¹æ³ã«ã€ããŠèª¬æããŸãã
æåã«ãPostgreSQLã§ã®æäœã«ããŒãã«ã®é·ãããã¯ãå¿
èŠãªãã®ãèããŠã¿ãŸãããã ããã¯ãšã¯ãããŒãã«ã®éåžžã®æäœã劚ããããããã¿ã€ãã®ããã¯ãæå³ããŸã-æžã蟌ã¿ãšèªã¿åãã®äž¡æ¹ãé²ãæä»çã¢ã¯ã»ã¹ããŸãã¯æžã蟌ã¿ã®ã¿ãé²ã匱ãããã¯ã¬ãã«ã§ãã
次ã«ããã®ãããªæäœäžã«ããã¯ãåé¿ããæ¹æ³ã«ã€ããŠèª¬æããŸãã æ¬¡ã«ãPostgreSQLã®æäœãæåã«é«éã§ãé·ãããã¯ãå¿
èŠãšããªãããšã«ã€ããŠèª¬æããŸãã æåŸã«ãzero_downtime_migrationsã©ã€ãã©ãªã«ã€ããŠèª¬æããŸããããã¯ãé·ãããã¯ãåé¿ããããã«åè¿°ã®ææ³ã®äžéšãèªååããããã«äœ¿çšããŸãã
é·ãããã¯ãå¿
èŠãªæäœïŒ

ã€ã³ããã¯ã¹ãäœæããŸãã ããã©ã«ãã§ã¯ãããŒãã«å
ã®èªã¿åãæäœã¯ãããã¯ãããŸãããããã¹ãŠã®æžãèŸŒã¿æäœã¯ã€ã³ããã¯ã¹ãäœæãããéãããã¯ãããŸã;ãããã£ãŠããµãŒãã¹ã¯èªã¿åãå°çšã«ãªããŸãã
ãŸãããã®ãããªæäœã«ã¯ãPostgreSQLãããŒãã«å
šäœãäžæžããããã®éã¯èªã¿åããšæžã蟌ã¿ã®äž¡æ¹ã§ãããã¯ããããããããã©ã«ãå€ã§æ°ããåã远å ããããšãå«ãŸããŸãã ããã«ããã¹ãŠã®ã€ã³ããã¯ã¹ãäžæžããããŸãã
åã®ã¿ã€ãã®å€æŽã«ã€ããŠ-åæ§ã®ããšãèµ·ããããã¬ãŒããåã³äžæžããããŸãã ããã¯ã倧ããªããŒãã«ã§é·æéãããã ãã§ãªããçæéã§ããŒãã«ãå æãã空ãã¡ã¢ãªã®æå€§2åã®éãå¿
èŠãšããããšã«æ³šæããŠãã ããã
ãŸããVACUUM FULLæäœã«ã¯ã以åã®æäœãšåãã¬ãã«ã®ããã¯ãå¿
èŠã§ã-ããã¯ã¢ã¯ã»ã¹å°çšã§ãã VACUUM FULLã¯ãããŒãã«ã«å¯Ÿãããã¹ãŠã®èªã¿åãããã³æžãèŸŒã¿æäœããããã¯ããŸãã
æåŸã®2ã€ã®æäœã§ã¯ãäžæã®ããããã£ãåã«è¿œå ããäžè¬ã«CONSTRAINTã远å ããŸãã ãŸããããŒã¿æ€èšŒäžã¯ããã¯ãå¿
èŠãšããŸãããå
éšã§ããŒãã«ãäžæžãããªãããã以åã«æ€èšãããã®ãããã¯ããã«çãæéã§æžã¿ãŸãã


ã€ã³ããã¯ã¹ãäœæããŸãã ããã§ã¯éåžžã«ç°¡åã§ããCONCURRENTLYããŒã¯ãŒãã䜿çšããŠäœæã§ããŸãã éãã¯äœã§ããïŒ ãã®æäœã¯1åã§ã¯ãªãããŒãã«ãæ°åå®è¡ãããããæéãããããŸãããŸããã€ã³ããã¯ã¹ã倿Žããå¯èœæ§ã®ããçŸåšã®ãã¹ãŠã®æäœãå®äºãããŸã§åŸ
æ©ããŸãã ãŸãã倱æããå ŽåããããŸã-ããšãã°ãäžæã®ã€ã³ããã¯ã¹ãäœæãããšãã«äžææ§ã®æ¡ä»¶ã®éåãèŠã€ãã£ãå Žåã ãã®åŸãã€ã³ããã¯ã¹ã¯ç¡å¹ãšããŠããŒã¯ãããåé€ããŠåäœæããå¿
èŠããããŸãã REINDEXã³ãã³ãã¯ãéåžžã®CREATE INDEXãšåãããã«æ©èœãããããã€ãŸããæžã蟌ã¿ã®ããã«ããŒãã«ãããã¯ããããããå§ãããŸããã
ã€ã³ããã¯ã¹ã®åé€ã«ã€ããŠ-ããŒãžã§ã³9.3以éã§ã¯ãã€ã³ããã¯ã¹ã®åé€äžã«ãââãã¯ãåé¿ããããã«ã€ã³ããã¯ã¹ã䞊è¡ããŠåé€ããããšãã§ããŸãããäžè¬çã«ã¯ç°¡åãªæäœã§ãã

ããã©ã«ãå€ã§æ°ããåã远å ããŠã¿ãŸãããã Djangoããã®ãããªæäœãå®è¡ãããªã©ããã®ãããªã³ãã³ããå®è¡ãããšãã«å®è¡ãããæšæºæäœã次ã«ç€ºããŸãã
ããŒãã«ãäžæžãããªãããã«æžãæããã«ã¯ã©ãããã°ããã§ããïŒ æåã«ã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ãããã©ã«ãå€ãªãã§æ°ããåã远å ããå¥ã®ãªã¯ãšã¹ãã§ããã©ã«ãå€ã远å ããŸãã ããã®éãã¯äœã§ããïŒ æ¢åã®åã«ããã©ã«ãå€ã远å ããŠããããŒãã«å
ã®æ¢åã®ããŒã¿ã¯å€æŽãããŸããã ã¡ã¿ããŒã¿ã®ã¿ã倿ŽãããŸãã ã€ãŸãããã¹ãŠã®æ°ããè¡ã«ã€ããŠããã®ããã©ã«ãå€ã¯ãã§ã«ä¿èšŒãããŠããŸãã ãã®ã³ãã³ããå®è¡ãããæç¹ã§ããŒãã«ã«ãã£ããã¹ãŠã®æ¢åã®è¡ãæŽæ°ããããšã¯æ®ããŸãã 倧éã®ããŒã¿ãé·æéãããã¯ããªãããã«ãæ°åã³ããŒã®ãããã§è¡ãããšã
ãã¹ãŠã®ããŒã¿ãæŽæ°ããåŸãNOT NULLåãäœæããå Žåã«ã®ã¿SET NOT NULLãå®è¡ããŸãã äœæããªãå Žåã¯äœæããŸããã ãã®æ¹æ³ã«ããããã®çš®ã®å€æŽãè¡ããšãã«ããŒãã«ãäžæžãããããšãåé¿ã§ããŸãã
ãã®ãããªã³ãã³ãã®ã·ãŒã±ã³ã¹ã¯ãããŒãã«ã®ãµã€ãºãšã€ã³ããã¯ã¹ã®æ°ã«äŸåãããããéåžžã®ã³ãã³ãã®å®è¡ãããæéãããããŸããéåžžã®ã³ãã³ãã¯ããã¹ãŠã®æäœããããã¯ããè² è·ã«é¢ä¿ãªãããŒãã«ãäžæžãããŸãã ãã ããæäœäžã¯ããŒãã«ãèªã¿æžãã§ãããããããã¯ããã»ã©éèŠã§ã¯ãããŸããã ããã«ã¯é·ãæéãããããŸããããªãã¯ããã«åŸãã ãã§ããã®ã§ãã

åã®ã¿ã€ãã®å€æŽã«ã€ããŠã ãã®ã¢ãããŒãã¯ãããã©ã«ãå€ãæã€åã远å ããã®ã«äŒŒãŠããŸãã ãŸããå¿
èŠãªåã®å¥ã®åã远å ããŠãããå
ã®åã®ããŒã¿ã倿ŽããŠäž¡æ¹ã®åã«äžåºŠã«æžã蟌ãããªã¬ãŒã远å ããå¿
èŠãªããŒã¿åã®æ°ããåã«è¿œå ããŸãã ãã¹ãŠã®æ°èŠãšã³ããªã«ã€ããŠããããã®åã®äž¡æ¹ã«ããã«ç§»åããŸãã æ¢åã®ãã®ããã¹ãп޿°ããå¿
èŠããããŸãã åã®ã¹ã©ã€ãã®ããã«ãç§ãã¡ãå°ããã€è¡ãããšã¯äŒŒãŠããŸããã
ãã®åŸã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«æ®ããããªã¬ãŒãåé€ããå€ãåãåé€ããå€ãåã®ååãæ°ãããã®ã«å€æŽããŸãã ãããã£ãŠãåãçµæãåŸãããŸãããåã®ã¿ã€ãã倿ŽããŸããããããŒãã«ã®ããã¯ã¯é·ããããŸããã§ããã

äžæã®åã®è¿œå ã«ã€ããŠã ããã¯ã¯äœææã«ååŸãããŸãã äžæã®ã€ã³ããã¯ã¹ãäœæããããšã§PostgreSQLã®äžææ§ãä¿èšŒãããŠããããšãããã£ãŠããå Žåã¯ãåé¿ã§ããŸãã CONCURRENTLYã䜿çšããŠãå¿
èŠãªäžæã®ã€ã³ããã¯ã¹ãäœæã§ããŸãã ãããŠããã®ã€ã³ããã¯ã¹ãæ§ç¯ããåŸããã®ã€ã³ããã¯ã¹ã䜿çšããŠCONSTRAINTãäœæããŸãã ãã®åŸãããŒãã«ã®åæã€ã³ããã¯ã¹ã®å®çŸ©ã¯æ¶ããããŒãã«ã®å®çŸ©ã瀺ãçµæã¯ãããã2ã€ã®æäœãå®è¡ããåŸãå€ãããŸããã

ãããŠäžè¬çã«ãCONSTRAINTã远å ãããšãã ãã®ææ³ã䜿çšããŠãããŒã¿ã®ãã§ãã¯äžã®ãããã¯ãåé¿ã§ããŸãã æåã«ãããŒã¯ãŒãNOT VALIDãæå®ããŠCONSTRAINTã远å ããŸãã ããã¯ããã®CONSTRAINTãããŒãã«å
ã®ãã¹ãŠã®è¡ã«å¯ŸããŠå®è¡ãããããšãä¿èšŒãããŠããªãããšãæå³ããŸãã ãããåæã«ããã¹ãŠã®æ°ããè¡ã«å¯ŸããŠããã®CONSTRAINTã¯ãã§ã«é©çšãããŠãããå®è¡ãããªãå Žåã¯å¯Ÿå¿ããäŸå€ãã¹ããŒãããŸãã
æ¢åã®ãã¹ãŠã®å€ã®ã¿ãæ€èšŒã§ããŸããããã¯ãåå¥ã®VALIDATE CONSTRAINTã³ãã³ãã§å®è¡ã§ããåæã«ãã®ã³ãã³ããããŒãã«ã®èªã¿åããŸãã¯æžã蟌ã¿ã®ãããã«ãå¹²æžããªããªããŸãã ãã®æéã®ããŒãã«ãå©çšå¯èœã«ãªããŸãã
æåã«PostgreSQLã§è¿
éã«åäœããé·ãããã¯ãå¿
èŠãšããªãæäœïŒ

ãããã®æäœã®1ã€ã¯ãããã©ã«ãå€ãšå¶éãªãã§åã远å ããããšã§ãã ããŒãã«èªäœã¯å€æŽãããªããããã¡ã¿ããŒã¿ã®ã¿ã倿ŽãããŸãã ãŸããSELECTã®çµæãšããŠè¡šç€ºããããã¹ãŠã®NULLå€ã¯ãåºåã§åçŽã«æ··åãããŸãã
ãŸããã¡ã¿ããŒã¿ã®ã¿ã倿Žããããããæ¢åã®ã©ãã«ã«ããã©ã«ãå€ã远å ããã®ã¯ç°¡åãªæäœã§ãã ãã®æ
å ±ãå
¥åããã®ã«å¿
èŠãªæ°ããªç§ã®éãããŒãã«ãšããã¯ã¯æåéãååŸãããŸãã
ãŸããã¯ã€ãã¯ã»ããã¢ããæäœã¯SET NOT NULLã§ããããã§ã¯ã以åã«èª¬æãããããå°ãæéããããã3000äžã¬ã³ãŒãã®ããŒãã«ã«ã€ãçŽæ°ç§ããããŸãã éèŠãªå Žåã¯ããã®æéãåé¿ã§ããŸãã
åã®ååã倿Žããåã®é·ãã倿ŽããŠããåã¯äžæžããããŸããã PostgreSQLã®åãããã³äžè¬çã«å€ãã®ãšã³ãã£ãã£ãåé€ããããšãç°¡åãªæäœã§ãã

NOT NULLåã®è¿œå ã«ã€ããŠã æ€èšŒäžã®ãããã¯ãåé¿ããã«ã¯ãåè¿°ã®ã¡ãœãããå®è¡ããŸã-CHECKïŒåIS NOT NULLïŒNOT VALIDã«å¯Ÿå¿ããCONSTRAINTã远å ããå¥ã®ã³ãã³ãã§æ€èšŒããŸãã
äžè¬çãªéãã¯ããã®å¶éã¯ããŒãã«å®çŸ©ã®åã¬ãã«ã§ã¯ãªãããŒãã«ã¬ãã«ã«ååšããããšã§ãã ãã1ã€ã®éãã¯ãããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ãããããšã§ãïŒçŽ1ïŒ
ïŒã ãã®å ŽåããµãŒãã¹ã®è² è·ãé«ãå Žåãããããã³ã°ã¯çºçããŸãããæ°ç§ã®ããããã³ã°ã§ãããã©ã³ã¶ã¯ã·ã§ã³ã®å·šå€§ãªãã¥ãŒãèç©ããããµãŒãã¹ã«åé¡ãçºçããå¯èœæ§ããããŸãã

PostgreSQLã§ã®ããŒã¿ã®åé€ã¯éåžžãè¿
éãªæäœã§ããããŒã¿ã¯ããã«ã¯åé€ããããããŒãã«ã®å±æ§ã§åã®ã¿ãå€ããªã£ãŠãããšããŒã¯ãããå®éã«ããŒã¿ã¯æ¬¡ã®ããã¥ãŒã ã®éå§åŸã«ã®ã¿åé€ãããŸãã
ã©ã€ãã©ãªã«ã€ããŠè©±ããŸãããã Djangoãç§»è¡ã«ã€ããŠè©±ããŠããã äžè¬ã«ãDjangoã¯Webãã¬ãŒã ã¯ãŒã¯ã§ããPythonã®ã©ã€ãã©ãªã§ãããå
ã
ã¯ãã¥ãŒã¹ã®ãããªWebãµã€ãããã°ããäœæããããã«äœæãããŸããããã以æ¥ã倧å¹
ã«ã¢ããã°ã¬ãŒããããŠããŸãã Pythonãªããžã§ã¯ããŸãã¯ã¯ã©ã¹ã§ãããã®ããã«ãããŒã¿ããŒã¹å
ã®ã¬ã³ãŒããããŒãã«ãšéä¿¡ã§ããORMã·ã¹ãã ããããŸãã ã€ãŸããåããŒãã«ã«ã¯Pythonã®ç¬èªã®ã¯ã©ã¹ããããŸãã ãããŠãPythonã³ãŒãã«å€æŽãå ãããã€ãŸããããŒãã«ã«åãªã©ã®æ°ãã屿§ã远å ãããšãç§»è¡ã®äœæããã»ã¹äžã«Djangoã¯ãããã®å€æŽãèªèããããŒã¿ããŒã¹èªäœã«ãã©ãŒå€æŽãå ããç§»è¡ãã¡ã€ã«ãäœæããŠãããããåå²ããªãããã«ããŸãã
ã©ã€ãã©ãªã¯ããã®ãããªç§»è¡äžã«ããŒãã«ã®é·ãããã¯ãåé¿ããããã®åè¿°ã®ææ³ã®äžéšãèªååããããã«äœæãããŸããã ããŒãžã§ã³1.8ãã2.1ãŸã§ã®Djangoãããã³2.7ãã3.7ãŸã§ã®Pythonã§åäœããŸãã
ã©ã€ãã©ãªã®çŸåšã®æ©èœã«é¢ããŠãããã¯ããã¯ãªãã®ããã©ã«ãå€ãnullå¯èœãŸãã¯ç¡å¹ã®åã远å ããŠããŸããããã¯ãCONCURRENTLYã€ã³ããã¯ã¹ãäœæããã¯ã©ãã·ã¥ãããšãã«åèµ·åããæ©èœã§ãã æšæºã®Djangoå®è£
ã§ã¯ãããã©ã«ãå€ã§åã远å ãããšãããŒãã«ãããã¯ããããµã€ãºã倧ããå Žåãç§ã®çµéšã§ã¯40åã®ããã¯ã«ãªãå¯èœæ§ããããŸãã ããŒãã«ã¯ããã¯ãããŠããŸãã倿Žãã³ããŒãããŠè¡ããããŸã§åŸ
ã¡ãŸãã 30åãçµéããŸãã-ããŒã¿ããŒã¹ãžã®æ¥ç¶ãšã©ãŒããã£ããããç§»è¡ã倱æãã倿Žãã³ãããããããå床éå§ããå¿
èŠããããŸããåã³40ååŸ
æ©ããåã³ãã®æéããŒãã«ããããã¯ããŸãã

ã©ã€ãã©ãªã«ãããäžæãããå Žæããç§»è¡ãåéããããšãã§ããŸãã ã¯ã©ãã·ã¥ããŠåèµ·åãããšãã¢ã¯ã·ã§ã³ã®ããŸããŸãªãªãã·ã§ã³ããããã€ã¢ãã°ããã¯ã¹ã衚瀺ãããŸããã€ãŸããããŒã¿ã®æŽæ°ãç¶è¡ããããã«æç€ºã§ããŸãã ããã¯æé·ã®ããã»ã¹ã§ãããããéåžžã¯ããŒã¿ã®æŽæ°ã§ãã ç§»è¡ã¯ãäžæãããšããããç¶è¡ãããŸãã ãã®ãããªæäœã¯ãããŒãã«ããã¯ã䜿çšããæšæºã®æäœãããæéãããããŸãããåæã«ããã®æç¹ã§ãµãŒãã¹ã¯æäœå¯èœãªãŸãŸã§ãã

æ¥ç¶å
šäœã«ã€ããŠã ããã¥ã¡ã³ãããããŸãã ã€ãŸããDjangoããŒã¿ããŒã¹èšå®ã®ãšã³ãžã³ãã©ã€ãã©ãªã®ãšã³ãžã³ã«çœ®ãæããå¿
èŠããããŸãã ãšã³ãžã³ã䜿çšããŠæ¥ç¶ããå Žåã¯ãããŸããŸãªããã¯ã¹ã€ã³ããããŸãã

äœæ¥ã®äŸã¯ãããã©ã«ãå€ãæã€åã远å ããããšã§ãã ããã§ã¯ãããŒã«å€ïŒããã©ã«ãã§ã¯TrueïŒã®åã远å ããŸãã æšæºã®SchemaEditorã«ãã£ãŠå®è¡ãããæäœã¯äœã§ããïŒ SQLãå®è¡ããå Žåã«ç¢ºèªã§ããæäœã¯ç§»è¡ãããŸãã ããã¯éåžžã«äŸ¿å©ã§ãããŸãã«ç§»è¡ã®ã¿ã€ãã«ãã£ãŠãDjangoãå®éã«ããã§å€æŽã§ããããšã¯å¿
ãããæç¢ºã§ã¯ãããŸããã ãããŠãç§ãã¡ãæåŸ
ããæäœãå®äºãããã©ããããããŠäžå¿
èŠãªãã®ãäžå¿
èŠãªãã®ãããã«å±ããŠãããã©ããã確èªããããšã¯æçšã§ãã
SchemaEditorã¯ã©ã®ã³ãã³ããå®è¡ããŸããïŒ æåã«ã1ã€ã®ãã©ã³ã¶ã¯ã·ã§ã³ã«æ°ããåã远å ãããããã©ã«ãå€ã远å ãããŸãã æ¬¡ã«ããã®ãããªæŽæ°ããŒããæŽæ°ããããšãè¿ããŸã§ãããŒã¿ã¯æŽæ°ãããŸãã
次ã«ãåã«SET NOT NULLãèšå®ãããããã©ã«ãå€ãåé€ãããDjangoã®åäœãç¹°ãè¿ãããŸããDjangoã¯ãããŒã¿ããŒã¹ã§ã¯ãªãã³ãŒãã®ç¬èªã®ããžãã¯ã¬ãã«ã§ããã©ã«ãå€ãä¿åããŸãã
ããã§ã¯ãäžè¬çã«ãæé·ããäœå°ããããŸãã ããšãã°ãè£å©çŽ¢åŒãäœæããŠã衚å
šäœã®æŽæ°ã«è¿ã¥ããšãNULLå€ãæã€ãã®ãããªè¡ããã°ããèŠã€ããããšãã§ããŸãã

ãŸããç§»è¡ãéå§ãããšãã®æŽæ°æéã®æå€§IDãä¿®æ£ããŠãIDã«ãã£ãŠãŸã æŽæ°ãããŠããªãå€ããã°ããèŠã€ããããšãã§ããŸãã
äžè¬çã«ãã©ã€ãã©ãªã¯éçºäžã§ãããããŒã«ãªã¯ãšã¹ããåãä»ããŠããŸãã èª°ãæ°ã«ããªã-åå ã
DBã®æé·ã«äŒŽããç§»è¡ã«ã¯é床äœäžã®é¿ããããªãç¹æ§ãããããšã«æ³šæãã䟡å€ããããŸãã ããŒãã«ãã©ã®ããã¯ãååŸãããã远跡ããSQLç§»è¡ãå®è¡ããŠãé©çšãããŠããæäœã確èªããå¿
èŠããããŸãã ç§ãã¡ã®åŽã§ã¯ãYandex.Connectã§ãæ©èœãèš±ãéããã®ã©ã€ãã©ãªã䜿çšããŸãã ãããŠã圌ãããããèš±å¯ããŠããªãå Žåãç§ãã¡ã¯èªåèªèº«ã§ãDjangoã®åœã®ç§»è¡ãè¡ããSQLã¯ãšãªãå®è¡ããŸãã
ãããã£ãŠãèªã¿åãããã³æžã蟌ã¿ãµãŒãã¹ã®é«å¯çšæ§ãå®çŸããŸãã è² è·ã倧ãããæ°åã®RPSããããæ°åã§ã®ããŠã³ã¿ã€ã ã¯ãã¡ããã®ããšã蚱容ç¯å²ãè¶
ããŠããŸãã ãŠãŒã¶ãŒãæ°ä»ããªããã¡ã«ç§»è¡ãè¡ãå¿
èŠããããŸãã ãããŠããã®ãããªè·ç©ããããšãæã®4æã«èµ·ããŠãè·ç©ããªããšãã«äœãã転ãããŠãåã³å¯ãã®ã¯äžå¯èœã§ã-è·ç©ã¯24æéåããŸãã
PostgreSQLã§ã®é«éæäœã§ããPostgreSQLã§ã®ããã¯ãã¥ãŒã®åäœã«ããããµãŒãã¹ã®é床äœäžããšã©ãŒãçºçããå¯èœæ§ãããããšã«æ³šæããŠãã ããã
æ°ããªç§ã§ãã£ãŠããæä»çã¢ã¯ã»ã¹ãå¿
èŠãªæäœãéå§ããããšæ³åããŠãã ããã ãã®ãããªæäœã®äŸã¯ãããã©ã«ãå€ãªãã§åã远å ããããšã§ãã å¥ã®ãã©ã³ã¶ã¯ã·ã§ã³ã§ã®èµ·åæã«ãä»ã®ããã€ãã®é·ãæäœïŒããšãã°ãéèšä»ãã®SELECTïŒããããšæ³åããŠãã ããã ãã®å Žåãæäœã¯åœŒå¥³ã®ããã«ãã¥ãŒã«å
¥ããããŸãã ããã¯ãã¢ã¯ã»ã¹æä»ãä»ã®ãã¹ãŠã®ã¿ã€ãã®ããã¯ãšç«¶åããããã«çºçããŸãã
åã远å ããæäœãããã¯ãåŸ
æ©ããŠããéãä»ã®ãã¹ãŠã®åã¯ãã®åã«äžŠã¶ããšã«ãªããå®äºãããŸã§å®è¡ãããŸããã åæã«ãå®è¡äžã®æäœ-éçŽã䌎ãSELECT-ã¯ä»ã®æäœãšç«¶åããªãå¯èœæ§ããããåã®äœæçšã§ãªãå Žåã¯ããã¥ãŒå
ã«ç«ã€ããšã¯ãããŸãããã䞊è¡ããŠå®è¡ãããŸãã
ãã®ç¶æ³ã¯ããµãŒãã¹ã«å€§ããªåé¡ãåŒãèµ·ããå¯èœæ§ããããŸãã ãããã£ãŠãALTER TABLEãŸãã¯ã¢ã¯ã»ã¹æä»ããã¯ãå¿
èŠãšãããã®ä»ã®æäœãéå§ããåã«ãé·ãã¯ãšãªãçŸæç¹ã§ããŒã¿ããŒã¹ã«éä¿¡ãããªãããã«æ³šæããå¿
èŠããããŸãã ãŸãã¯ãéåžžã«å°ããªãã°ã¿ã€ã ã¢ãŠããæ¿å
¥ããããšãã§ããŸãã ãã®åŸãããã«ããã¯ãååŸã§ããªãå Žåãæäœã¯å€±æããŸãã ãã ããŒãã«ãåèµ·åããã ãã§ãããŒãã«ãé·æéããã¯ããããšã¯ã§ããŸããããæäœã¯ããã¯èš±å¯ã®ä»äžãåŸ
æ©ããŸãã ããã ãã§ããããããšãã