ããã«ã¡ã¯ïŒ æ°å3幎ç®ãšã³ãžãã¢ã®takadaã§ãã MySQL8ç³»ããJSONåã«é¢é£ããæ°ããæ©èœãããã€ã远å ãããã®ã§ã ãã¢ãéããŠèª¬æãã€ã€ãæ£èŠå衚çŸãšæ¯èŒããªããã©ã®å Žé¢ã§äœ¿ãããããæš¡çŽ¢ããŠãããŸãã ç®æ¬¡ 1. ã¯ããã« 2. MySQL8ç³»ã®æ°ããJSONé¢é£æ©èœ 3. æ£èŠåãããDBèšèšãšJSONåã®æ¯èŒ 4. [ããŸã] MySQL8ç³»ã®æ©èœã掻çšããŠããã©ãŒãã³ã¹ãèãã 5. [ããŸã] ãã®ä»ã«MySQL8ç³»ã§è¿œå ãããJSON颿° 6. ãŸãšã 1. ã¯ããã« æåã«ãè¿°ã¹ãããã«ãMySQL8ç³»ã§ã¯JSONåã«é¢é£ããæ°ããæ©èœãããã€ã远å ãããããæè»ãªããŒã¿ç®¡çãå¯èœãšãªããŸããã ããã§ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ããããæ£èŠåãã«å¯ŸããŠãMySQL8ç³»ã®JSONåãæŽ»çšããããšã§ã©ããªã¡ãªããã»ãã¡ãªããããããã瀺ããã©ã®å Žé¢ã§äœ¿ãããããæš¡çŽ¢ããŠãããããªãšæããŸãã 2. MySQL8ç³»ã®æ°ããJSONé¢é£æ©èœ 2-1. è€æ°å€ Index è€æ°å€ Indexãšã¯ãJSONã®ã«ã©ã ã®äžã«ãé
åãšããŠããŒå€ãè€æ°å«ãŸããŠããå Žåã§ãæå¹ã«æ©èœã§ããINDEXã§ãã JSONåã§ã¯çŽæ¥INDEXã貌ããªããããJSONããæãåºããããŒã¿ã§ã«ã©ã ãäœæããä»®æ³çãªINDEXãšããŠçšæããããšã§è§£æ±ºããŠããŸããããã ã以åããé床ãããŸãäžãããªããšããåé¡ããããä»åã® è€æ°å€ Indexã®è¿œå ã«ãã£ãŠé床åäžãèŠèŸŒããããã«ãªããŸããã 2-2 æ°ããJSON颿° 2-2-1 JSON_TABLE() JSONããŒã¿ãããŒãã«åœ¢åŒã«å€æããŠè¿ããŠããã颿°ã§ã ãã®é¢æ°ãçšããŠãå¥ã®ããŒãã«ãšJOINã§ããããããã®ã§äŸ¿å©ãªé¢æ°ã§ãã 2-2-2 MEMBER OF() MEMBER OF()ãšã¯ãç¹å®ã®å€ãJSONé
åã®äžã«ããŒã¿ãšããŠååšãããã確èªããããã«äœ¿çšãããŸãã å
·äœçãªã¯ãšãªäœ¿çšäŸã¯4ç« ã«èšèŒããŸãã â» ãŸã ãŸã ãããŸãããä»åã¯èª¬æãããäžã§äž»ã«äœ¿çšãã颿°ãèšèŒããŠãããŸã ä»ã®JSON颿°ã¯5ç« ã«ãŠtipsãšããŠèšèŒããŸãã 3. æ£èŠåãããDBèšèšãšJSONåã®æ¯èŒ ã§ã¯ãå®éã«MySQL8ç³»ã«ãŠè¿œå ãããJSONé¢é£æ©èœã䜿ãã€ã€ã æ£èŠåãããDBèšèšãšJSONåã®æ¯èŒãè¡ã£ãŠã¿ãŸãïŒ 3-1 æ£èŠåãããDBèšèšã®äŸ ãŸãã¯ãããããECãµã€ããã€ã¡ãŒãžããŠDBèšèšãèããŠã¿ãŸãã ãããããšå¿
èŠãªããŒã¿ã¯ããããã§ãããäžæŠæäœéã®å¿
èŠãªæ
å ±ãšããŠã ã顧客æ
å ±ãã»ã泚ææ
å ±ãã»ã泚æååãã®æ
å ±ãå
ã«ããããå¥ã®ããŒãã«ã«åå²ã㊠管çããŸããäžèšã«ã¯ãšãªæã®äŸãèšèŒããŠãããŸãã 顧客æ
å ±ããŒãã«(test_customers) CREATE TABLE test_customers ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100) ); 泚ææ
å ±ããŒãã«(test_orders) CREATE TABLE test_orders ( id INT AUTO_INCREMENT PRIMARY KEY, customer_id INT, order_date DATE, amount_total INT, FOREIGN KEY (customer_id) REFERENCES test_customers(id) ); 泚æååããŒãã«(test_order_items) CREATE TABLE test_order_items ( id INT AUTO_INCREMENT PRIMARY KEY, order_id INT, product_name VARCHAR(100), quantity INT, price INT, FOREIGN KEY (order_id) REFERENCES test_orders(id) ); 3-2 JSONåãçšããèšèšã®äŸ 次ã«JSONåãçšããŠãåæ§ã«ã·ã§ããã³ã°ã¢ããªãæ³å®ããèšèšãè¡ã£ãŠã¿ãŸãã æ£èŠåãããããŒãã«ã«å¯ŸããŠãJSONåã䜿çšããŠåãããŒã¿ãã·ã³ãã«ãª1ã€ã®ããŒãã«ã«çµ±åããŠã¿ãŸãã 顧客æ
å ±ããŒãã« CREATE TABLE test_customers ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), email VARCHAR(100), orders JSON -- JSONåãçšãã ); 泚ææ
å ±ãååæ
å ±ããã¹ãŠ`test_customers.orders`ã«ã©ã ã«JSONã®åœ¢åŒã§æ ŒçŽãã圢ã«ããŠã¿ãŸããã å®éã«ããŒã¿ãINSERTããå Žåã¯äžèšã®ãããªã¯ãšãªæãçšããŠæ¿å
¥ããŸãã INSERT INTO test_customers (name, email, orders) VALUES ('SQL taro', 'sql_taro@example.com', '[ { "order_date": "2024-09-01", "amount_total": 350, "items": [ {"product_name": "chocolate", "quantity": 2, "price": 150}, {"product_name": "apple", "quantity": 1, "price": 200} ] } ]'); 3-3 ããŒã¿æœåºã®ã¯ãšãªææ¯èŒ 3-3-1 æ£èŠåãããããŒãã«ã§ã®ã¯ãšãªæ å
ã»ã©èšèšããå
容ãå
ã«ã顧客åãæ³šææ¥ãªã©ã®ããŒã¿ãæœåºããŠã¿ãå Žåã äžèšã®ãããªã¯ãšãªæã«ãªããŸãã SELECT tc.name AS '顧客å', to.order_date AS 'æ³šææ¥', toi.product_name AS '補åå', toi.quantity AS 'åæ°', toi.price AS '倿®µ' FROM test_customers c JOIN test_orders o ON tc.id = to.customer_id JOIN test_order_items toi ON to.id = toi.order_id WHERE tc.id = 1; 3-3-2 JSONãçšããããŒãã«ã®ã¯ãšãªæ (MySQL8ç³»æ°æ©èœæŽ»çš) JSONåã®å Žåãæ³šæãšååæ
å ±ã1ã€ã®ã¯ãšãªæã§ååŸã§ãããã§ãã ãŸããMySQL8ç³»ã®æ°ããJSONé¢é£æ©èœã«ãŠèª¬æããŸããJSON_TABLEãçšããŠã ã¯ãšãªæãèšèŒããŠã¿ãŸãã 1. JSON圢åŒããããŒã¿ãåãåºããå Žå SELECT orders FROM test_customers tc; æœåºçµæ â» JSONããŒã¿ã现ããã®ã§ãäžéšåãåã£ãŠãŸãã 2. JSON_TABLEãçšããŠããŒã¿æœåºããå Žå SELECT order_info.* FROM test_customers, JSON_TABLE(orders, '$[*]' COLUMNS ( order_date DATE PATH '$.order_date', amount_total INT PATH '$.amount_total', items JSON PATH '$.items' )) AS order_info; æœåºçµæ 3. ã3-3-1ããšåæ§ã®å
å®¹ãæœåºããå Žå SELECT name, order_info.* FROM test_customers, JSON_TABLE(orders, '$[*]' COLUMNS ( order_date DATE PATH '$.order_date', total_amount INT PATH '$.total_amount', items JSON PATH '$.items' )) AS order_info WHERE id = 1; æœåºçµæ 2ã»3ãèŠãŠã¿ããšãããããã«ã JSON_TABLEãçšããããšã§ããŒãã«ã®åœ¢åŒã«å€æã§ãã JSONã®æè»æ§ã掻ããã€ã€ãæ£èŠåãããããŒãã«ãšåæ§ã®åœ¢ã§æœåºã§ãããã§ãã ãŸããä»åã®æ£èŠåãšJSONã®æ¯èŒãšããéšåãèå¯ãããšã JOINã䜿ããªããªãã®ã§ããŒãã«ãšããŠã¯ã·ã³ãã«ã«ãªããŸããã JSONãçšããããšã§ããŒã¿ã®æè»æ§ã¯äžãã£ãã®ããªãšæãã€ã€ãã JOINããããŒãã«ãå€ããªã£ãæã«ããŒã¿ã®åé·æ§ãåé¡ãšãªããããªæããããŸããã 4. [ããŸã] MySQL8ç³»ã®æ©èœã掻çšããŠããã©ãŒãã³ã¹ãèãã MySQL8ç³»ã®æ°ããJSONé¢é£æ©èœã®é
ç®ã§ã説æããŸããè€æ°å€ Indexãçšããããšã§ãããã©ãŒãã³ã¹åäžãå³ããŸãã ä»åã®èšäºã§ã¯ããã©ãŒãã³ã¹æ€èšŒãè¡ããŸãããæŽ»ç𿹿³ãäžèšã«èšèŒããŸãã ããŸãã¯ãã¹ãçšã®ããŒãã«ã®äœæãšãã¹ãããŒã¿ãINSERTãããã -- JSONåã®æ€èšŒçšããŒãã«äœæ CREATE TABLE test_json ( id INT AUTO_INCREMENT PRIMARY KEY, info JSON -- JSONåãçšãã ); -- ãã¹ãããŒã¿ãINSERT INSERT INTO test_json (info) VALUES ( '{ "name": "Taro", "age": 20, "address": [123456, 78910] }' ); æ¬¡ã«æ¬é¡ã®è€æ°å€INDEXã®è²Œãæ¹ãèšèŒããŠãããŸãã ãæåã«è€æ°å€INDEXã貌ã£ãŠãªãå Žåã«ãããŠãMySQL8.0.17ãã远å ããã MEMBER OFã䜿çšããŠç¢ºèªãããã city:Tokyoã®å€ãå«ããããŒã¿ãæœåº SELECT INFO FROM test_json WHERE 123456 MEMBER OF(info->'$.address'); æœåºçµæ å®è¡èšç»ã®ç¢ºèª EXPLAIN SELECT INFO FROM test_json WHERE 123456 MEMBER OF(info->'$.address'); æœåºçµæ ãã¡ããINDEXãäœãæå®ããŠããªãããtype ALLãšãªããŸãã ã§ã¯ãå®éã«è€æ°å€INDEXã貌ã£ãŠã¿ãŸãã JSONã®ãã£ãŒã«ãã«å¯ŸããINDEXãäœæããã«ã¯ã JSONã®å€ãé©åãªããŒã¿åã«ãã£ã¹ãããå¿
èŠããããŸãã adressã«å¯ŸããŠINDEXã貌ã ALTER TABLE test_json ADD INDEX idx_address( (CAST(info->'$.address' AS UNSIGNED ARRAY)) );  å床å®è¡èšç»ãç¢ºèª EXPLAIN SELECT INFO FROM test_json WHERE 123456 MEMBER OF(info->'$.address'); æœåºçµæ äžèšã®ããã«type=ref, key=idx_addressãšãªãã ã€ã³ããã¯ã¹ãå¹ããŠããããšã確èªã§ããŸããã JSON圢åŒã®ããŒã¿ã䜿çšããå Žåãè€æ°å€INDEXãçšããŠããã©ãŒãã³ã¹åäž ãèãããããçŽ æµã§ããïŒ [åç
§URL] https://dev.mysql.com/doc/refman/8.0/en/create-index.html#create-index-multi-valued 5. [ããŸã] ãã®ä»ã«MySQL8ç³»ã§è¿œå ãããJSON颿° æåŸã«MySQL8ç³»ãã远å ãããJSON颿°ãäžèšã®ãã¹ãããŒãã«ãçšããŠã å®éã«å
·äœäŸãæããªãã説æããŸãã -- ãã¹ãããŒãã«äœæ CREATE TABLE test_json ( id INT AUTO_INCREMENT PRIMARY KEY, info JSON ); -- ãã¹ãããŒã¿æ¿å
¥ INSERT INTO test_json (info) VALUES ('{"name": "Taro", "hobbies": ["reading", "swimming"]}'), ('{"name": "Jiro", "hobbies": ["reading", "music", "running"]}'); â JSON_OVERLAPS() 2ã€ã®JSONããŒã¿ãæ¯èŒããŠãããŒã¿ãéè€ããŠãããã確èªããŸãã ããã¯2ã€ã®JSONãªããžã§ã¯ããé
åã«å
±éã®èŠçŽ ãããå Žåã«TRUEãå
±éã®èŠçŽ ããªãå Žåã¯FALSEãè¿ããŸãã éè€ããŠããããŒã¿ããã§ã㯠SELECT * FROM test_json WHERE JSON_OVERLAPS(info->'$.hobbies', '["swimming", "music"]'); æœåºçµæ â¡ JSON_SCHEMA_VALID() MySQL8.0.17以éã«äœ¿çšã§ãã颿°ã§ã JSONããŒã¿ãæå®ããJSONã¹ããŒãã«é©åããŠããããæ€èšŒããŸãã ãã®é¢æ°ã¯JSONããŒã¿ãã¹ããŒãã«æºæ ããŠããå Žåã¯TRUEãæºæ ããŠããªãå Žåã¯FALSEãè¿ããŸãã JSONããŒã¿ãæºæ ããŠããã確èªããã SELECT id, JSON_SCHEMA_VALID('{ "type": "object", "properties": { "name": { "type": "string" }, "hobbies": { "type": "array" }, }, "required": ["name", "hobbies"] }', info) AS is_valid FROM test_json; æœåºçµæ çµæãèŠãŠããããŸãããã«ãã©ã¡ããæºæ ããŠããã®ã§ãïŒããè¿ããŠããŸãã ⢠JSON_VALUE() ãã¡ãã¯ã·ã³ãã«ãªé¢æ°ã§ãJSONããŒã¿ããã¹ã«ã©ãŒå€ãæœåºããŸãã ç¹å®ã®ããŒã«å¯Ÿå¿ããåäžã®å€ãååŸããã®ã«äœ¿çšããŸãã nameã«ã©ã ã®å€ãååŸãã SELECT id, JSON_VALUE(info, '$.name') AS name FROM test_json; ã·ã³ãã«ãªã ãã«å€ãã®å Žé¢ã§äœ¿çšããããšããããããªã®ã§ã èŠããŠãããšè¯ããããããªãã§ãïŒ è©³ããã¯äžèšURLã«ãŠãJSON颿°ã®äžèЧãèŒã£ãŠãããŸãã®ã§ èå³ãããã°èŠãŠããã ããã°ãšæããŸãïŒ https://dev.mysql.com/doc/refman/8.0/ja/json-function-reference.html 6. ãŸãšã ä»åãJSONãšæ£èŠå衚çŸã®æ¯èŒãMySQL8ç³»ã§æ°ãã远å ãããæ©èœã亀ããªãã説æãããŠããã ãããŸããã 玹ä»ããŠããäžã§ãJSONåã»æ£èŠåã®ããããã§ã¡ãªãããã¡ãªãããã€ã¡ãŒãžã§ããããªãšæããŸãã å
ã
5.7ç³»ã§ãJSONåã¯äœ¿ããŸãããæ©èœã®è¿œå ã«ãã£ãŠãããæ±çšæ§ãé«ãŸã£ãããªãšãæããŸãã®ã§ãã¡ãªããã»ãã¡ãªãããèããªããã䜿çšããŠããã®ãè¯ãããªãšæããŸããïŒæåŸãŸã§èŠãŠããã ãããããšãããããŸããïŒ The post MySQL8ç³»ã«ãŠåŒ·åãããJSONãæŽ»çšããªããæ£èŠåãšæ¯èŒããŠãã first appeared on Wedding Park CREATORS Blog .