ããŒã³ãŒãããã¯ãšã³ãåãïŒãã«ãããã³ãSaaSã®ããŒã¿ã¢ãã«éžæ
ãã«ãããã³ãSaaSã®ããŒã¿ã¢ãã«ã®éžæã¯ã»ãã¥ãªãã£ãã¬ããŒããé床ã«åœ±é¿ããŸããtenant_idãã¹ããŒãåé¢ãããã³ãããšã®ããŒã¿ããŒã¹ãæ¯èŒããããããã®ãã¬ãŒããªããæç¢ºã«ç€ºããŸãã

åé¡ïŒããã³ããåé¢ãã€ã€ããã©ãŒãã³ã¹ãèœãšããªã\n\nãã«ãããã³ã·ãŒãšã¯ã1ã€ã®ãœãããŠã§ã¢ã倿°ã®é¡§å®¢ïŒããã³ãïŒãæäŸããåããã³ããèªåã®ããŒã¿ã®ã¿ãèŠãå¿
èŠãããããšãæããŸããé£ããã®ã¯ãããäžè²«ããŠå®çŸããããšã§ãïŒåäžç»é¢ã ãã§ãªãããã¹ãŠã®APIåŒã³åºãã管çç»é¢ããšã¯ã¹ããŒããããã¯ã°ã©ãŠã³ããžã§ãã«æž¡ã£ãŠã§ãã\n\nããŒã¿ã¢ãã«ã¯å€ãã®ããŒã ãæ³åããããæ¥ã
ã®éçšã«åœ±é¿ããŸããæš©éãã¬ããŒãã£ã³ã°ãæé·ã«äŒŽãã¯ãšãªé床ããããŠâå°ããªâãã°ãã©ãã ãå±éºã«ãªãããå·Šå³ããŸãããã£ã«ã¿ã1ã€èŠèœãšããšããŒã¿ãæŒãããåé¢ãããéãããšã¬ããŒãã£ã³ã°ãé¢åã«ãªããŸãã\n\nãã«ãããã³ãSaaSããŒã¿ã¢ãã«ãæ§æããäžè¬çãªæ¹æ³ã¯3ã€ãããŸã:\n\n- ãã¹ãŠã®ããŒãã«ã« tenant_id ãå«ãã1ã€ã®ããŒã¿ããŒã¹\n- 1ã€ã®ããŒã¿ããŒã¹å
ã§ããã³ãããšã«ã¹ããŒããåãã\n- ããã³ãããšã«å¥ããŒã¿ããŒã¹ãçšæãã\n\nããŒã³ãŒãããã¯ãšã³ãã§èŠèŠçã«æ§ç¯ããŠããåããã¬ãŒããªããé©çšãããŸããAppMasterã®ãããªããŒã«ã¯èšèšããå®éã®ããã¯ãšã³ãã³ãŒããããŒã¿ããŒã¹æ§é ãçæãããããåæã®ã¢ããªã³ã°å€æãæ¬çªã®æåãæ§èœã«ããã«çŸããŸãã\n\nãã«ããã¹ã¯ããŒã«ãæ³åããŠãã ããããã±ããè¡ã« tenant_id ããããšããã¹ãŠã®æªè§£æ±ºãã±ããããç°¡åã«ååãã§ããŸããããã¹ãŠã®ç®æã§ããã³ããã§ãã¯ã匷å¶ããå¿
èŠããããŸããåããã³ããç¬èªã¹ããŒããDBãæã€ãšãåé¢ã¯ãã匷åºã«ãªããŸãããã¯ãã¹ããã³ãéèšïŒäŸïŒãå
šé¡§å®¢ã®å¹³åã¯ããŒãºæéãïŒã¯æéãå¢ããŸãã\n\nç®æšã¯ãã¬ããŒãã£ã³ã°ããµããŒããæé·ã«æ©æŠãçãŸãªãä¿¡é Œã§ããåé¢ãäœãããšã§ãã\n\n## éžã³æ¹ã®è¿éïŒçµã蟌ãããã®4ã€ã®è³ªå\n\nããŒã¿ããŒã¹çè«ããå§ããªãã§ãã ããããŸãã¯è£œåã®äœ¿ããæ¹ãšé±æ¬¡ã§äœãéçšããå¿
èŠãããããèããŸãããã\n\n### çããæããã«ãã4ã€ã®è³ªå\n\n1) ããŒã¿ã®æ©åŸ®æ§ã¯ã©ãããããã峿 ŒãªèŠåäžã«ãããïŒ å»çãéèãå³ãã顧客å¥çŽã¯ããã匷ãåé¢ïŒã¹ããŒãåé¢ãå¥DBïŒãéžã°ããããšãå€ãã§ãããªã¹ã¯ãæžãããç£æ»ãç°¡åã«ããŸãã\n\n2) ã¯ãã¹ããã³ãã®ã¬ããŒãã£ã³ã°ãé »ç¹ã«è¡ããïŒ å
šé¡§å®¢ã®ææšïŒå©çšãåçãããã©ãŒãã³ã¹ïŒã宿çã«å¿
èŠãšãããªããtenant_id ã䜿ãåäžããŒã¿ããŒã¹ãæãç°¡åãªããšãå€ãã§ããå¥DBã¯å€ãã®å Žæããçµæãéããå¿
èŠãããé£ãããªããŸãã\n\n3) ããã³ãéã®éãã¯ã©ãããããïŒ ããã³ããã«ã¹ã¿ã ãã£ãŒã«ããã¯ãŒã¯ãããŒãåºæã®é£æºãå¿
èŠãšãããªããã¹ããŒãåé¢ãå¥DBã§å€æŽãä»ã«æ³¢åããå¯èœæ§ãäžããããŸãã倧åãåãæ§é ãªã tenant_id ãé©ããŠããŸãã\n\n4) ããŒã ãçŸå®çã«ã©ããŸã§éçšã§ãããïŒ åé¢ã匷ããã»ã©äœæ¥ã¯å¢ããŸãïŒããã¯ã¢ããããã€ã°ã¬ãŒã·ã§ã³ãæ§æèŠçŽ ãéå®³ç®æãå¢ããŸãã\n\nå®åçã«ã¯äžäœ2æ¡ããããã¿ã€ãã«ããŠãæš©éã«ãŒã«ãã¬ããŒãã¯ãšãªãã¢ãã«ã®å€åã«äŒŽãå±éããã¹ãããã®ãè¯ãã¢ãããŒãã§ãã\n\n## ã¢ãããŒã1ïŒãã¹ãŠã®è¡ã« tenant_id ãæã€1ã€ã®ããŒã¿ããŒã¹\n\næãäžè¬çãªèšå®ã§ãïŒãã¹ãŠã®é¡§å®¢ãåãããŒãã«ãå
±æããããã³ãææã®ã¬ã³ãŒãã«ã¯ tenant_id ãä»äžãããŸããéçšã¯åçŽã§ã1ã€ã®DBãš1ã»ããã®ãã€ã°ã¬ãŒã·ã§ã³ã§æžã¿ãŸãã\n\nã«ãŒã«ã¯å³æ Œã§ãïŒè¡ãããã³ãã«å±ãããªããå¿
ã tenant_id ãå«ãããã¹ãŠã®ã¯ãšãªã§ãã£ã«ã¿ããå¿
èŠããããŸããããã³ãææããŒãã«ã«ã¯éåžžãusersãrolesãprojectsãticketsãinvoicesãmessagesããã¡ã€ã«ã¡ã¿ããŒã¿ãããã³ãããŒã¿ãç¹ãçµåããŒãã«ãªã©ãå«ãŸããŸãã\n\nããŒã¿æŒæŽ©ãæžããããã« tenant_id ãå¿
é æ±ãã«ããŸããã:\n\n- ããã³ãææããŒãã«ã§ tenant_id ã NOT NULL ã«ãã\n- tenant_id ããå§ãŸãã€ã³ããã¯ã¹ã远å ããïŒäŸïŒtenant_id, created_atïŒ\n- äžæå¶çŽã« tenant_id ãå«ããïŒäŸïŒããã³ãããšã®ã¡ãŒã«äžææ§ïŒ\n- tenant_id ãAPIãããžãã¹ãããŒå
šäœã§åãæž¡ãïŒUIã ãã«é ŒããªãïŒ\n- ã¯ã©ã€ã¢ã³ãåŽãã£ã«ã¿ãŒã ãã§ãªãããã¯ãšã³ãã§åŒ·å¶ãã\n\nPostgreSQLã§ã¯ãè¡ã¬ãã«ã»ãã¥ãªãã£ããªã·ãŒã匷åãªå®å
šç¶²ã«ãªããŸãã\n\nåç
§ããŒã¿ã¯éåžžãå
±æããŒãã«ïŒåœãªã¹ããªã©ã§ tenant_id ãªãïŒããããã³ãç¯å²ã®ã«ã¿ãã°ïŒã«ã¹ã¿ã ã¿ã°ããã€ãã©ã€ã³ã§ tenant_id ããïŒã®ã©ã¡ããã«åé¡ãããŸãã\n\nAppMasterã§æ§ç¯ããå Žåãäºæ
ã®å€ããé²ãç°¡åãªç¿æ
£ããããŸãïŒèªèšŒæžã¿ãŠãŒã¶ãŒã®ããã³ããã tenant_id ã Business Process ããžãã¯ã®èªã¿æžãåã«èšå®ãããã®ãã¿ãŒã³ãäžè²«ããŠé©çšããããšã§ãã\n\n## æš©éã®åœ±é¿ïŒã¢ãããŒãããšã«äœãå€ããã\n\næš©éã¯ãã«ãããã³ã·ãŒã®æåŠã決ããŸããéžãã ããŒã¿é
眮ã¯ãŠãŒã¶ãŒã®ä¿åæ¹æ³ãã¯ãšãªã®ã¹ã³ãŒãã³ã°ã管çç»é¢ã§ã®ãã¹é²æ¢æ¹æ³ãå€ããŸãã\n\nåäžDBã§ tenant_id ã䜿ãå ŽåãããŒã ã¯å
±éã® Users ããŒãã«ã䜿ããåãŠãŒã¶ãŒãããã³ããšäžã€ä»¥äžã®ããŒã«ã«é¢é£ã¥ããããšãå€ãã§ããéèŠãªã«ãŒã«ã¯å€ãããŸããïŒèªã¿æžãã¯å°ããªããŒãã«ïŒsettingsãtagsãlogsãªã©ïŒã§ããããã³ãã¹ã³ãŒããå«ããããšã\n\nã¹ããŒãåé¢ã§ã¯ãå
±éã®IDå±€ïŒãã°ã€ã³ããã¹ã¯ãŒããMFAïŒã¯å
±æã®ãŸãŸã«ããŠãããã³ãããŒã¿ãããã³ãããšã®ã¹ããŒãã«çœ®ãããšãå€ãã§ããæš©éã¯ã«ãŒãã£ã³ã°ã®åé¡ã®äžéšã«ãªããã¢ããªã¯ããžãã¹ããžãã¯å®è¡åã«æ£ããã¹ããŒããæãå¿
èŠããããŸãã\n\nå¥DBã§ã¯åé¢ãæã匷ããªããŸãããæš©éããžãã¯ã¯ã€ã³ãã©å¯ãã«ãªããŸãïŒæ£ããDBæ¥ç¶ãéžã¶ãè³æ Œæ
å ±ã管çãããã°ããŒãã«ã¹ã¿ããã¢ã«ãŠã³ããæ±ããªã©ã§ãã\n\nã©ã®ã¢ãããŒãã§ããããã³ãã®ãªã¹ã¯ãæžããå
±éãã¿ãŒã³ããããŸã:\n\n- tenant_id ãã»ãã·ã§ã³ãèªèšŒããŒã¯ã³ã®ã¯ã¬ãŒã ã«å
¥ããŠå¿
é æ±ãã«ãã\n- ããã³ããã§ãã¯ãããã«ãŠã§ã¢ãåäžã® Business Process ã«éçŽããŠæ£ãã°ãããªã\n- 管çããŒã«ã§ã¯ããã³ãã³ã³ããã¹ããæç€ºããæç¢ºãªããã³ãåæ¿ãèŠæ±ãã\n- ãµããŒãã¢ã¯ã»ã¹ã¯ã€ã³ããŒãœããŒã·ã§ã³ãšç£æ»ãã°ã§è¡ã\n\nAppMasterã§ã¯éåžžãèªèšŒåŸã«ããã³ãã³ã³ããã¹ããä¿åããAPIãšã³ããã€ã³ããšBusiness Processã§åå©çšããŠã¯ãšãªãåžžã«ã¹ã³ãŒããããããã«ããŸãããµããŒãæ
åœè
ã¯UIã®ãã£ã«ã¿ãŒã ãã§ãªããã¢ããªãããã³ãã³ã³ããã¹ããèšå®ããåŸã«æ³šæãèŠãããã¹ãã§ãã\n\n## tenant_idã¢ãã«ã§ã®ã¬ããŒãã£ã³ã°ãšããã©ãŒãã³ã¹\n\ntenant_id ã䜿ãåäžããŒã¿ããŒã¹ã§ã¯ãã¬ããŒãã£ã³ã°ã¯æŠããŠç°¡åã§ããã°ããŒãã«ããã·ã¥ããŒãïŒMRRããµã€ã³ã¢ãããå©çšïŒã1ã€ã®ã¯ãšãªã§æžã¿ãããã³ãã¬ãã«ã®ã¬ããŒãã¯ãã®ã¯ãšãªã«ãã£ã«ã¿ã远å ããã ãã§ãã\n\nãã¬ãŒããªãã¯æéãšãšãã«çŸããããã©ãŒãã³ã¹ã§ããããŒãã«ã倧ãããªããšã1ã€ã®ã¢ã¯ãã£ããªããã³ããå€éã®è¡ãäœããã€ãžãŒã»ãã€ããŒã«ãªãåŸãŸããæžã蟌ã¿ãå¢ããå
±éã¯ãšãªãé
ããªãå¯èœæ§ããããŸãã\n\nã€ã³ããã¯ã¹ããã®ã¢ãã«ãå¥åº·ã«ä¿ã¡ãŸããã»ãšãã©ã®ããã³ãã¹ã³ãŒãã®èªã¿åãã tenant_id ããå§ãŸãã€ã³ããã¯ã¹ã䜿ããããã«ããŠãããŒã¿ããŒã¹ããã®ããã³ãã®ç¯å²ã«çŽæ¥ãžã£ã³ãã§ããããã«ããŸãã\n\nè¯ãããŒã¹ã©ã€ã³:\n\n- è€åã€ã³ããã¯ã¹ã§ã¯ tenant_id ãæåã®åã«ããïŒäŸïŒtenant_id + created_atãtenant_id + statusãtenant_id + user_idïŒ\n- æ¬åœã«ã°ããŒãã«ãªã€ã³ããã¯ã¹ã¯ã¯ãã¹ããã³ãã¯ãšãªãå¿
èŠãªå Žåã®ã¿ã«ãã\n- ãžã§ã€ã³ããã£ã«ã¿ã§ tenant_id ãå¿ããŠããªããç£èŠããïŒå¿ãããšå
šè¡šã¹ãã£ã³ã®åå ã«ïŒ\n\nä¿æïŒretentionïŒãåé€ã®æ¹éãå¿
èŠã§ããããããã³ãã®å±¥æŽãããŒãã«ãèšããŸãããšå
šå¡ã«åœ±é¿ããŸããããã³ãããšã«ä¿ææ¹éãç°ãªãå Žåã¯ãœããããªãŒããšå®æã¢ãŒã«ã€ããããã㯠tenant_id ã§ããŒä»ããããã¢ãŒã«ã€ãããŒãã«ãžã®ç§»åãæ€èšããŠãã ããã\n\n## ã¢ãããŒã2ïŒããã³ãããšã«ã¹ããŒããåãã\n\nã¹ããŒãåé¢ã§ã¯1ã€ã®PostgreSQLããŒã¿ããŒã¹ã䜿ããåããã³ãã«ã¹ããŒãïŒäŸïŒtenant_42ïŒãå²ãåœãŠãŸãããã®ã¹ããŒãå
ã®ããŒãã«ã¯ãã®ããã³ãå°çšã§ããå€ãã®é¡§å®¢ã«ãããããŒã¿ããŒã¹ããäžãããããªæèŠã§ãè€æ°ããŒã¿ããŒã¹ãéçšãããªãŒããŒããããé¿ããããŸãã\n\näžè¬çãªæ§æã§ã¯ãã°ããŒãã«ãªãµãŒãã¹ãå
±æã¹ããŒãã«çœ®ããããžãã¹ããŒã¿ã¯ããã³ãã¹ããŒãã«å
¥ããŸããå
±æãã¹ããæ··ããŠã¯ãªããªããã®å€æãåå²ã®åºæºã§ãã\n\nå
žåçãªåå²:\n\n- å
±æã¹ããŒãïŒtenantsããŒãã«ããã©ã³ãè«æ±ã¬ã³ãŒããæ©èœãã©ã°ãç£æ»èšå®\n- ããã³ãã¹ããŒãïŒordersãticketsãåšåº«ããããžã§ã¯ããã«ã¹ã¿ã ãã£ãŒã«ããªã©ã®ããžãã¹ããŒãã«\n- ãŠãŒã¶ãŒãšããŒã«ã¯ãããã¯ã次第ã§ã©ã¡ãåŽã«çœ®ããæ±ºããïŒè€æ°ããã³ããžã®ã¢ã¯ã»ã¹ãããå Žåã¯å
±æã«ããããšãå€ãïŒ\n\nãã®ã¢ãã«ã¯ã¯ãã¹ããã³ãçµåã®ãªã¹ã¯ãæžããã1ã€ã®ã¹ããŒããããã¯ã¢ããããªã¹ãã¢ã®ã¿ãŒã²ããã«ã§ããããåäžããã³ãã®åŸ©æ§ã容æã§ãã\n\nããŒã ãé©ãã®ã¯ãã€ã°ã¬ãŒã·ã§ã³ã§ããæ°ããããŒãã«ãã«ã©ã ã远å ãããšãããã¹ãŠã®ããã³ãã¹ããŒãã«å€æŽãé©çšããå¿
èŠããããŸããããã³ãã10ãªã察åŠããããã§ããã1,000ã«ãªãã°ã¹ããŒãããŒãžã§ã³ç®¡çããããã§ã®ãã€ã°ã¬ãŒã·ã§ã³ã1ã€ã®å€±æãä»ãæ¢ããªããã§ã€ã«ã»ãŒããå¿
èŠã«ãªããŸãã\n\nèªèšŒãè«æ±ãšãã£ãå
±æãµãŒãã¹ã¯éåžžããã³ãã¹ããŒãå€ã«çœ®ããŸããå®è·µçãªãã¿ãŒã³ã¯å
±æèªèšŒïŒãŠãŒã¶ãŒããŒãã«ïŒããã³ãåå ããŒãã«ïŒãå
±æè«æ±ïŒStripeã®é¡§å®¢IDãè«æ±æžïŒãä¿ã¡ãããã³ãã¹ããŒãã¯ããã³ãææã®ããžãã¹ããŒã¿ãä¿æããããšã§ãã\n\nAppMasterã䜿ãå Žåã¯ãData Designerã®ã¢ãã«ãå
±æã¹ããŒããšããã³ãã¹ããŒãã«ã©ãããããããããæ©ãã«èšç»ãããã°ã€ã³ãæ¯æããå£ããã«ããã³ãã¹ããŒããé²åãããããããã«ããŸãã\n\n## ã¹ããŒãåé¢ã§ã®ã¬ããŒãã£ã³ã°ãšããã©ãŒãã³ã¹\n\nã¹ããŒãåé¢ã¯ããã©ã«ãã§ tenant_id ããŒã¹ãã匷ãåé¢ãæäŸããŸããããŒãã«ãå¥ã®åå空éã«ãããããæš©éãã¹ããŒãåäœã§èšå®ã§ããŸãã\n\nããã³ãããšã®ã¬ããŒããäžå¿ãªãæ±ããããã§ããã¯ãšãªã¯ãã®ããã³ãã®ããŒãã«ã ããèªãã°ãããåžžã«å
±æããŒãã«ããã£ã«ã¿ãç¶ããå¿
èŠããããŸããããã®ã¢ãã«ã¯ãç¹å¥ããªããã³ãã«è¿œå ããŒãã«ãã«ã¹ã¿ã ã«ã©ã ãäžãããããä»ã®ããã³ãã«è² æ
ã匷ããŸããã\n\nãã ããå
šããã³ããæšªæããéèšã¬ããŒãã¯é¢åã§ããå€ãã®ã¹ããŒããã¯ãšãªããã¬ããŒãã£ã³ã°å±€ãå¿
èŠããå
±éã¹ããŒãã«ãµããªãä¿æããéçšãå®åçã§ãã\n\nãããããã¿ãŒã³:\n\n- ããã³ãå¥ããã·ã¥ããŒãã¯ãã®ããã³ãã®ã¹ããŒãã ããã¯ãšãªãã\n- åããã³ãããå€éã«ããŒã«ã¢ããããäžå€®åæçšã¹ããŒããæã€\n- ããã³ãããŒã¿ãããŒã¿ãŠã§ã¢ããŠã¹åãã«ãšã¯ã¹ããŒãããããããèµ°ããã\n\nããã©ãŒãã³ã¹ã¯éåžžãããã³ãåäœã®ã¯ãŒã¯ããŒãã§è¯å¥œã§ããã€ã³ããã¯ã¹ã¯åããã³ãã§å°ãããããã¹ããŒãã§ã®å€§éæžã蟌ã¿ãä»ãé
ãããå¯èœæ§ã¯äœããªããŸãããã¬ãŒããªãã¯éçšãªãŒããŒãããã§ãæ°ããããã³ãã®ããããžã§ãã³ã°ã¯ã¹ããŒãäœæããã€ã°ã¬ãŒã·ã§ã³å®è¡ãã¹ããŒãæŽåæ§ã®ç¶æãå¿
èŠã«ãªããŸãã\n\nããã³ãããšã«ã«ã¹ã¿ãã€ãºã峿 Œãªåé¢ãæãå Žåãã¹ããŒãã¯å€ãã®ããŒã ã«ãšã£ãŠè¯ãäžéç¹ã§ãã\n\n## ã¢ãããŒã3ïŒããã³ãããšã«å¥ããŒã¿ããŒã¹\n\nããã³ãããšã«å¥ããŒã¿ããŒã¹ãçšæãããšãå顧客ã«å°çšã®ããŒã¿ããŒã¹ïŒåäžãµãŒãäžã§ãå¯ïŒãå²ãåœãŠãŸããæãåé¢ã匷ããããããã³ãã®ããŒã¿ç Žæãèšå®ãã¹ãéè² è·ãä»ãžæ³¢åããå¯èœæ§ã¯äœããªããŸãã\n\nèŠå¶ãå³ããç°å¢ïŒå»çãéèãæ¿åºïŒããšã³ã¿ãŒãã©ã€ãºé¡§å®¢ã§å³æ Œãªåé¢ãå°çšã®ä¿æã«ãŒã«ãå°çšããã©ãŒãã³ã¹ãèŠæ±ãããå Žåã«é©ããŠããŸãã\n\nãªã³ããŒãã£ã³ã°ã¯ããããžã§ãã³ã°ã¯ãŒã¯ãããŒã«ãªããŸããæ°ããããã³ãããµã€ã³ã¢ãããããããŒã¿ããŒã¹ãäœæãŸãã¯ã¯ããŒã³ããåºæ¬ã¹ããŒãïŒããŒãã«ãã€ã³ããã¯ã¹ãå¶çŽïŒãé©çšããè³æ Œæ
å ±ãå®å
šã«ä¿åããAPIãªã¯ãšã¹ããæ£ããããŒã¿ããŒã¹ãžã«ãŒãã£ã³ã°ããå¿
èŠããããŸãã\n\nAppMasterã§æ§ç¯ããå ŽåãéèŠãªèšèšã¯ããã³ããã£ã¬ã¯ããªïŒããã³ã->DBæ¥ç¶ã®ãããïŒãã©ãã«çœ®ããããããŠãã¹ãŠã®ãªã¯ãšã¹ããæ£ããæ¥ç¶ã䜿ãããšãã©ãä¿èšŒãããã§ãã\n\nã¢ããã°ã¬ãŒããšãã€ã°ã¬ãŒã·ã§ã³ãäž»ãªãã¬ãŒããªãã§ããã¹ããŒã倿Žã¯ã1åå®è¡ãã§ã¯ãªãããã¹ãŠã®ããã³ãã«å¯ŸããŠå®è¡ãã«ãªãããéçšäœæ¥ãšãªã¹ã¯ãå¢ããŸããå€ãã®ããŒã ã¯ã¹ããŒããããŒãžã§ã³ç®¡çããããã³ãããšã®é²æã远ãå¶åŸ¡ããããžã§ããšããŠãã€ã°ã¬ãŒã·ã§ã³ãå®è¡ããŸãã\n\nå©ç¹ã¯å¶åŸ¡æ§ã§ãã倧ããªããã³ãããå
ã«ç§»è¡ããŠæåãç£èŠããæ®µéçã«å±éã§ããŸãã\n\n## å¥ããŒã¿ããŒã¹ã§ã®ã¬ããŒãã£ã³ã°ãšããã©ãŒãã³ã¹\n\nå¥DBã¯çè§£ããããå©ç¹ããããŸãã誀ã£ãã¯ãã¹ããã³ãèªã¿åãã¯èµ·ãã«ãããæš©éãã¹ããã£ãŠã圱é¿ã¯ãã®ããã³ãã«éå®ãããããšãå€ãã§ãã\n\nããã©ãŒãã³ã¹é¢ã§ã匷ã¿ããããŸããéãã¯ãšãªãå€§èŠæš¡ã€ã³ããŒããæŽèµ°ããã¬ããŒããããã³ãAãé
ãããŠãããã³ãBã«ã¯åœ±é¿ããŸããããã€ãžãŒãã€ããŒå¯ŸçãšããŠæå¹ã§ãããã³ãããšã«ãªãœãŒã¹èª¿æŽãã§ããŸãã\n\nãã¬ãŒããªãã¯ã¬ããŒãã£ã³ã°ãšéçšã³ã¹ãã§ããããŒã¿ãç©ççã«åãããŠãããããã°ããŒãã«åæã¯é£ãããªããŸããå®è·µçãªãã¿ãŒã³ã¯ãéèŠã€ãã³ããããŒãã«ãäžå€®ã®ã¬ããŒãDBãžã³ããŒãããã€ãã³ããããŒã¿ãŠã§ã¢ããŠã¹ãžéããããã³ãããšã«éèšããŠçµæãåç®ããïŒããã³ãæ°ãå°ãªããšãïŒãªã©ã§ãã\n\nãŸãæ¥ç¶ããŒã«ã®äžéã«æ©ãéããå¯èœæ§ããããããåããã³ãã®æ¥ç¶æ°ãèæ
®ããèšèšãå¿
èŠã§ãã\n\n## ããŒã¿æŒæŽ©ãåŸæãæãäžè¬çãªãã¹\n\nå€ãã®ãã«ãããã³ãåé¡ã¯å€§ããªèšèšãã¹ã§ã¯ãªããå°ããªèŠèœãšããæé·ãšãšãã«ã»ãã¥ãªãã£ãã°ãæ£ããã£ãã¬ããŒãã£ã³ã°ãé«ã³ã¹ãã®ä¿®åŸ©ã«ã€ãªããã±ãŒã¹ã§ãããã«ãããã³ã·ãŒã¯æ©èœãšããŠåŸä»ãããã®ã§ã¯ãªããç¿æ
£ãšããŠæ±ãã¹ãã§ãã\n\nããããæŒæŽ©åå ã¯ãçµåããŒãã«ïŒuser_rolesãinvoice_itemsãã¿ã°é¡ïŒã§ããã³ããã£ãŒã«ããå¿ããããšã§ããèŠãç®ã¯åé¡ãªããŠããã¬ããŒããæ€çŽ¢ããã®ããŒãã«ãçµç±ãããšå¥ããã³ãã®è¡ãåŒããŠããŸããŸãã\n\n管çããã·ã¥ããŒããããã³ããã£ã«ã¿ããã€ãã¹ããã®ãé »ç¹ã«èµ·ããŸããããµããŒãçšã«ã ãããšå§ãããã®ãåå©çšããæ¡å€§ãããšå±éºã§ããããŒã³ãŒãããŒã«ã§ããªã¹ã¯ã¯å€ãããŸããïŒãã¹ãŠã®ã¯ãšãªãããžãã¹ããã»ã¹ããšã³ããã€ã³ãã§åãããã³ãã¹ã³ãŒããå¿
èŠã§ãã\n\nIDãèœãšã穎ã«ãªããŸããorder_number = 1001 ã®ãããªäººéã«åªããIDãããã³ãéã§å
±æããŠãããšããµããŒãããŒã«ãçµ±åãã¬ã³ãŒããæ··åããŸããå
éšã®äž»ããŒãšããã³ãã¹ã³ãŒããããèå¥åãåããã«ãã¯ã¢ããã«ã¯ããã³ãã³ã³ããã¹ããå«ããŠãã ããã\n\næåŸã«ãããŒã ã¯èŠæš¡ã倧ãããªã£ããšãã®ãã€ã°ã¬ãŒã·ã§ã³ãšããã¯ã¢ãããéå°è©äŸ¡ããã¡ã§ãã10ããã³ãã§ã¯ç°¡åã§ã1,000ããã³ãã§ã¯é
ããŠå±éºã§ãã\n\nã»ãšãã©ã®çã¿ãé²ãã¯ã€ãã¯ãã§ãã¯:\n\n- ãã¹ãŠã®ããŒãã«ïŒçµåããŒãã«ãå«ãïŒã§ããã³ãææãæç€ºãã\n- ããã³ãã¹ã³ãŒãã³ã°ãã¿ãŒã³ã1ã€ã«çµ±äžãåå©çšãã\n- ã¬ããŒãããšã¯ã¹ããŒããããã³ãã¹ã³ãŒããªãã§ã¯å®è¡ã§ããªãããã«ããïŒçã«ã°ããŒãã«ãªå Žåã奿±ãã«ïŒ\n- APIããµããŒãããŒã«ã§ããã³ããææ§ã«ãªãèå¥åãé¿ãã\n- ãªã¹ãã¢ãšãã€ã°ã¬ãŒã·ã§ã³æé ãæé·åã«ç·Žç¿ãã\n\näŸïŒãµããŒãæ
åœè
ããinvoice 1001ããæ€çŽ¢ããŠèª€ã£ãããã³ãã®ã¬ã³ãŒããåŒããŠããŸããå°ããªãã°ã倧ããªåœ±é¿ãçãå
žåã§ãã\n\n## 確å®åã«ããã¹ãã¯ã€ãã¯ãã§ãã¯ãªã¹ã\n\nãã«ãããã³ãSaaSããŒã¿ã¢ãã«ã確å®ããåã«æ°åã®ãã¹ããå®è¡ããŠãã ãããç®çã¯ããŒã¿æŒæŽ©ãæ©æã«èŠã€ããããŒãã«ã倧ãããªã£ããšãã«ãéžæãæ©èœããããšã確èªããããšã§ãã\n\n### 1æ¥ã§ã§ããéããã§ãã¯\n\n- ããŒã¿åé¢ã®èšŒæïŒ ããã³ãAãšBãäœãé¡äŒŒã¬ã³ãŒãã远å ããŠããã¹ãŠã®èªã¿åããšæŽæ°ãã¢ã¯ãã£ããªããã³ãã«ã¹ã³ãŒããããããšãæ€èšŒããŸããUIãã£ã«ã¿ãŒã ãã«é Œããªãã§ãã ããã\n- æš©éç Žå£ãã¹ãïŒ ããã³ãAã®ãŠãŒã¶ãŒã§ãã°ã€ã³ããã¬ã³ãŒãIDã ããå€ããŠããã³ãBã®ã¬ã³ãŒããéãããç·šéã»åé€ã§ããªãã詊ããæåããå Žåã¯ãªãªãŒã¹ãããã«ãŒã§ãã\n- æžã蟌ã¿çµè·¯ã®å®å
šæ§ïŒ ããã¯ã°ã©ãŠã³ããžã§ããã€ã³ããŒããèªååçµè·¯ã§ãæ°èŠã¬ã³ãŒããæ£ããããã³ãå€ïŒãŸãã¯æ£ããã¹ããŒã/DBïŒã«å
¥ãããšã確èªããã\n- ã¬ããŒãã£ã³ã°è©ŠéšïŒ ããã³ãå°çšã¬ããŒããšå
šããã³ãïŒå
éšã¹ã¿ããåãïŒã®ã¬ããŒããããããå®è¡ã§ãããã誰ãã°ããŒãã«ãã¥ãŒãèŠããããã®ã«ãŒã«ãæç¢ºã«ããŠç¢ºèªããã\n- ããã©ãŒãã³ã¹ãã§ãã¯ïŒ ä»ã®ãã¡ã«ã€ã³ããã¯ã¹æŠç¥ãå
¥ããŠïŒç¹ã« (tenant_id, created_at) çïŒãå°ãªããšã1ã€ã®é
ãã¯ãšãªãæå³çã«å®è¡ããŠãæªãç¶æ
ããã©ããªãã®ããææ¡ããã\n\nã¬ããŒãã£ã³ã°ãã¹ããå
·äœåããã«ã¯ãããã³ãåäœãšã°ããŒãã«ã®1åãã€ãå®éã«å¿
èŠã«ãªã質åãéžã³ãµã³ãã«ããŒã¿ã§å®è¡ããŠã¿ãŠãã ããã\n\nsql\n-- Tenant-only: last 30 days, one tenant\nSELECT count(*)\nFROM tickets\nWHERE tenant_id = :tenant_id\n AND created_at \u003e= now() - interval '30 days';\n\n-- Global (admin): compare tenants\nSELECT tenant_id, count(*)\nFROM tickets\nWHERE created_at \u003e= now() - interval '30 days'\nGROUP BY tenant_id;\n\n\nAppMasterã§ãããã¿ã€ããããªãããããã®ãã§ãã¯ãBusiness ProcessãããŒïŒèªã¿ã»æžãã»åé€ïŒã«çµã¿èŸŒã¿ãData Designerã§2ã€ã®ããã³ããã·ãŒãããŠãã ãããçŸå®çãªããŒã¿éã§ãããã®ãã¹ããéãã°ãèªä¿¡ããã£ãŠæ¡çšã§ããŸãã\n\n## äŸïŒæåã®é¡§å®¢ããã¹ã±ãŒã«ãŸã§ã®éç\n\n20人ã®äŒç€Ÿã顧客ããŒã¿ã«ïŒè«æ±æžããã±ãããç°¡æããã·ã¥ããŒãïŒãç«ã¡äžããŸããåæã§10ããã³ãã1幎ã§1,000ããã³ãã«æé·ããèŠèŸŒã¿ã§ãã\n\nåæã¯éåžžã顧客ããŒã¿ãä¿åããããŒãã«ãã¹ãŠã« tenant_id ãå«ããåäžããŒã¿ããŒã¹ãæãã·ã³ãã«ã§ããæ§ç¯ãéããã¬ããŒãã容æã§ãã»ããã¢ããã®éè€ãé¿ããããŸãã\n\n10ããã³ãã®æ®µéã§æå€§ã®ãªã¹ã¯ã¯ããã©ãŒãã³ã¹ã§ã¯ãªãæš©éã§ãã1ã€ã®ãã£ã«ã¿æŒãïŒäŸïŒãè«æ±äžèЧãã¯ãšãªã tenant_id ãå¿ããïŒãããŒã¿æŒæŽ©ã«ã€ãªãããŸããããŒã ã¯ããã³ããã§ãã¯ãäžè²«ããå ŽæïŒå
±æããžãã¹ããžãã¯ãåå©çšå¯èœãªAPIãã¿ãŒã³ïŒã§åŒ·å¶ããããã³ãã¹ã³ãŒãã³ã°ãé亀æžã«æ±ãã¹ãã§ãã\n\n10ãã1,000ã«ç§»ãã«åŸãããŒãºã¯å€ãããŸããã¬ããŒãè² è·ãå¢ãããµããŒãããããã®ããã³ãã®å
šãšã¯ã¹ããŒãããæ±ãããã倧æããã³ãããã©ãã£ãã¯ãæ¯é
ããŠå
±æããŒãã«ãé
ãããããšããããŸãã\n\nçŸå®çãªã¢ããã°ã¬ãŒããã¹äŸ:\n\n1) åãã¢ããªããžãã¯ãšæš©éã«ãŒã«ãç¶æãã€ã€ãé«è² è·ããã³ããã¹ããŒãåé¢ãžç§»ãã\n2) æå€§çŽã®ããã³ãïŒãŸãã¯ã³ã³ãã©ã€ã¢ã³ã¹èŠä»¶ã®ãã顧客ïŒã¯å¥DBãžç§»è¡ããã\n3) ãã¹ãŠã®ããã³ãããèªãå
±æã®ã¬ããŒãã£ã³ã°ã¬ã€ã€ãŒãç¶æããéãã¬ããŒãã¯ãªãããŒã¯ã§å®è¡ããã\n\næåããã巚倧ããã³ãåé¡ãã«æé©åããããã仿¥ããŒã¿ãå®å
šã«åé¢ã§ããæãåçŽãªã¢ãã«ãéžã³ãåŸã§ãæ°ä»¶ã®å·šå€§ããã³ãããç§»è¡ããèšç»ãç«ãŠãã»ããçŸå®çã§ãã\n\n## 次ã®ã¹ãããïŒã¢ãã«ãéžãã§ããŒã³ãŒãããã¯ãšã³ãã§ãããã¿ã€ããã\n\nãŸãå®ãã¹ããã®ïŒããŒã¿åé¢ãéçšã®åçŽããããã³ãåäœã®ã¹ã±ãŒãªã³ã°ïŒã§éžæããŠãã ããã確信ã¯å°ããªãããã¿ã€ããäœããå®éã®æš©éãšã¬ããŒãã±ãŒã¹ã§å£ããŠã¿ãããšã§åŸãããŸãã\n\nç°¡åãªåºçºã¬ã€ã:\n\n- ã»ãšãã©ã®ããã³ããå°ããã¯ãã¹ããã³ãã®éèšãå¿
èŠãªãããã¹ãŠã®è¡ã« tenant_id ã眮ããåäžããŒã¿ããŒã¹ããå§ããã\n- ãã匷ãåé¢ã欲ãããŠã1ã€ã®DBã§ç®¡çããããªããããã³ãããšã«ã¹ããŒããåããããšãæ€èšããã\n- ããã³ãã峿 Œãªåé¢ïŒã³ã³ãã©ã€ã¢ã³ã¹ãå°çšããã¯ã¢ããããã€ãžãŒãã€ããŒå¯ŸçïŒãèŠæ±ãããªãå¥DBãæ€èšããã\n\næ§ç¯åã«ããã³ãå¢çãå¹³æãªèšèã§æžãåºããŠãã ããã圹å²ïŒownerãadminãagentãviewerïŒãå®çŸ©ããããããäœãã§ãããã"ã°ããŒãã«"ããŒã¿ïŒãã©ã³ããã³ãã¬ãŒããç£æ»ãã°ïŒãäœãæå³ããããæ±ºããŸããã¬ããŒãã£ã³ã°ãããã³ãå°çšãå
éšã¹ã¿ããåãã®å
šããã³ãããæ±ºããŠãããŸãããã\n\nAppMasterã䜿ããªããData Designerã§ããŒãã«ïŒtenant_idãäžæå¶çŽãã¯ãšãªãäŸåããã€ã³ããã¯ã¹ãå«ãïŒãã¢ããªã³ã°ããBusiness Process Editorã§èªã¿æžãããšã«ã«ãŒã«ã匷å¶ããããšã§ãããã®ãã¿ãŒã³ãçŽ æ©ããããã¿ã€ãã§ããŸããAppMaster 㯠appmaster.io ã«ãããŸãã\n\nå®è·µçãªæçµãã¹ãïŒããã³ãAãšBãäœããåããŠãŒã¶ãŒãšæ³šæã远å ããŠåããããŒãå®è¡ããŸããããã³ãAã®ã¬ããŒãããšã¯ã¹ããŒãããåŸããããšããã³ãBã®IDãåããšã³ããã€ã³ãã«æž¡ããŠã¿ãŠãã ããããããã¿ã€ãããååå®å
šããªã®ã¯ããããã®è©Šè¡ãåžžã«å€±æããäž»èŠã¬ããŒããå®ããŒã¿éã§é«éã«åããšãã§ãã
ãããã質å
ã·ã³ãã«ãªéçšãšé »ç¹ãªã¯ãã¹ããã³ãåæãéèŠãããªãããŸãã¯ããã³ãææããŒãã«ã«tenant_idã眮ããåäžããŒã¿ããŒã¹ãããã©ã«ãã«ããŸãããããã匷ãåé¢ãããã³ãããšã®ã«ã¹ã¿ãã€ãºãå¿
èŠã«ãªã£ããã¹ããŒãåé¢ãžãã³ã³ãã©ã€ã¢ã³ã¹ãå°çšã®ããã©ãŒãã³ã¹å¶åŸ¡ãèŠæ±ãããå Žåã¯ããã³ãããšã®å¥ããŒã¿ããŒã¹ãæ€èšããŠãã ããã
ããã³ãã¹ã³ãŒãã³ã°ã¯UIã®ãã£ã«ã¿ãŒã§ã¯ãªãããã¯ãšã³ãã§å¿
é ã«æ±ã£ãŠãã ãããããã³ãææããŒãã«ã«tenant_idãå¿
é ã«ããã¯ã©ã€ã¢ã³ãã®å
¥åãä¿¡çšããèªèšŒæžã¿ãŠãŒã¶ãŒã®ã³ã³ããã¹ãããæ±ºå®ããŸããå¯èœãªãPostgreSQLã®è¡ã¬ãã«ã»ãã¥ãªãã£ãªã©ã®å®å
šç¶²ã远å ããå¥ããã³ãã®ã¬ã³ãŒãã«IDã ããå€ããŠã¢ã¯ã»ã¹ã§ããªããã詊ããã¹ããäœããŸãããã
äžè¬çãªãã£ã«ã¿ãŒã«åãã€ã³ããã¯ã¹ã§ã¯ãå
é ã«tenant_idã眮ãã®ãéèŠã§ããäŸãã°æéããŒã¹ã®ãã¥ãŒã«ã¯(tenant_id, created_at)ããããã·ã¥ããŒãçšã«ã¯(tenant_id, status)ã(tenant_id, user_id)ã远å ããŸãããŠããŒã¯å¶çŽãããã³ãåäœã«ããŠïŒäŸïŒããã³ãããšã®ã¡ãŒã«äžææ§ïŒè¡çªãé¿ããŸãããã
ã¹ããŒãåé¢ã¯ããŒãã«ãåå空éããšã«åãããããã誀ã£ãã¯ãã¹ããã³ãçµåãèµ·ãã«ãããã¹ããŒãåäœã§æš©éãèšå®ã§ããŸããæ¬ ç¹ã¯ãã€ã°ã¬ãŒã·ã§ã³ã§ãã¹ããŒãæ°ãå¢ãããšãã¹ãŠã®ã¹ããŒãã«åã倿Žãé©çšããéçšãå¿
èŠã«ãªããŸããtenant_idãã匷ãåé¢ãæ±ãã€ã€ãåäžDBã§ç®¡çãããå Žåã®äžéæ¡ã§ãã
å¥ããŒã¿ããŒã¹ã¯ãã©ã¹ãååŸïŒè¢«å®³ç¯å²ïŒãæå°åããŸããããã©ãŒãã³ã¹ã®æ¥äžæãèšå®ãã¹ãç Žæã®åœ±é¿ã¯ãã®ããã³ãã«çãŸããããã§ãã代åã¯éçšã³ã¹ãã§ãããããžã§ãã³ã°ãããã¯ã¢ãããç£èŠããã€ã°ã¬ãŒã·ã§ã³ãããã³ãæ°ã«å¿ããŠå¢ããŸããä¿¡é Œã§ããããã³ããã£ã¬ã¯ããªãšãªã¯ãšã¹ãããšã®æ¥ç¶ã«ãŒãã£ã³ã°ãå¿ èŠã§ãã
åäžDBãštenant_idãªãã°ããŒãã«éèšããã®ãŸãŸã¯ãšãªã«ãªãããæãç°¡åã§ããã¹ããŒããå¥DBã«åãããŠããå Žåã¯ãéèŠã€ãã³ãããµããªã宿çã«å
±æã®ã¬ããŒãã£ã³ã°ã¹ãã¢ãžã³ããŒããã®ãå®åçãªæ¹æ³ã§ããæ¥æ¬¡ããŒã«ã¢ãããã€ãã³ãã¹ããªãŒã ã§äžå€®ã®åæåºç€ã«éããã¿ãŒã³ããã䜿ãããŸãã
ãµããŒãçšã®ããŒã«ã§ã¯ããã³ãã³ã³ããã¹ããæç€ºçã«è¡šç€ºããã¬ã³ãŒããé²èЧããåã«æå³çãªããã³ãåæ¿ãå¿ é ã«ããŠãã ãããã€ã³ããŒãœããŒã·ã§ã³ïŒä»£çãã°ã€ã³ïŒã䜿ããªã誰ããã€ã¢ã¯ã»ã¹ããããç£æ»ãã°ã«æ®ããæéå¶éãèšããŸããã¬ã³ãŒãIDã ãã§æ€çŽ¢ãèš±ãã¯ãŒã¯ãããŒã¯âinvoice 1001âåé¡ã®æž©åºã«ãªããŸãã
ããã³ãããšã«ãã£ãŒã«ããã¯ãŒã¯ãããŒãç°ãªããªããã¹ããŒãåé¢ãå¥DBã«ããããšã§äžããã³ãã®å€æŽãä»ã«åœ±é¿ãããªã¹ã¯ãäžããããŸããã»ãšãã©ã®ããã³ãã䌌ãŠãããªãtenant_idããŒã¹ã®å
±æã¢ãã«ã«ããŠãæ©èœãã©ã°ããªãã·ã§ãã«ãã£ãŒã«ãã§å·®åãæ±ãã®ãéçšé¢ã§æ¥œã§ããéèŠãªã®ã¯å
±æãšããã³ãåºæã®æææš©ãææ§ã«ããªãããšã§ãã
æ©ã段éã§ããã³ãå¢çç·ãèšèšããèªèšŒåŸã«ããã³ãã³ã³ããã¹ããã©ãã«ä¿åãããæ±ºããèªã¿æžãæã«å¿
ãããã䜿ãããã«ããŠãã ãããAppMasterã§ã¯éåžžãBusiness Processããžãã¯å
ã§èªèšŒæžã¿ãŠãŒã¶ãŒããtenant_idãèšå®ããŠããããã³ãææã¬ã³ãŒãã®äœæã»æ€çŽ¢ãè¡ãããšã§ããšã³ããã€ã³ããã¹ã³ãŒããå¿ããªãããã«ããŸãããã®ãã¿ãŒã³ãå
šäœã§åå©çšããããšãéèŠã§ãã
2ã€ã®ããã³ããäœæããŠé¡äŒŒããŒã¿ãçšæããã¬ã³ãŒãIDã ããå€ããŠèªã¿åãã»æŽæ°ã»åé€ã§ããªãã詊ããŠåé¢ãç Žããç®æãèŠã€ããŠãã ãããããã¯ã°ã©ãŠã³ããžã§ããã€ã³ããŒãããšã¯ã¹ããŒããæ£ããããã³ãã¹ã³ãŒãã«æžã蟌ãããšãå¿ ã確èªããŸãããŸããå®éã®ãµã³ãã«ããªã¥ãŒã ã§ããã³ãå¥ã¬ããŒããšç®¡çè åãã®ã°ããŒãã«ã¬ããŒããå®è¡ããŠæ§èœãšã¢ã¯ã»ã¹ã«ãŒã«ãæ€èšŒããŠãã ããã


