ããã«å¯Ÿããçãã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®åªäœæ§ã«ææŠããããã«èšèšãããã軜éã§é«æ§èœãªããŒã¿ããŒã¹ã®æ°äžä»£ã§ããã
NoSQLã®åãã®å€§ããªçç±ã¯ãWebããšã³ã¿ãŒãã©ã€ãºãã¯ã©ãŠãã¢ããªã±ãŒã·ã§ã³ã®å®è£ ãç°ãªããšããŒã¿ããŒã¹ã®èŠä»¶ãç°ãªããšããäºå®ã§ããã
äŸïŒeBayãAmazonãTwitterãFacebookãªã©ã®å€§åãµã€ãã®å Žåãã¹ã±ãŒã©ããªãã£ãšé«å¯çšæ§ã¯åŠ¥åã§ããªãéèŠãªèŠä»¶ã§ãã ãããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããããªåæã§ãçµæžçã«å€§ããªåœ±é¿ãããã顧客ã®ä¿¡é Œã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
ãããã£ãŠãæ¢è£œã®ããŒã¿ããŒã¹ãœãªã¥ãŒã·ã§ã³ã§ã¯ããã©ã³ã¶ã¯ã·ã§ã³ã®æŽåæ§ã®åé¡ã ãã§ãªããããŒã¿éã®å¢å ãããŒã¿ã®é床ãšããã©ãŒãã³ã¹ã®åäžãããŸããŸãªåœ¢åŒã®å¢å ã解決ããå¿ èŠããããŸãã äžèšã®1ã€ãŸãã¯2ã€ã®åŽé¢ã®æé©åã«ç¹åããä»ã®åŽé¢ãç ç²ã«ããæ°ããæè¡ãç»å ŽããŸããã JSONã䜿çšããPostgresã¯ããŠãŒã¶ãŒã®ããŒãºã«å¯ŸããŠããå æ¬çãªã¢ãããŒããåããã»ãšãã©ã®NoSQLã¯ãŒã¯ããŒããæ£åžžã«è§£æ±ºããŸãã
ããã¥ã¡ã³ãæå/ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®æ¯èŒ
æ°ãããã¯ãããžãŒã®ã¹ããŒããªã¢ãããŒãã¯ãããŒãºã綿å¯ã«è©äŸ¡ãããããã®ããŒãºãæºããããã«å©çšã§ããããŒã«ã«äŸåããŠããŸãã 以äžã®è¡šã¯ãéãªã¬ãŒã·ã§ãã«ããã¥ã¡ã³ãæåããŒã¿ããŒã¹ïŒMongoDBãªã©ïŒã®ç¹æ§ãšPostgresãªã¬ãŒã·ã§ãã«/ããã¥ã¡ã³ãæåããŒã¿ããŒã¹ã®ç¹æ§ãæ¯èŒããŠãããŒãºã«åã£ãé©åãªãœãªã¥ãŒã·ã§ã³ãèŠã€ããã®ã«åœ¹ç«ã¡ãŸãã
ç¹åŸŽ | ã¢ã³ãŽãã | PostgreSQL |
ãªãŒãã³ãœãŒã¹éçºã®éå§ | 2009 | 1995 |
ã¹ããŒã | ãã€ããã㯠| éçããã³åç |
éå±€ããŒã¿ã®ãµããŒã | ã¯ã | ã¯ãïŒ2012幎以éïŒ |
ããŒã€ãã³ãããŒã¿ã®ãµããŒã | ã¯ã | ã¯ãïŒ2006幎以éïŒ |
ãªã¬ãŒã·ã§ãã«ããŒã¿/æ£èŠåããããã©ãŒã ã¹ãã¬ãŒãžã®ãµããŒã | ãã | ã¯ã |
ããŒã¿ã®å¶é | ãã | ã¯ã |
ããŒã¿ãã§ãã¬ãŒã·ã§ã³ãšå€éšã㌠| ãã | ã¯ã |
匷åãªã¯ãšãªèšèª | ãã | ã¯ã |
è€æ°ããŒãžã§ã³ã®ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒããšç«¶åã¢ã¯ã»ã¹ç®¡ç | ãã | ã¯ã |
ã¢ãããã¯ãã©ã³ã¶ã¯ã·ã§ã³ | ããã¥ã¡ã³ãå | ããŒã¹å šäœ |
ãµããŒããããŠããWebéçºèšèª | JavaScriptãPythonãRubyãªã© | JavaScriptãPythonãRubyãªã© |
äžè¬çãªããŒã¿åœ¢åŒã®ãµããŒã | JSONïŒããã¥ã¡ã³ãïŒãKey-ValueãXML | JSONïŒããã¥ã¡ã³ãïŒãKey-ValueãXML |
空éããŒã¿ã®ãµããŒã | ã¯ã | ã¯ã |
ã¹ã±ãŒãªã³ã°ããæãç°¡åãªæ¹æ³ | æ°Žå¹³ã¹ã±ãŒãªã³ã° | åçŽã¹ã±ãŒãªã³ã° |
ã·ã£ãŒãã£ã³ã° | ã·ã³ãã« | é£ãã |
ãµãŒããŒåŽã®ããã°ã©ãã³ã° | ãã | PythonãJavaScriptãCãC ++ãTclãPerlãªã©ã®å€ãã®æç¶ãåèšèªããã®ä»å€æ° |
ä»ã®ããŒã¿ãœãŒã¹ãšç°¡åã«çµ±å | ãã | OracleãMySQLãMongoDBãCouchDBãRedisãNeo4jãTwitterãLDAPãFileãHadoopãªã©ã®å€éšããŒã¿ã³ã¬ã¯ã¿ãŒ... |
ããžãã¹ããžã㯠| ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠé åž | ããªã¬ãŒãšã¹ãã¢ãããã·ãŒãžã£ã§äžå åããŸãã¯ã¯ã©ã€ã¢ã³ãã¢ããªã±ãŒã·ã§ã³å šäœã«åæ£ |
åŠç¿ãªãœãŒã¹ã®å¯çšæ§ | èŠã€ãã«ãã | èŠã€ãããã |
äž»ãªçšé | ããŒã¿ã®æŽåæ§ãšäžè²«æ§ãèŠæ±ãããªãã倧éã®åææŽæ°ã䌎ãããã°ããŒã¿ïŒæ°ååã¬ã³ãŒãïŒã | ãã©ã³ã¶ã¯ã·ã§ã³ããã³éçšã¢ããªã±ãŒã·ã§ã³ããã®å©ç¹ã¯ãæ£èŠåããã圢åŒãé¢é£ä»ããããŒã¿å¶éãããã³ãã©ã³ã¶ã¯ã·ã§ã³ãµããŒãã§ãã |
åºå žïŒEnterpriseDB Webãµã€ãã
MongoDBã®ããã¥ã¡ã³ãã«ã¯ã _idãã£ãŒã«ããååšããªãå Žåãèªåçã«æäŸãããŸãã ãã®ããã¥ã¡ã³ããååŸããå Žåã¯ã _idã䜿çšã§ããŸããããã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®äž»ããŒãšãŸã£ããåãããã«åäœããŸãã PostgreSQLã¯ããŒã¿ãããŒãã«ãã£ãŒã«ãã«æ ŒçŽããMongoDBã¯ããŒã¿ãJSONããã¥ã¡ã³ãã®åœ¢åŒã§æ ŒçŽããŸãã äžæ¹ã§ã¯ãMongoDBã¯åªãããœãªã¥ãŒã·ã§ã³ã®ããã«èŠããŸãããªããªãã1ã€ã®JSONããã¥ã¡ã³ãã§PostgreSQLã®è€æ°ã®ããŒãã«ãããã¹ãŠã®ç°ãªãããŒã¿ãååŸã§ããããã§ãã ãã®æè»æ§ã¯ãããŒã¿æ§é ã«å¶éããªãããšã«ãã£ãŠå®çŸãããŸããããã¯ãæåã¯éåžžã«é åçã§ãããäžéšã®ã¬ã³ãŒãã«èª€ã£ãå€ãŸãã¯ç©ºã®ãã£ãŒã«ãããã倧ããªããŒã¿ããŒã¹ã§ã¯æ¬åœã«æãããå ŽåããããŸãã
PostgreSQL 9.3ã«ã¯ãå®å šãªãã©ã³ã¶ã¯ã·ã§ã³ãµããŒããšããŒã¿ãã£ãŒã«ãã«å¶éã®ããJSONããã¥ã¡ã³ãã®ã¹ãã¬ãŒãžãåãããNoSQLããŒã¿ããŒã¹ã«å€æã§ããåªããæ©èœãåãã£ãŠããŸãã
ç°¡åãªäŸ
EmployeesããŒãã«ã®éåžžã«åçŽãªäŸã䜿çšããŠããããè¡ãæ¹æ³ã瀺ããŸãã ååŸæ¥å¡ã«ã¯ãååã説æãç¹å®ã®IDçªå·ãããã³çµŠäžããããŸãã
PostgreSQLããŒãžã§ã³
PostgreSQLã®åçŽãªããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
CREATE TABLE emp ( id SERIAL PRIMARY KEY, name TEXT, description TEXT, salary DECIMAL(10,2) );
ãã®ããŒãã«ã«ããã次ã®ãããªåŸæ¥å¡ãè¿œå ã§ããŸãã
INSERT INTO emp (name, description, salary) VALUES ('raju', ' HR', 25000.00);
æ®å¿µãªãããäžèšã®è¡šã§ã¯ãããã€ãã®éèŠãªå€ãªãã§ç©ºã®è¡ãè¿œå ã§ããŸãã
INSERT INTO emp (name, description, salary) VALUES (null, -34, 'sdad');
ããã¯ãããŒã¿ããŒã¹ã«å¶éãè¿œå ããããšã§åé¿ã§ããŸãã è² ã®çµŠäžã§ã¯ãªããåžžã«ç©ºã§ã¯ãªãäžæã®ååã空ã§ã¯ãªã説æãå¿ èŠã ãšããŸãã ãã®ãããªå¶çŽã®ããããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
CREATE TABLE emp ( id SERIAL PRIMARY KEY, name TEXT UNIQUE NOT NULL, description TEXT NOT NULL, salary DECIMAL(10,2) NOT NULL, CHECK (length(name) > 0), CHECK (description IS NOT NULL AND length(description) > 0), CHECK (salary >= 0.0) );
ããã§ããããã®å¶éã®ããããã«ççŸããã¬ã³ãŒãã®è¿œå ãæŽæ°ãªã©ã®ãã¹ãŠã®æäœããšã©ãŒã§å€±æããŸãã 確èªããŸãããïŒ
INSERT INTO emp (name, description, salary) VALUES ('raju', 'HR', 25000.00); --INSERT 0 1 INSERT INTO emp (name, description, salary) VALUES ('raju', 'HR', -1); --ERROR: new row for relation "emp" violates check constraint "emp_salary_check" --DETAIL: Failing row contains (2, raju, HR, -1).
NoSQLããŒãžã§ã³
MongoDBã§ã¯ãäžã®è¡šã®ãšã³ããªã¯æ¬¡ã®JSONããã¥ã¡ã³ãã®ããã«ãªããŸãã
{ "id": 1, "name": "raju", "description": "HR, "salary": 25000.00 }
åæ§ã«ãPostgreSQLã§ã¯ããã®ã¬ã³ãŒããempããŒãã«ã®è¡ãšããŠä¿åã§ããŸãã
CREATE TABLE emp ( data TEXT );
ããã¯ãã»ãšãã©ã®éãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ãšåãããã«æ©èœãããã§ãã¯ãäžè¯ãã£ãŒã«ãã®ãšã©ãŒããããŸããã ãã®çµæãå¿ èŠã«å¿ããŠããŒã¿ãå€æã§ããŸãã絊äžãæ°åã§ãããšã¢ããªã±ãŒã·ã§ã³ãäºæããŠãããšãã«åé¡ãå§ãŸããŸãããå®éã«ã¯ãããã¯è¡ã§ããããå®å šã«æ¬ èœããŠããŸãã
JSONã確èªãã
PostgreSQL 9.2ã«ã¯ããããã®ç®çã«é©ããããŒã¿åããããJSONãšåŒã°ããŸãã ãã®ã¿ã€ãã¯æ£ããJSONã®ã¿ãä¿åã§ãããã®ã¿ã€ãã«å€æããåã«æ€èšŒãã§ãã¯ãå®è¡ãããŸãã
ããŒãã«ã®èª¬æã次ã®ããã«å€æŽããŸãããã
CREATE TABLE emp ( data JSON );
ãã®ããŒãã«ã«ããã€ãã®æå¹ãªJSONãè¿œå ã§ããŸãã
INSERT INTO emp(data) VALUES('{ "id": 1, "name": "raju", "description": "HR", "salary": 25000.00 }'); --INSERT 0 1 SELECT * FROM emp; { + "id": 1, + "name": "raju", + "description": "HR",+ "salary": 25000.00 + } --(1 row)
ããã¯æ©èœããŸãããç¡å¹ãªJSONaã®è¿œå ã¯å€±æããŸãã
INSERT INTO emp(data) VALUES('{ "id": 1, "name": "raju", "description": "HR", "price": 25000.00, }'); --ERROR: invalid input syntax for type json
æžåŒèšå®ã®åé¡ã¯æ°ã¥ãã«ããå ŽåããããŸãïŒæåŸã®è¡ã«ã³ã³ããè¿œå ããŸããããJSONã¯ãããæ°ã«å ¥ããªãïŒã
ãã£ãŒã«ãã確èªãã
ãããã£ãŠãæåã®çŽç²ãªPostgreSQLãœãªã¥ãŒã·ã§ã³ã®ããã«èŠãããœãªã¥ãŒã·ã§ã³ããããŸãããã§ãã¯ãããããŒã¿ããããŸãã ããã¯ãããŒã¿ãæå³ããªããšããæå³ã§ã¯ãããŸããã ããŒã¿ãæ€èšŒãããã§ãã¯ãè¿œå ããŸãããã PostgreSQL 9.3ã«ã¯ãJSONãªããžã§ã¯ãã管çããããã®æ°ãã匷åãªæ©èœããããŸãã JSONã¿ã€ãã«ã¯ããã£ãŒã«ããšå€ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããç¹å®ã®æŒç®åããããŸãã ã ->> ãæŒç®åã®ã¿ã䜿çšããŸããã詳现ã«ã€ããŠã¯Postgresã®ããã¥ã¡ã³ããåç §ããŠãã ããã
ããã«ãidãã£ãŒã«ããå«ããã£ãŒã«ãã®ã¿ã€ãã確èªããå¿ èŠããããŸãã ããã¯ãããŒã¿åã®å®çŸ©ã«ãããPostgresãåçŽã«ãã§ãã¯ãããã®ã§ãã ãã§ãã¯ã«å¥ã®æ§æã䜿çšããŸããååãä»ãããããã§ãã 巚倧ãªJSONããã¥ã¡ã³ãå šäœã§ã¯ãªããç¹å®ã®ãã£ãŒã«ãã§åé¡ãæ€çŽ¢ããæ¹ãã¯ããã«ç°¡åã§ãã
å¶éä»ãã®ããŒãã«ã¯æ¬¡ã®ããã«ãªããŸãã
CREATE TABLE emp ( data JSON, CONSTRAINT validate_id CHECK ((data->>'id')::integer >= 1 AND (data->>'id') IS NOT NULL ), CONSTRAINT validate_name CHECK (length(data->>'name') > 0 AND (data->>'name') IS NOT NULL ) );
æŒç®åã ->> ãã䜿çšãããšãç®çã®JSONãã£ãŒã«ãããå€ãååŸããŠãååšãããã©ãããšãã®æå¹æ§ã確èªã§ããŸãã
説æãªãã§JSONãè¿œå ããŸãããã
INSERT INTO emp(data) VALUES('{ "id": 1, "name": "", "salary": 1.0 }'); --ERROR: new row for relation "emp" violates check constraint "validate_name"
ãã1ã€åé¡ããããŸãã ååãšIDãã£ãŒã«ãã¯äžæã§ããå¿ èŠããããŸãã ããã¯æ¬¡ã®ããã«ç°¡åã«å®çŸã§ããŸãã
CREATE UNIQUE INDEX ui_emp_id ON emp((data->>'id')); CREATE UNIQUE INDEX ui_emp_name ON emp((data->>'name'));
ããã§ãIDããã§ã«ããŒã¿ããŒã¹ã«ããããŒã¿ããŒã¹ã«JSONããã¥ã¡ã³ããè¿œå ããããšãããšã次ã®ãšã©ãŒã衚瀺ãããŸãã
--ERROR: duplicate key value violates unique constraint "ui_emp_id" --DETAIL: Key ((data ->> 'id'::text))=(1) already exists. --ERROR: current transaction is aborted, commands ignored until end of transaction block
æ§èœ
PostgreSQLã¯ãä»æ¥ã®äžçæ倧ã®ä¿éºäŒç€Ÿãéè¡ããããŒã«ãŒãæ¿åºæ©é¢ãããã³é²è¡è«è² æ¥è ã®æãå³ããèŠæ±ãåŠçããé·å¹Žã«ããã£ãŠç®¡çããŠããŸãã PostgreSQLã®ããã©ãŒãã³ã¹ã®æ¹åã¯ãããŒãžã§ã³ã®å¹Žæ¬¡ãªãªãŒã¹ã§ãç¶ç¶çã§ãããéæ§é åããŒã¿åã®æ¹åãå«ãŸããŠããŸãã
ãœãŒã¹ïŒEnterpriseDBãã¯ã€ãããŒããŒïŒPostgres NoSQLæ©èœã®äœ¿çš
PostgreSQLã§NoSQLã®ããã©ãŒãã³ã¹ãå人çã«ãã¹ãããã«ã¯ãGitHubããpg_nosql_benchmarkãããŠã³ããŒãããŸãã