æŽå²çã«ãã³ã³ãã¥ãŒã¿ãŒã®éçºã¯ããŒã¿ããŒã¹ç®¡çã®åéã®é²æ©ãšäžŠè¡ããŠè¡ãããŸãã-ããã¯ãç 究è ãå®è·µè ã解決ããã¿ã¹ã¯ã®äžã§ãåä¿¡ããããŒã¿ã®åŠçãã³ã³ãã¯ãã¹ãã¬ãŒãžãæéã®æ€çŽ¢ã®ã¿ã¹ã¯ã«ãã£ãŠå€§ããªåœ¹å²ãæããããïŒãããŠçŸåšãç¶ç¶ããŠããïŒãšããäºå®ã«ãããã®ã§ãã
ãããã£ãŠãæè¡ã®é²æ©ã¯ãããã»ããµã®é»åãã¡ã¢ãªã®å¢å ããŸãã¯ããã€ã¹ãµã€ãºã®çž®å°ã®åéã ãã§ãªããããŒã¿å¹çã®æ¹åã®åéã§ãé²ã¿ãŸããã ãã®çµæãå€æ°ã®ç°ãªãããŒã¿ããŒã¹ç®¡çã·ã¹ãã ïŒDBMSïŒãç»å ŽããŸããã
åœç€Ÿã®è£œåã§ããå è€ã³ãŒãã¬ãŒãã³ãã¥ãã±ãŒã·ã§ã³ã¡ãã»ã³ãžã£ãŒã¯ãPostgreSQL DBMSã䜿çšããŠããŸãã ä»æ¥ãç§ãã¡ã¯ãã®çŽ æŽãããããŒã«ã®æŽå²ãæãåºããæ å ±æè¡ã®åéã§ã¹ã¿ãŒãã¢ããã«äœ¿çšããããšã®å©ç¹ã瀺ããããšæããŸãã
ãªã¬ãŒã·ã§ãã«ã¢ãã«ãšSQL
DBMSã®3ã€ã®äž»ãªæ¹åã¯ããããã®æ¹åã®åºç€ãšãªãããŸããŸãªããŒã¿ã¢ãã«ïŒãããã¯ãŒã¯ãéå±€ãããã³ãªã¬ãŒã·ã§ãã«ïŒã«ãã£ãŠäŒçµ±çã«åºå¥ãããŸãã
ãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã¯ãçŸåš3ã€ã®ååã®äžã§æã人æ°ããããé«åºŠãªãã®ã§ãããIBMã®åŸæ¥å¡ã§ããè±åœã®ç§åŠè Edgar Coddã«ãã£ãŠãåäžçŽã®60幎代åŸåã«æåã«éçºãããŸããã 1970幎ã«ã圌ã¯ãªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã«é¢ããæåã®ç 究ã§ãã倧èŠæš¡å ±æããŒã¿ãã³ã¯ã®ããŒã¿ã®ãªã¬ãŒã·ã§ãã«ã¢ãã«ãçºè¡šããŸããã
ãšãã¬ãŒã»ã³ããããªã¬ãŒã·ã§ãã«ããŒã¿ã¢ãã«ã®äœæè
Coddã¯ãããŒã¿ã«å¯ŸããŠå®è¡ã§ãã8ã€ã®åºæ¬æäœã®ã»ãããææ¡ãããã®ã»ããããªã¬ãŒã·ã§ãã«ä»£æ°ã®åºç€ãç¯ããŸãã ã åäžçŽã®70幎代åã°ã«Coddã«ãã£ãŠäœæããã代æ°ã«åºã¥ããŠã1986幎ã«æšæºåãããSQLãšåŒã°ãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ããŒã¿ãæäœããããã®ããã°ã©ãã³ã°èšèªãéçºããå§ããŸããïŒä»ã®å€ãã®ãã®ããããŸãïŒã
ããŒã¯ã¬ãŒã§ã®ç 究ïŒãã¹ãã°ã¬ã¹ã®åºçŸ
æåã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ç®¡çã·ã¹ãã ã®1ã€ã¯ãªãŒãã³Ingresã·ã¹ãã ã§ãããããã¯ããããžã§ã¯ããProject Rãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«é¢ããIBMã®åºçç©ã«èå³ãæã€ããã«ãªã£ãããŒã¯ã¬ãŒã®ç 究è ã«ãã£ãŠäœæãããç¬èªã®ã·ã¹ãã ãéçºããããšããŸããã Ingresã¯ã¯ãšãªã«SQL以å€ã®èšèªã䜿çšããŸãããããã¯QUELãšåŒã°ããŠããŸããã
ãã®åŸã以åIngresã®äœæã«æºãã£ãMichael Stonebreakerã¯ãããŒã¯ã¬ãŒã®åŠçãšäžç·ã«ãæ°ãããããžã§ã¯ã-Post In gres ïŒPostgresïŒãç«ã¡äžããŸããã æ°ããã·ã¹ãã ã¯1986幎ãã1995幎ã«ãããŠéçºãããQUELã®åŸç¶ã§ããPOSTQUELã¯ãšãªèšèªã䜿çšããŸããã
ãã€ã±ã«ã»ã¹ããŒã³ãã¬ã€ã«ãŒ
ãã®åŸãStonebreakerã¯ããã€ãã®DBMSäŒæ¥ãèšç«ããŸããïŒäŸïŒ Informixãè³Œå ¥ãã Illustra ã StreamBase Systems ãHPãè³Œå ¥ãã Vertica ã VoltDB ïŒã
Postgresã«åãçµãã 圌ã®åŠçã¯ãPOSTQUELãSQLã«çœ®ãæããããç¬èªã®ããŒãžã§ã³ã®ããŒã¿ããŒã¹ãäœæããŸããã ãã®ãããžã§ã¯ãã¯ããšããšPostgres95ãšåŒã°ããã«ãªãã©ã«ãã¢å€§åŠããŒã¯ã¬ãŒæ ¡ãç±ççãªããŒã ã®æã§ãã®éçºãè²æž¡ããåŸãçŸåšã®åå-PostgreSQL-ãååŸããŸããã
ããŒã¿ããŒã¹ãšã³ãžã³ã®åé¡ïŒNoSQLã®èªç
90幎代åŸåãã2000幎代åé ã«ãDBMSåžå Žã«ã¯ããªãã®æ°ã®äžè¬çãªããŒã¿ããŒã¹ãååšããç¶æ³ããããŸããããããããã«é倧ãªæ¬ ç¹ããããŸããã åçšã®OracleãIBM DB2ãããã³Microsoft SQL Serverã®å Žåããããã®æ¬ ç¹ã¯éåžžã«å€§ãããæã人æ°ã®ããç¡æã®MySQLãããžã§ã¯ãã¯æ©èœãå¶éãããŠããŸããïŒããšãã°ãã¹ãã¢ãããã·ãŒãžã£ãããªã¬ãŒããã¥ãŒã¯2005幎ã«ãã®DBMSã«ã®ã¿ç»å ŽããŸããïŒã
åæã«ãPostgreSQLã¯ããã®éçºè ãèšå€§ãªéãšäžè¬ã«éåžžã«é«å質ã®äœæ¥ãè¡ã£ããšããäºå®ã«ãããããããåæ¥ãããžã§ã¯ãã§ã®äœ¿çšãå¶éããé«éæ§ãšç®¡çã®å®¹æããèªæ ¢ã§ããŸããã§ããã
äžè¬ã«SQLãšãªã¬ãŒã·ã§ãã«ã¢ãã«ã䜿çšããæ¢åã®è£œåã®åé¡ã«ãããæ奜家ã¯ä»ã®æšæºã䜿çšããŠæ©èœããããŒã¿ããŒã¹ãäœæããããã«ãªããŸãããããã¯ãå ±éã®NoSQLã«ããŽãªã«çµåã§ãããããžã§ã¯ãã®æ°ã§ãã
å€ãã®NoSQLããŒã¿ããŒã¹ãç»å ŽããŸããïŒããã€ãã®æåãªäŸïŒMongoDBãRedisãRiakïŒã ãã®æ¹åæ§ã®éçºã¯ãæçåãšé«åºŠã«å°éåããã補åã®äœæã®ãã¹ã«æ²¿ã£ãŠè¡ãããŸããã
DBMSãšã¹ã¿ãŒãã¢ãã
å€æ°ã®æ°ããNoSQLéçºã®åºçŸã¯ãããæç¹ã§ã¹ã¿ãŒãã¢ããã®æ 床ãåŸæ¥ã®SQLã·ã¹ãã ã«å€ããŸãããITãããžã§ã¯ãã®äœæè ã¯ãITãããžã§ã¯ãã®äœæè ã«ãçŸä»£ã®åçã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããã®ãè€éãããå€ããå°é£ã§ãããšèªèãå§ããŸããã
ããããåŸã ã«ãNoSQLã«ããŽãªãŒã®DBMSã«ã¯æ¬¡ã®éèŠãªïŒãããŠéåžžã«äžå¿«ãªïŒããããã£ãããããšãæããã«ãªããŸãã-ãããã¯éåžžã«çãå®çŸ©ãããåé¡ã®ã¿ã解決ããã®ã«é©ããŠããŸãã ãã®ããããã£ã«ãããã¹ã¿ãŒãã¢ããã§ã®æ¡ä»¶ä»ãMongoDBã®äœ¿çšã¯éåžžã«å±éºãªã¹ãããã«ãªããŸãã-åæ段éã§ã¯ãæ¡ä»¶ä»ãMongoDBã¯ç¹å®ã®ç¯å²ã®ã¿ã¹ã¯ã«çæ³çãªéžæãããããŸããããã¹ã¿ãŒãã¢ããããã®æŠç¥ãå€å°å€æŽããç¬éïŒãããŠããã¯ã»ãšãã©åžžã«çºçããŸãïŒæ°ããå®åŒåã®åé¡ã解決ããã®ã«ããé©ããŠããŸãã ã»ãšãã©ã®å Žåããã®ä»ã®DBMSãžã®ã移åãã¯è€éãããŠè²»çšã®ãããæäœã«ãªããããåå¿è ã®ããžãã¹ã§ã¯ã§ããŸããã
äžæ¹ãNoSQLã«ããŽãªããã®DBMSã®æ¥éãªéçºã®éãåŸæ¥ã®ãªã¬ãŒã·ã§ãã«DBMSã®éçºè ãæ ããŠããŸããã§ããã ç¹ã«ãPostgreSQLã®äœæè ã¯ããããžã§ã¯ãã®çç£æ§ã管çã®å®¹æããææžåã«åãçµã¿ãŸããããã®çµæã2000幎代ã®çµããã«ããé«éœ¢è ã®ã²ããçããã倪éŒè ¹ã®bããããããã®ããã®éå±ã§ãããã«ããã¢ã³ãã£ãŒã¯ããŒã«ãããã ããã¯ãããžãŒãããã¹ã¿ãŒãã®æŠåšåº«ã
PostgreSQLããã³Katoã¡ãã»ã³ãžã£ãŒ
å è€ããŒã ã®éçºè ã¯ãããŸããŸãªãã¯ãããžãŒäŒæ¥ãã¹ã¿ãŒãã¢ããïŒ Rdioãããžã§ã¯ããªã©ïŒã§æ¡çšãããŠããã圌ãèªèº«ã®çµéšãããå€ãã®æ¢åã®DBMSã§äœæ¥ããããšã®é·æãšçæãæããŸããïŒãããŠããŒãããã·ã¹ãã ãæ§ç¯ããããšã«é¢é£ããã»ãšãã©ãã¹ãŠã®å¯èœæ§ã®ããçæãåæã«èžã¿ãŸããïŒã ãã®çµæããããžã§ã¯ãã®äœæ¥ãéå§ããããã«ãPostgreSQLãéžæããŸããã
åæ¥ãããžã§ã¯ãã§ã¯ãããŸããŸãªåŽé¢ãæ¡å€§ããè¯ãæ©äŒãæã€ããšãéåžžã«éèŠã§ãã åãããžã§ã¯ãã«ã¯ç¬èªã®åŽé¢ããããŸããããšãã°ãå è€ã§ã¯ãéšå±ã®ã¡ãã»ãŒãžå±¥æŽã®ããŒã¹ãã¹ã±ãŒãªã³ã°ããå¿ èŠããããŸãã
ããŒã¿ã¹ããŒãã®äžå€æ§ã¯ãNoSQLã®äžè¬çãªå©ç¹ã®1ã€ã§ãã PostgreSQLã®hstoreã¢ãžã¥ãŒã«ïŒã¡ãªã¿ã«Muscovites補ïŒã䜿çšãããšãããŒãšå€ãããŒãã«åã«æžã蟌ãããšãã§ããŸããããã«ãããéçºè ã¯æ°è£œåã®æ©èœãè¿œå ããããã»ã¹ã§ããŒã¿ã¹ããŒã ã絶ããå€æŽããå¿ èŠããªããªããŸãã åæã«ãã€ã³ããã¯ã¹ãäœæããæ©èœã¯æ®ããŸãã
PostgreSQL 9.2ã§ã¯ãæ°ããåJSONãå°å ¥ãããŠããŸã ã hstoreãšã¯ç°ãªããJSONåã¯ãã¹ããããæ§é ããµããŒããããããPostgreSQLã¯ããã¥ã¡ã³ããæäœããããã®äŸ¿å©ãªããŒã«ã«ãªããŸãã jsonbã¿ã€ãã§ã¯ãGINã€ã³ããã¯ã¹ãäœæã§ããããšãéèŠã§ããããã«ãããJSONãªããžã§ã¯ãããã°ããæ€çŽ¢ã§ããããã«ãªããŸãã
hstoreãšJSONåã®å°å ¥ã«ãããPostgreSQLããŒãã«å ã«NoSQLã¹ã¿ã€ã«ã®ããŒã¿ããŒã¹ãäœæã§ããããã«ãªããŸãããããã«ãããNoSQLãšSQLã®å©ç¹ãåæã«äœ¿çšã§ããŸãã
hstoreã¢ãžã¥ãŒã«ã®æ©èœã説æããããã®ããã€ãã®å žåçãªæäœã次ã«ç€ºããŸãã
hstoreæ¡åŒµæ©èœãšhstoreåã®åãæã€ããŒãã«ãäœæããŸãã
postgres=# create extension hstore; WARNING: => is deprecated as an operator name DETAIL: This name may be disallowed altogether in future versions of QL. CREATE EXTENSION postgres=# create table hstore_test (data hstore); CREATE TABLE
hstoreãšã³ããªãè¿œå ããŸãã2ã€ã®ããŒã¯ãå€ããhelloãã®ãaããšå€ããworldãã®ãbãã§ãã
postgres=# insert into hstore_test values (hstore(array['a', 'hello', 'b', 'world'])); INSERT 0 1 postgres=#
ããŒãaãã®å€ã確èªããŸãã
postgres=# SELECT data->'a' FROM hstore_test; ?column? ---------- hello (1 row) postgres=# â
ããŒãaããšãcããååšãããã©ããã確èªããŸãã
postgres=# select data ? 'a', data ? 'c' from hstore_test; ?column? | ?column? ----------+-------------- t | f (1 row)
ããŒãbãã®å€ãå€æŽããŸãã
postgres=# update hstore_test set data = data || ('b' => 'world!'); UPDATE 1 postgres=# select data->'b' from hstore_test; ?column? -------------- world! (1 row)
hstoreã¿ã€ãã®ãã¹ãŠã®æäœã¯ãPostgreSQLãããžã§ã¯ãããã¥ã¡ã³ãã®å¯Ÿå¿ããã»ã¯ã·ã§ã³ã§èª¬æãããŠããŸã ã
Katoã¡ãã»ã³ãžã£ãŒã§ã¯ãhstoreããŒãã«ã䜿çšããŠãã¢ã«ãŠã³ããã«ãŒã ãããŒã ãçµç¹ãªã©ã®ããŸããŸãªãªããžã§ã¯ãã®èšå®ãšå±æ§ãä¿åããŸãã
æŽå²ã®èŒª
ã¹ããŒãªãŒã¯èŒªã«ãªã£ãŠãããå€ãã®å Žåãããã¹ãŠãæ°ãã-ããã¯å¿ããããŠããããšãããã¬ãŒãºãçå®ã§ã-DBMSã®æ§ç¯ãšããŒã¿ã®æäœã«ãããå€ãã®çŸä»£ã®åŸåã¯ããªã¬ãŒã·ã§ãã«ã¢ãã«ã®äœæè ãšSQLéçºè ã«ãã£ãŠç解ãããäºæ³ãããŠããŸããã
PostgreSQLã¯ãäžçããªãŒãããå°é家ã®ç 究çµæã絶ããåãå ¥ããŠãããããžã§ã¯ãã®æšæºçãªäŸã§ãã ãã®çµæããã®DBMSã¯äžçš®ã®ãŠãããŒãµã«ãã¶ã€ããŒãšããŠæ©èœããã¹ã¿ãŒãã¢ããã¯ãã®è©³çŽ°ã䜿çšããŠãäºæããªãã¿ã¹ã¯ç¯å²ã®æ¡å€§ã«æ©ãŸãããããšãªããå®çšçãªåçšè£œåãéåžžã«è¿ éã«äœæã§ããŸãã