ã€ã³ã¿ãŒãããã«ã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã§ããŒãéžæããŠäœ¿çšããæ¹æ³ã«é¢ããç¬æçãªæèšããããããããŸãã çŽäºãããªããŒã«å€ããããšããããŸããèªç¶ããŒãŸãã¯äººå·¥ããŒã䜿çšããŸããïŒ æŽæ°ãŸãã¯UUIDãèªåã€ã³ã¯ãªã¡ã³ãããŸããïŒ
64æ¬ã®èšäºãèªãã§ã5åã®æ¬ã®ã»ã¯ã·ã§ã³ãããã£ãŠãIRCãšStackOverflowã«ã€ããŠããããã®è³ªåãããåŸãç§ïŒ
Joe "begriffs" Nelsonã«ããå
èšäºã®èè
ïŒããããºã«ã®ããŒã¹ã
çµã¿ç«ãŠãŠã察æŠçžæã調æŽã§ããããã«ãªããŸããã ããŒã«é¢ããå€ãã®çŽäºã¯ãå®éã«ã¯ãä»ã®äººã®èŠç¹ã®èª€è§£ã®ããã«çºçããŸãã
å
容
åé¡ãããã€ãã®éšåã«åããŠã¿ãŸããããæçµçã«ã¯åã³åéããŸãã ãŸãã質åãããŸã-ãããŒããšã¯äœã§ããïŒ
ãããŒããšã¯äœã§ããïŒ
ãã°ãã
äž»ããŒãå¿ããŠãããäžè¬çãªã¢ã€ãã¢ã«èå³ããããŸãã ããŒã¯ãè¡ã«éè€å€ãæããªãåã§ãã ããã«ãåã¯éå
äžå¯èœã«äžæã§ããå¿
èŠããããŸããã€ãŸããåã®ãµãã»ããã¯ããã»ã©äžæã§ã¯ãããŸããã
ããšãã°ãã«ãŒãã²ãŒã ã§ã«ãŒããã«ãŠã³ãããããã®ããŒãã«ãèããŠã¿ãŸãããã
CREATE TABLE cards_seen ( suit text, face text );
1ã€ã®ãããã远跡ããå ŽåïŒã€ãŸããéè€ããã«ãŒãããªãå ŽåïŒãã·ã£ããšé¡ã®çµã¿åããã¯äžæã§ãããåãã·ã£ããšé¡ãéè€ããŠããŒãã«ã«è¿œå ããããšã¯æãŸãããããŸããã ã«ãŒããããŒãã«ã«ããå Žåãç§ãã¡ã¯ãããèŠãŸãã;ãããªããã°ãç§ãã¡ã¯ãããèŠãŸããã§ããã
以äžã远å ããããšã«ããããã®å¶éãããŒã¿ããŒã¹ã«èšå®ã§ããŸãã
CREATE TABLE cards_seen ( suit text, face text, UNIQUE (suit, face) );
ããèªäœã§ã¯ã
suit
ïŒã·ã£ãïŒã
face
ïŒé¡ïŒããŠããŒã¯ã§ã¯ãªããåãã·ã£ããŸãã¯é¡ã§ç°ãªãã«ãŒããèŠãããšãã§ããŸãã
(suit, face)
äžæã§ãããåã
ã®åã¯äžæã§ã¯ãªãããããããã®çµã¿åããã¯æ¢çŽã§ããã
(suit, face)
ãããŒã§ãããšäž»åŒµã§ããŸãã
ããäžè¬çãªç¶æ³ã§ã¯ãã«ãŒãã®ããã€ãã®ãããã远跡ããå¿
èŠãããå Žåãæ°ãããã£ãŒã«ãã远å ããŠãã«ãŒããèŠãåæ°ãèšé²ã§ããŸãã
CREATE TABLE cards_seen ( suit text, face text, seen int );
ããªãã«
(suit, face, seen)
ã¯äžæã§ããããšã倿ããŸãããããµãã»ãã
(suit, face)
ãäžæã§ããå¿
èŠããããããããŒã§ã¯ãããŸããã ããã¯ãã·ã£ããšé¡ãåãã§ãå€ãç°ãªã2ã€ã®è¡ãç«¶åããæ
å ±ã«ãªãããã«å¿
èŠã§ãã ãããã£ãŠãããŒã¯
(suit, face)
ã§ããããã®ããŒãã«ã«ã¯ãã以äžããŒã¯ãããŸããã
äžææ§ã®å¶é
PostgreSQLã§ã¯ãäžæã®å¶çŽã远å ãã奜ãŸããæ¹æ³ã¯ãäŸã®ããã«çŽæ¥å®£èšããããšã§ãã å Žåã«ãã£ãŠã¯ãäžææ§å¶çŽã«æºæ ããããã«ã€ã³ããã¯ã¹ã䜿çšããå¿
èŠããããŸãããçŽæ¥åãåãããªãã§ãã ããã æ¢ã«äžæã§ãããšå®£èšãããŠããåã®ã€ã³ããã¯ã¹ãæåã§äœæããå¿
èŠã¯ãããŸããã ãã®ãããªã¢ã¯ã·ã§ã³ã¯ãã€ã³ããã¯ã¹ã®èªåäœæãåçŽã«è€è£œããŸãã
ãŸããããŒãã«ã«ã¯ããã€ãã®ããŒãåé¡ãªãååšããå¯èœæ§ããããããŒã¿ããŒã¹ã§ãããã®äžææ§ãç¶æããããã«
ãã¹ãŠã宣èšããå¿
èŠããããŸãã
以äžã«ãè€æ°ã®ããŒãæã€2ã€ã®ãµã³ãã«ããŒãã«ã瀺ããŸãã
ç°¡æœã«ããããã«ããã®äŸã«ã¯å®çšçãªä»ã®å¶éã¯ãããŸããã ããšãã°ãã«ãŒãã®ãã¥ãŒã®æ°ãè² ã§ãã£ãŠã¯ãªãããNULLã¯æ€æ»ãããåã®ã»ãšãã©ã«å¯ŸããŠç¡å¹ã§ãïŒNULLã¯ç¡éã瀺ãããšãã§ããçšã°ã«ãŒãã®
max_income
åãé€ãïŒã
äž»ããŒã®å¥åŠãªã±ãŒã¹
åã®ã»ã¯ã·ã§ã³ã§åã«ãããŒããšåŒãã ãã®ã¯ãéåžžãåè£ããŒããšåŒã°ããŸãã ãåè£ããšããçšèªã¯ããã®ãããªãã¹ãŠã®ããŒãããã©ã€ããªããŒãã®åèªãã圹å²ãããã£ãŠç«¶åããæ®ããã代æ¿ããŒãïŒä»£æ¿ããŒïŒãšããŠå²ãåœãŠãããããšãæå³ããŸãã
SQLå®è£
ãããŒãšãªã¬ãŒã·ã§ãã«ã¢ãã«ã®éã®äžäžèŽããªããã«ã¯æéãããããŸãããåæã®ããŒã¿ããŒã¹ã¯ãäž»ããŒã®äœã¬ãã«ã®æŠå¿µã«ãã£ãŠåŒ·åãããŸããã ãã®ãããªããŒã¿ããŒã¹ã®äž»ããŒã¯ãããŒã¿ãžã®é 次ã¢ã¯ã»ã¹ã§ã¡ãã£ã¢äžã®æååã®ç©ççãªå Žæãèå¥ããããã«å¿
èŠã§ããã Joe Selcoã説æããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
ãããŒããšããçšèªã¯ãã·ãªã¢ã«ãã¡ã€ã«ã·ã¹ãã ã§åŠçæäœãå®è¡ããããã«å¿
èŠãªãã¡ã€ã«ãœãŒãããŒãæå³ããŠããŸããã ãã³ãã«ãŒãã®ã»ããã¯ããã£ã1ã€ã®é åºã§èªã¿åãããŸããã ãæ»ããããšã¯äžå¯èœã§ããã æåã®ããŒããã©ã€ãã¯åãåäœãã·ãã¥ã¬ãŒãããåæ¹åã¢ã¯ã»ã¹ãèš±å¯ããŸããã§ããã ã€ãŸããå
ã®Sybase SQL Serverãåã®è¡ãèªã¿åãã«ã¯ãããŒãã«ãå
é ã«ãå·»ãæ»ããå¿
èŠããããŸããã
çŸä»£ã®SQLã§ã¯ãæ
å ±ã®ç©çç衚çŸã«çŠç¹ãåœãŠãå¿
èŠã¯ãªããããŒãã«ã¢ãã«ã®é¢ä¿ãšå
éšè¡ã®é åºã¯ãŸã£ããéèŠã§ã¯ãããŸããã ãã ããçŸåšã§ããSQLãµãŒããŒã¯æ¢å®ã§äž»ããŒã®ã¯ã©ã¹ã¿ãŒåã€ã³ããã¯ã¹ãäœæããå€ãäŒçµ±ã«åŸã£ãŠãè¡ã®é åºãç©ççã«é
眮ããŸãã
ã»ãšãã©ã®ããŒã¿ããŒã¹ã§ã¯ãäž»ããŒã¯éå»ã®éºç©ãšããŠä¿æãããŠãããç©ççãªå Žæã®åæ ãŸãã¯æ±ºå®ä»¥å€ã«ã¯ã»ãšãã©äœãæäŸããŸããã ããšãã°ãPostgreSQLããŒãã«ã§ã¯ãäž»ããŒã宣èšãããšãèªåçã«NOT NULLå¶çŽã課ãããããã©ã«ãã®å€éšããŒãå®çŸ©ãããŸãã äž»ããŒã¯ãJOINæŒç®åã®åªå
åã§ããããŸãã
äž»ããŒã¯ãä»ã®ããŒã®å®£èšãæé€ããŸããã åæã«ããã©ã€ããªãšããŠããŒãå²ãåœãŠãããŠããªãå ŽåãããŒãã«ã¯åŒãç¶ãæ£åžžã«æ©èœããŸãã ãããã«ãããé·ã¯ããªããæã€ããšã¯ãããŸããã
èªç¶ããŒã®æ€çŽ¢
äžèšã§èª¬æããããŒã¯ã誰ãããŒãäœæããããªãå Žåã§ããã¢ãã«åããããªããžã§ã¯ãã®ããããã£ã§ããããããããã¥ã©ã«ããšåŒã°ããŸãã
èããããèªç¶ããŒã«ã€ããŠããŒãã«ã調ã¹ããšãã«æåã«èŠããŠããã¹ãããšã¯ãããŸãã¹ããŒãã«ãªããªãããã«ããããšã§ãã StackExchangeã®sqlvogelãŠãŒã¶ãŒã¯ã次ã®ã¢ããã€ã¹ãæäŸããŸãã
äžéšã®äººã
ã¯ãç¹å®ã®ããŒãäžæã§ã¯ãªããšããä»®æ³çãªç¶æ³ã«é¥ãããããèªç¶ãªãããŒãéžæããã®ãå°é£ã§ãã 圌ãã¯ã¿ã¹ã¯ã®æå³ãã®ãã®ãçè§£ããŠããŸããã ããŒã®æå³ã¯ãç¹å®ã®ããŒãã«ã§å±æ§ãåžžã«äžæã§ãããåžžã«äžæã§ããã«ãŒã«ã決å®ããããšã§ãã ããŒãã«ã«ã¯ãç¹å®ã®ååã«çè§£ãããã³ã³ããã¹ãïŒãäž»é¡é åããŸãã¯ãè«è©±é åãïŒã®ããŒã¿ãå«ãŸããå¯äžã®å€ã¯ãã®ç¹å®ã®é åã§ã®å¶éã®é©çšã§ãã
ç·Žç¿ã¯ãåãæ¢åã®å€ã§äžæã§ãããå¯èœæ§ã®ããã·ããªãªã§ã¯ããã§ããå ŽåãããŒå¶çŽãå
¥åããå¿
èŠãããããšã瀺ããŠããŸãã ãŸããå¿
èŠã«å¿ããŠãå¶éãåé€ã§ããŸãïŒãããæ°ã«ãªãå Žåã¯ã以äžã«ããŒã®å®å®æ§ã«ã€ããŠèª¬æããŸãïŒã
ããšãã°ãè¶£å³ã¯ã©ãã®ã¡ã³ããŒã®ããŒã¿ããŒã¹ã¯ãfirst_nameãlast_nameã®2ã€ã®åã«äžææ§ãæã£ãŠããå ŽåããããŸãã å°éã®ããŒã¿ã§ã¯ãéè€ã¯ã»ãšãã©ãããŸãããå®éã®ç«¶åãçºçããåã«ããã®ãããªããŒã䜿çšããããšã¯éåžžã«åççã§ãã
ããŒã¿ããŒã¹ã®æé·ãšæ
å ±éã®å¢å ã«ãããèªç¶ããŒã®éžæã¯ããå°é£ã«ãªãå¯èœæ§ããããŸãã æ ŒçŽããããŒã¿ã¯å€éšã®çŸå®ãåçŽåãããã®ã§ããã座æšãæéãšãšãã«å€åãããªã©ãäžçã®ãªããžã§ã¯ããåºå¥ããããã€ãã®åŽé¢ã¯å«ãŸããŠããŸããã ãªããžã§ã¯ãã«ã³ãŒãããªãå Žåã空éå
ã®äœçœ®ãŸãã¯ééãŸãã¯ããã±ãŒãžã®ããããªéããé€ããŠã2猶ã®é£²æãŸãã¯2ç®±ã®ãªãŒãããŒã«ãåºå¥ããæ¹æ³ã¯ïŒ
ããããæšæºåå£äœã補åã«ç¬ç¹ã®ã©ãã«ãäœæããŠè²Œãçç±ã§ãã è»ã«ã¯è»äž¡èå¥çªå·ïŒVINïŒãå»å°ãããISBNã¯æ¬ã«å°å·ãããUPCã¯é£åã®å
è£
ã«å»å°ãããŠããŸãã ãããã®æ°å€ã¯èªç¶ãªãã®ã§ã¯ãªããšäž»åŒµãããããããŸããã ã§ã¯ããªãããããèªç¶ããŒãšåŒã¶ã®ã§ããïŒ
ããŒã¿ããŒã¹å
ã®äžæã®ããããã£ã®èªç¶æ§ãŸãã¯äººå·¥æ§ã¯ãå€éšã®äžçã«é¢é£ããŠããŸãã æšæºåå£äœãŸãã¯åœå®¶æ©é¢ã§äººå·¥çã«äœæãããããŒã¯ãäžçäžã§æšæºã«ãªãããªããžã§ã¯ãã«å°å·ããããããç§ãã¡ã«ãšã£ãŠèªç¶ã«ãªããŸãã
é貚ãèšèªãéèååãååŠè¬åãå»ç蚺æãªã©ãããŸããŸãªæœèšã«ã¯å€ãã®æ¥çã瀟äŒãããã³åœéèŠæ ŒããããŸãã 以äžã¯ãèªç¶ããŒãšããŠãã䜿çšãããå€ã®äžéšã§ãã
- ISO 3166ã«æºæ ããåœã³ãŒã
- ISO 639èšèªã³ãŒã
- ISO 4217ã«æºæ ããé貚ã³ãŒã
- 亀ææå®ISIN
- UPC / EANãVINãGTINãISBN
- ãŠãŒã¶ãŒå
- ã¡ãŒã«ã¢ãã¬ã¹
- éšå±çªå·
- ãããã¯ãŒã¯MACã¢ãã¬ã¹
- ïŒç·¯åºŠãçµåºŠïŒå°çã®è¡šé¢äžã®ãã€ã³ã
å¯èœãã€åŠ¥åœãªå Žåã¯ããŒã宣èšããããšããå§ãããŸããããŒãã«ããšã«ããã€ãã®ããŒã宣èšããããšãã§ããŸãã ãã ããäžèšã®ãã¹ãŠã«äŸå€ãããå Žåãããããšã«æ³šæããŠãã ããã
- ãã¹ãŠã®äººãé»åã¡ãŒã«ã¢ãã¬ã¹ãæã£ãŠããããã§ã¯ãããŸããããç¶æ³ã«ãã£ãŠã¯ããŒã¿ããŒã¹ã®äœ¿çšã蚱容ãããå ŽåããããŸãã ããã«ã人ã
ã¯ã¡ãŒã«ã¢ãã¬ã¹ãæã
倿ŽããŸãã ïŒããŒã®å®å®æ§ã«ã€ããŠã¯åŸã§è©³ãã説æããŸããïŒ
- ISIN亀æã·ã³ãã«ã¯æã
倿ŽãããŸããããšãã°ãGOOGããã³GOOGLã·ã³ãã«ã¯ãGoogleããã¢ã«ãã¡ããããžã®äŒç€Ÿã®åç·šæãæ£ç¢ºã«èª¬æããŠããŸããã TWTRãTWTRQãªã©ã§æ··ä¹±ãçããå Žåããããäžéšã®æè³å®¶ã¯IPO Twitterã§èª€ã£ãŠåŸè
ã賌å
¥ããŸããã
- 瀟äŒä¿éçªå·ã¯ç±³åœåžæ°ã®ã¿ã䜿çšãããã©ã€ãã·ãŒã®å¶éããããæ»äº¡åŸã«åå©çšãããŸãã ããã«ãããã¥ã¡ã³ããçãã åŸã人ã
ã¯æ°ããçªå·ãååŸã§ããŸãã æåŸã«ãåãçªå·ã§åäººãšæåŸçšã®èå¥åã®äž¡æ¹ãèå¥ã§ããŸãã
- éµäŸ¿çªå·ã¯éœåžã«ã¯é©ããŠããŸããã äžéšã®éœåžã«ã¯å
±éã®ã€ã³ããã¯ã¹ããããéããŸãåæ§ã§ãã1ã€ã®éœåžã«ã¯è€æ°ã®ã€ã³ããã¯ã¹ããããŸãã
人工ããŒ
ããŒãåè¡ã«äžæã®å€ãæã€åã§ããå Žåããããäœæããæ¹æ³ã®1ã€ã¯ããŒãã§ã-åè¡ã«ç¬èªã®äžæã®å€ãæžã蟌ãããšãã§ããŸãã ãããã¯äººå·¥çãªããŒã§ããããŒã¿ãŸãã¯ãªããžã§ã¯ããåç
§ããããã«äœ¿çšãããçºæãããã³ãŒãã
ã³ãŒããããŒã¿ããŒã¹èªäœããçæãããããŒã¿ããŒã¹ãŠãŒã¶ãŒä»¥å€ã®èª°ã«ãç¥ãããªãããšãéåžžã«éèŠã§ãã ãããã人工ããŒãšæšæºåãããèªç¶ããŒãåºå¥ãããã®ã§ãã
èªç¶ããŒã®å©ç¹ã¯ãããŒãã«è¡ã®éè€ãŸãã¯äžæŽåããä¿è·ããããšã§ããäžæ¹ã人çºçãªããŒã¯ãæååïŒãŸãã¯è€æ°åïŒæ¯èŒã䜿çšããªãããã人ãä»ã®ã·ã¹ãã ãè¡ãåç
§ãããããªããæ€çŽ¢ããã³çµåæäœã®é床ãåäžãããã䟿å©ã§ãããŒã
代ç
人工ããŒã¯ãã€ã³ãã£ã³ã°ãšããŠäœ¿çšãããŸã-ã«ãŒã«ãšåã®å€æŽã«é¢ä¿ãªãã1è¡ã¯åžžã«åãæ¹æ³ã§èå¥ã§ããŸãã ãã®ç®çã§äœ¿çšããã人工ããŒã¯ã代çããŒããšåŒã°ããç¹å¥ãªæ³šæãå¿
èŠã§ãã 以äžã§æ€èšãããµãã²ãŒãã
é代ç人工ããŒã¯ãããŒã¿ããŒã¹
å€ã®è¡ãåç
§ããã®ã«åœ¹ç«ã¡ãŸãã 人工ããŒã¯ãããŒã¿ãŸãã¯ãªããžã§ã¯ããç°¡åã«èå¥ããŸããURLãšããŠæå®ããããã¢ã«ãŠã³ãã«æ·»ä»ããããé»è©±ã§å£è¿°ããããéè¡ã§åãåã£ããããã³ããŒãã¬ãŒãã«å°å·ãããã§ããŸãã ïŒç§ãã¡ã®è»ã®ãã³ããŒãã¬ãŒãã¯èªç¶ãªããŒã§ãããããã¯åœå®¶ã«ãã£ãŠäººå·¥ããŒãšããŠèšèšãããŠããŸããïŒ
å
¥åãã¹ããšã©ãŒãæå°éã«æããããã«ãèããããéä¿¡æ¹æ³ãèæ
®ããŠã人工ããŒãéžæããå¿
èŠããããŸãã ããŒã®çºé³ãå°å·ãSMSã«ããéä¿¡ãææžãã®èªã¿åããããŒããŒãããã®å
¥åãURLãžã®åã蟌ã¿ãå¯èœã§ãã ããã«ãã¯ã¬ãžããã«ãŒãçªå·ãªã©ã®äžéšã®äººå·¥ããŒã«
ã¯ãã§ãã¯ãµã ãå«ãŸããŠ
ãããããç¹å®ã®ãšã©ãŒãçºçãããšãã«å°ãªããšããšã©ãŒãèªèã§ããŸãã
äŸïŒ
- ç±³åœã®ãã³ããŒãã¬ãŒãã«ã¯ã
O
ã0
ãªã©ã®ãããŸããªèšå·ã䜿çšããããã®ã«ãŒã«ããã0
ã - å»åž«ã®ææžããèæ
®ããŠãç
é¢ãšè¬å±ã¯ç¹ã«æ³šæããå¿
èŠããããŸãã
- SMS確èªã³ãŒããæž¡ããŸããïŒ GSM 03.38æåã»ãããè¶
ããªãã§ãã ããã
- ä»»æã®ãã€ãããŒã¿ããšã³ã³ãŒãããBase64ãšã¯ç°ãªãã Base32ã¯ãå€ãã³ã³ãã¥ãŒã¿ãŒã·ã¹ãã ã§äœ¿çšããã³åŠçããã®ã«äŸ¿å©ãªå¶éãããæåã»ããã䜿çšããŸãã
- Proquintsã¯ãèªã¿åãå¯èœãæžã蟌ã¿å¯èœãââããã³é³å£°èå¥åã§ãã ãããã¯ãæç¢ºã«çè§£ãããåé³ãšæ¯é³ã®çºé³ãããïŒPROã§çºé³ã§ããªãïŒ5ïŒQUINT-upletsïŒã§ãã
人工ããŒã«äžçã玹ä»ãããšããã«ã人ã
ã¯å¥åŠãªæ¹æ³ã§ç¹å¥ãªæ³šæãæãå§ããããšã«æ³šæããŠãã ããã ãæ³¥æ£ãã®ãã³ããŒãã¬ãŒããŸãã¯çºé³å¯èœãªèå¥åãäœæããããã®ã·ã¹ãã ãèŠãŠãã ãããããã¯æªåé«ã
cursesã®èªåçæããã°ã©ã ã«ãªããŸãã ã
æ°åããŒã«éå®ããŠãã
13éã®ãããªã¿ããŒããããŸãã ããã¯ã€ã³ãã¯çºé³ãããé³ç¯ã«é¢ããæ
å ±ã®å¯åºŠãé«ããšããäºå®ã«ãããããããæ°åãå€ãã®å Žåã«é©ããŠããŸãïŒURLããã³ããŒããŒããææžãå
¥åã§ã¯ãããŒãæ°åã®ã¿ã§æ§æãããŠããããšãåä¿¡è
ãç¥ã£ãŠããå Žåã
ãã ãããªãœãŒã¹ïŒ
/videos/1.mpeg
ãªã©ïŒã
/videos/2.mpeg
ãããçªå·ã«é¢ããæ
å ±ã®æŒãããäœæãããã§ãããããå
¬çã«ã¢ã¯ã»ã¹å¯èœãªæ°åããŒã§é çªã䜿çšããªãã§ãã ãããããŒã¿ã Feistelãããã¯ãŒã¯ãäžé£ã®æ°åã§ãªãŒããŒã¬ã€ããäžææ§ãä¿æããªãããæ°åã®é åºãé ããŸãã
PostgreSQL wikiã«ã¯ã
æ¬äŒŒæå·å颿°ã®äŸããããŸãã
CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE int) returns int AS $$ DECLARE l1 int; l2 int; r1 int; r2 int; i int:=0; BEGIN l1:= (VALUE >> 16) & 65535; r1:= VALUE & 65535; WHILE i < 3 LOOP l2 := r1; r2 := l1
ãã®é¢æ°ã¯ããèªäœãšã¯éã§ãïŒã€ãŸãã
pseudo_encrypt(pseudo_encrypt(x)) = x
ïŒã 颿°ã®æ£ç¢ºãªåçŸã¯ããããŸããã«ããäžçš®ã®ã»ãã¥ãªãã£ã§ãããPostgreSQLã®ããã¥ã¡ã³ãããFeistelãããã¯ãŒã¯ã䜿çšããŠããããšã«æ°ä»ãã人ã¯ãå
ã®ã·ãŒã±ã³ã¹ãç°¡åã«ååŸã§ããŸãã ãã ãã
(((1366 * r1 + 150889) % 714025) / 714025.0)
代ããã«ã0ãã1ã®å€ã®ç¯å²ã§å¥ã®é¢æ°ã䜿çšã§ããŸããããšãã°ãåã®åŒã®æ°å€ã詊ããŠãã ããã
pseudo_encryptã®äœ¿ç𿹿³ã¯æ¬¡ã®ãšããã§ãã
CREATE SEQUENCE my_table_seq; CREATE TABLE my_table ( short_id int NOT NULL DEFAULT pseudo_encrypt( nextval('my_table_seq')::int ),
ãã®ãœãªã¥ãŒã·ã§ã³ã¯ã
short_id
åã«ã©ã³ãã ãªå€ãä¿åããŸãããé«ãããŒã¿åŠçé床ãç¶æããããšãéèŠãªå Žåã¯ãå¢åã·ãŒã±ã³ã¹èªäœãããŒãã«ã«ä¿åãã
pseudo_encrypt
衚瀺ãããšãã«å€æ
pseudo_encrypt
ãŸãã åŸã§èŠãããã«ãã©ã³ãã åãããå€ã«ã€ã³ããã¯ã¹ãä»ãããšãé²é³ããªã¥ãŒã ãå¢å ããå¯èœæ§ããããŸãã
åã®äŸã§ã¯ãéåžžãµã€ãºã®æŽæ°å€ã
bigint
ã«äœ¿çšãããŸãã
bigint
ã
XTEAãªã©ã®ä»ã®Feistel颿°ããããŸãã
æŽæ°ã®ã·ãŒã±ã³ã¹ãæ··åããå¥ã®æ¹æ³ã¯ããããçãæååã«å€æããããšã§ãã
pg_hashidsæ¡åŒµæ©èœã䜿çšããŠã¿ãŠãã ããã
CREATE EXTENSION pg_hashids; CREATE SEQUENCE my_table_seq; CREATE TABLE my_table ( short_id text NOT NULL DEFAULT id_encode( nextval('my_table_seq'), ' long string as table-specific salt ' ),
ããã§ããæŽæ°ãã®ãã®ãããŒãã«ã«æ ŒçŽããå¿
èŠã«å¿ããŠå€æããæ¹ãé«éã§ãããããã©ãŒãã³ã¹ã枬å®ããæ¬åœã«æå³ããããã©ããã確èªããŸãã
ããŠã人工ããŒãšèªç¶ããŒã®æå³ãæç¢ºã«åºå¥ãããšããèªç¶å¯Ÿäººå·¥ãè«äºã¯èª€ã£ãäºåæ³ã§ããããšãããããŸãã 人工ããŒãšèªç¶ããŒã¯ãäºããæé€ããŸããïŒ 1ã€ã®ããŒãã«ã«äž¡æ¹ãããå ŽåããããŸãã å®éã人工ããŒã®ããããŒãã«ã¯èªç¶ããŒãæäŸããå¿
èŠããããŸãããèªç¶ããŒããªãå Žåã¯ãŸãã«äŸå€ããããŸãïŒããšãã°ãã¯ãŒãã³ã³ãŒãã³ãŒãã®ããŒãã«å
ïŒã
人工ããŒããããèªç¶ããŒãååšãããšãã«å®£èšããªãå ŽåãåŸè
ãä¿è·ããªãã§ãã ããã
CREATE TABLE cars ( car_id bigserial NOT NULL, vin varchar(17) NOT NULL, year int NOT NULL, UNIQUE (car_id)
远å ã®ããŒã宣èšããããšã«å¯Ÿããå¯äžã®è°è«ã¯ãããããã®æ°ããããŒãå¥ã®äžæã®ã€ã³ããã¯ã¹ãä¿æããããŒãã«ãžã®æžã蟌ã¿ã³ã¹ããå¢å ãããããšã§ãã ãã¡ãããããã¯ããªãã«ãšã£ãŠããŒã¿ã®æ£ç¢ºããã©ãã»ã©éèŠãã«ãã£ãŠç°ãªããŸãããã»ãšãã©ã®å ŽåãããŒã¯ãŸã 宣èšãã䟡å€ããããŸãã
ãŸããããããã°ãããã€ãã®äººå·¥çãªããŒã宣èšãã䟡å€ããããŸãã ããšãã°ãçµç¹ã«ã¯å¿åè
ãšåŸæ¥å¡ãããŸãã ååŸæ¥å¡ã¯ãã€ãŠåè£è
ã§ããããåŸæ¥å¡ã®ããŒã§ãããç¬èªã®èå¥åã§åè£è
ãåç
§ããŸãã å¥ã®äŸãšããŠãåŸæ¥å¡IDãšãã°ã€ã³åãEmployeesã®2ã€ã®ããŒãšããŠèšå®ã§ããŸãã
代çããŒ
ãã§ã«è¿°ã¹ãããã«ãéèŠãªã¿ã€ãã®äººå·¥ããŒã¯ã代çããŒããšåŒã°ããŸãã ä»ã®äººå·¥ããŒã®ããã«ç°¡æœã§è»¢éå¯èœã§ããå¿
èŠã¯ãããŸããããåžžã«æååãèå¥ããå
éšã©ãã«ãšããŠäœ¿çšãããŸãã SQLã§äœ¿çšãããŸãããã¢ããªã±ãŒã·ã§ã³ã¯æç€ºçã«ã¢ã¯ã»ã¹ããŸããã
PostgreSQLã®
ã·ã¹ãã ã«ã©ã ïŒã·ã¹ãã ã«ã©ã ïŒã«ç²ŸéããŠããå Žåããµãã²ãŒãã¯ã»ãšãã©ããŒã¿ããŒã¹å®è£
ãã©ã¡ãŒã¿ãŒïŒctidãªã©ïŒã§ãããšèããããšãã§ããŸããã倿Žã¯ãããŸããã ãµãã²ãŒãå€ã¯è¡ããšã«1åéžæããããã®åŸã¯å€æŽãããŸããã
代çããŒã¯å€éšããŒãšããŠåªããŠãããã«ã¹ã±ãŒãã®
ON UPDATE RESTRICT
å¶çŽã¯ã代çã®äžå€æ§ãšäžèŽããããã«æå®ããå¿
èŠããããŸãã
äžæ¹ãå
¬çã«éä¿¡ãããããŒã«å¯Ÿããå€éšããŒã¯ãæå€§éã®æè»æ§ãæäŸããããã«
ON UPDATE CASCADE
ãšããŒã¯ããå¿
èŠããããŸãã ïŒã«ã¹ã±ãŒãæŽæ°ã¯ããããåãå·»ããã©ã³ã¶ã¯ã·ã§ã³ãšåã
åé¢ã¬ãã«ã§å®è¡ããããããåæã¢ã¯ã»ã¹ã®åé¡ãå¿é
ããå¿
èŠã¯ãããŸãããå³å¯ãªåé¢ã¬ãã«ãéžæãããšãããŒã¿ããŒã¹ã察åŠããŸããïŒ
代çããŒããèªç¶ãã«ããªãã§ãã ããã , , , ( ), . - .
, , , .
bigint
«bigserial»,
IDENTITY
. ( , PostgreSQL 10 , Oracle, IDENTITY, .
CREATE TABLE .)
, , . , .
:
- 1 , . , , , , JOIN . ( , , , .)
nextval()
SQL, , .- , , , .
- , . , , - . .
- ( , ) -.
UUID
: (128-), . (universally unique identifier, UUID) , .
, UUID , ? , !
PostgreSQL? , , , .
, . , UUID â , : 5bd68e64-ff52-4f54-ace4-3cd9161c8b7f. , (128-) uuid, PostgreSQL
bigint, .., , .
UUID , , ? , , ( ) UUID. , UUID , SQL psql , . , .
UUID , (write amplification) - (write-ahead log, WAL). , UUID.
write amplification. , . PostgreSQL , «» . , . PostgreSQL , .
PostgreSQL / / , (write-ahead log), . UUID ( 4 8 ) WAL . (full-page write, FPW).
UUID (, «snowflake» Twitter
uuid_generate_v1()
uuid-ossp PostgreSQL) . FPW.
FPW UUID, WAL. .
- EC2 ami-aa2ea6d0
- Ubuntu Server 16.04 LTS (HVM)
- EBS General Purpose (SSD)
- c3.xlarge
- vCPU: 4
- RAM GiB: 7.5
- Disk GB: 2 x 40 (SSD)
- PostgreSQL,
- , :
- max_wal_size='10GB';
- checkpoint_timeout='2h';
- synchronous_commit='off';
:
CREATE EXTENSION "uuid-ossp"; CREATE EXTENSION pgcrypto; CREATE TABLE u_v1 ( u uuid PRIMARY KEY ); CREATE TABLE u_crypto ( u uuid PRIMARY KEY );
, UUID , write-ahead log.
SELECT pg_walfile_name(pg_current_wal_lsn());
, WAL . , :
pg_waldump
:
- UUID,
gen_random_uuid()
( pgcrypto ) uuid_generate_v1()
( [uuid-ossp] (https://www.postgresql.org/docs/10/static/uuid-ossp.html)gen_random_uuid()
, full_page_writes='off'
. , FPW.
2
20 UUID , , , .
:
UUIDWAL :
gen_random_uuid()
N (%) (%) FPI (%)
---- - --- ----------- --- -------- ---
XLOG 260 ( 0.15) 13139 ( 0.09) 484420 ( 30.94)
Heap2 765 ( 0.45) 265926 ( 1.77) 376832 ( 24.07)
Heap 79423 ( 46.55) 6657121 ( 44.20) 299776 ( 19.14)
Btree 89354 ( 52.37) 7959710 ( 52.85) 404832 ( 25.85)
uuid_generate_v1()
N (%) (%) FPI (%)
---- - --- ----------- --- -------- ---
XLOG 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Heap2 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Heap 104326 ( 49.88) 7407146 ( 44.56) 0 ( 0.00)
Btree 104816 ( 50.12) 9215394 ( 55.44) 0 ( 0.00)
gen_random_uuid() with fpw=off
N (%) (%) FPI (%)
---- - --- ----------- --- -------- ---
XLOG 4 ( 0.00) 291 ( 0.00) 64 ( 0.84)
Heap2 0 ( 0.00) 0 ( 0.00) 0 ( 0.00)
Heap 107778 ( 49.88) 7654268 ( 46.08) 0 ( 0.00)
Btree 108260 ( 50.11) 8956097 ( 53.91) 7556 ( 99.16)
,
gen_random_uuid
WAL - (full-page images, FPI), . , . FPW , , .
, ZFS FPW, .
uuid_generate_v1()
â . uuid-ossp , RDS Citus Cloud, .
uuid_generate_v1:
MAC- . , UUID , , , , .
, , . - ,
uuid_generate_v1mc()
, mac- .
, , .
:
- .
<table_name>_id
uuid
uuid_generate_v1()
. . , JOIN, .. JOIN foo USING (bar_id)
JOIN foo ON (foo.bar_id = bar.id)
. .- , JOIN, .
- , URL . pg_hashids, .
ON UPDATE RESTRICT
, UUID , â ON UPDATE CASCADE
. , .
, . , - . , « » .
. -, , , - ,
++ , 8 , DevOps .
.