MySQL에 JSON으로 데이터 저장


121

나는 이것이 n00b 일이라고 생각했습니다. 그래서 저는 한 번도 해본 적이 없습니다. 그런 다음 FriendFeed가이 작업을 수행하고 실제로 DB 확장을 개선하고 지연 시간을 줄이는 것을 확인했습니다. 이걸해야하는지 궁금합니다. 그렇다면 올바른 방법은 무엇입니까?

기본적으로 MySQL의 모든 것을 CouchDB 일종의 DB로 저장하는 방법을 배우기에 좋은 곳은 어디입니까? 모든 것을 JSON으로 저장하는 것이 더 쉽고 빠릅니다 (빌드하는 것이 아니라 지연 시간이 적음).

또한 DB에 JSON으로 저장되어있는 내용을 편집, 삭제 등이 쉬운가요?


참고로 이것이 MySQL에서 JSON을 사용하는 것에 대한 FriendFeed의 토론이라고 생각합니다. backchannel.org/blog/friendfeed-schemaless-mysql
dimo414

10
MySQL 5.7은 이제 네이티브 JSON 데이터 저장소를 지원합니다.
eecue

답변:


57

CouchDB와 MySQL은 매우 다른 두 가지입니다. JSON은 CouchDB에 물건을 저장하는 기본 방법입니다. MySQL에서 가장 좋은 방법은 JSON 데이터를 단일 필드에 텍스트로 저장하는 것입니다. 이것은 RDBMS에 저장하는 목적을 완전히 무너 뜨리고 모든 데이터베이스 트랜잭션을 매우 복잡하게 만듭니다.

하지마.

그래도 FriendFeed 는 MySQL 위에 극도로 사용자 정의 된 스키마 를 사용하는 것 같았습니다 . 정확히 무엇을 저장하고 싶은지에 따라 달라지며, 데이터베이스 시스템을 남용하는 방법에 대한 명확한 답은 거의 없으므로 이해가됩니다. 이 기사가 매우 오래되었고 Mongo와 Couch에 대한 주된 이유가 미성숙이라는 점을 감안할 때 MySQL이 당신을 위해 그것을 자르지 않으면이 두 가지를 다시 평가할 것입니다. 그들은 지금까지 많이 성장 했어야했다.


3
네, 몽고를보고 있는데, php는 확장 기능을 가지고 있고 DB 트랜잭션의 실제 구문은 MySQL보다 더 쉽고 전반적인 작업은 couchDB가 더 쉬워 보입니다. 감사합니다. 저는 MongoDB와 함께 갈 것 같습니다. :)
Oscar Godson

67
RDBMS에 JSON blob을 저장하는 데는 확실히 유효한 경우가 있습니다. 일부 시나리오에서 상당히 자주 발생하는 데이터를 쿼리 할 필요없이 JSON 데이터의 불투명 한 blob을 저장하고 검색하려는 경우 매우 잘 수행 할 수 있습니다.
markus

9
@markus 실제로 내 웹 사이트 중 하나, 특히 MySQL 쿼리에서 직접 검색되지 않았지만 양식을 볼 때 사용되는 복잡한 양식의 필드 (테이블보기에서 또는 링크를 통해 직접)에서이 작업을 수행합니다. 이상적이지는 않지만 구현을 훨씬 더 빠르게 만들고 엄청난 양의 테이블이나 테이블 열에 대한 필요성을 제거합니다.
Nick Bedford

1
애플리케이션에 대해 RDBMS 및 문서 유형 저장소를 모두 갖고 싶다면 이것은 좋은 접근 방식이므로 여러 데이터베이스를 관리 할 필요가 없습니다.
rjarmstrong

5
이것은 아마도 스택 교환에 너무 많은 시간을 소비하는 사람의 매우 짧은 사이트 조언입니까? 저장하려는 필드가 100 개있는 레코드가 있고 필드 중 3 개 또는 4 개만 검색하면되는 경우 100 개의 필드가있는 테이블을 만드는 것은 말도 안됩니다. JSON의 1 개 필드에 저장된 전체 주소록과 함께 고객 레코드를 저장할 수 있으며 레코드 검색에 사용할 다른 필드로 고객 ID, 성, 회사를 추가하기 만하면됩니다. 그것은 a입니다. 엄청난 시간 절약.
Danial

102

모든 댓글이 잘못된 각도에서 오는 것 같습니다. PHP를 통해 관계형 DB에 JSON 코드를 저장하는 것이 좋으며 실제로 이와 같은 복잡한 데이터를로드하고 표시하는 것이 더 빠르지 만 다음과 같은 설계 고려 사항이 있습니다. 검색, 인덱싱 등

이를 수행하는 가장 좋은 방법은 하이브리드 데이터를 사용하는 것입니다. 예를 들어 날짜 시간을 기준으로 검색해야하는 경우 MySQL (성능 조정 됨)이 PHP보다 훨씬 빠르며 장소 검색 거리와 같은 경우 MySQL도 많이 사용해야합니다. 더 빠릅니다 (검색에 액세스하지 않음). 검색 할 필요가없는 데이터는 JSON, BLOB 또는 실제로 필요하다고 생각하는 다른 형식으로 저장할 수 있습니다.

액세스해야하는 데이터는 기본 사례 별 송장 시스템과 같이 JSON으로 매우 쉽게 저장됩니다. 그것들은 RDBMS에서 그다지 이익을 얻지 못하며, 올바른 HTML 양식 구조가있는 경우 json_encoding ($ _ POST [ 'entires'])만으로 JSON에 저장할 수 있습니다.

MongoDB를 사용하게되어 기쁘고 계속해서 좋은 서비스를 제공하기를 바라지 만, 앱의 복잡성이 증가하면 결국 RDBMS가 필요할 수 있으므로 MySQL이 항상 당신의 레이더에서 벗어날 것이라고 생각하지 마십시오. 일부 기능 및 기능 (아카이브 된 데이터 또는 비즈니스보고를 중단하는 경우에도 해당)


8
-1 for "PHP를 통해 관계형 DB에 JSON 코드를 저장하는 것이 좋습니다."-JSON (전체 엔티티를 비 원자 데이터로 나타낼 수 있음)을 단일 필드에 저장하면 관계형 모델을 위반하고 1NF를 방지합니다. 또한, 당신을 뒷받침 할 메트릭없이 성능에 대해 포괄적 인 주장을하지 마십시오.
Sage Gerard

80
언급했듯이 저장하는 항목에 따라 다릅니다. 즉, 송장의 경우 각 항목을 개별적으로 저장해야합니까? 아니, 당신의 의견은 당신이 너무 많이 알고있는 것처럼 보이지만 1NF는 모든 필드에 해당되지 않거나 BLOB 및 텍스트 유형이 없을 것입니다. 이것은 프로덕션 시스템에 대한 순수한 말도 안되는 일입니다. 검색해야하는 항목 만 최적화하면됩니다. 즉, 날짜, 키 및 일부 데이터에 대한 인덱스 설정. 모든 것을 JSON으로 저장한다고 말하지 않았으며 문제를 해결하는 데 도움이된다면 일부 데이터를 JSON으로 저장한다고 말했습니다.
Lewis Richard Phillip Cowles 2014

2
당신이 말하는 것은 가능하고 편리하지만, 잘 형성된 관계에서 벗어나는 것은 상기 편차를 수용하고 유지하기 위해 더 많은 일을한다는 것을 의미합니다. 관계형 모델을 타당하게 만드는 것은 당신이 제공 한 것보다 더 나은 정당화가 필요합니다. 관계에서 속성의 오용을 다루기 때문에 답변과 관련된 합병증에 대한 자세한 내용은 Kroenke 및 Auer의 데이터베이스 처리를 참조하십시오.
세이지 제라드

29
당신은 내가이 문제에 대해 DBA와상의하지 않았고 당신이 말하는 것을 이해하지 못한다고 가정하고 있습니다. 나는 작은 시스템과 더 나아가서 이것에 대한 의미가 정확히 무엇인지에 대해 정확히 알고 있지 않지만 내가 말하는 것은 당신이 틀렸고 당신이 지적한 연구가 오래되었고 우리의 응용 프로그램을 사용하지 않는다는 것입니다. 전략. 그것은 명백한 잘못이며, 문제는이 프로세스의 잘못된 구현에 있습니다. 예를 들어, 모델이 하나만 있거나 RDBMS를 사용하지 않는다고 말하는 것이 아니라 RDBMS를 사용하는 위치와 필요하지 않은 위치에 대해 현명하게 말하는 것입니다.
Lewis Richard Phillip Cowles 2014 년

6
이것은 내 경험에서 가장 좋은 대답이었습니다. RDBMS를 사용할 수 있지만 수행중인 작업을 알고있는 경우 특정 상황에서만 JSON을 저장할 수 있습니다. 사실 저는 어레이 데이터의 임시 캐시 저장 및 더 빠른 결과와 적은 코드를 달성하는 다른 상황에 많이 사용했습니다. 실제로 많은 프로젝트에는 일부 혼합 기능이 있습니다.
Heroselohim

72

MySQL 5.7은 이제 MongoDB 및 기타 스키마없는 문서 데이터 저장소와 유사한 기본 JSON 데이터 유형을 지원합니다.

JSON 지원

MySQL 5.7.8부터 MySQL은 네이티브 JSON 유형을 지원합니다. JSON 값은 문자열로 저장되지 않고 대신 문서 요소에 대한 빠른 읽기 액세스를 허용하는 내부 바이너리 형식을 사용합니다. JSON 열에 저장된 JSON 문서는 삽입 또는 업데이트 될 때마다 자동으로 유효성이 검사되며 잘못된 문서는 오류를 생성합니다. JSON 문서는 생성시 정규화되며 =, <, <=,>,> =, <>,! = 및 <=>와 같은 대부분의 비교 연산자를 사용하여 비교할 수 있습니다. 지원되는 연산자와 MySQL이 JSON 값을 비교할 때 따르는 우선 순위 및 기타 규칙에 대한 자세한 내용은 JSON 값 비교 및 ​​순서 지정을 참조하십시오.

MySQL 5.7.8은 또한 JSON 값 작업을위한 여러 함수를 도입했습니다. 이러한 기능에는 다음과 같은 기능이 포함됩니다.

  1. JSON 값을 생성하는 함수 : JSON_ARRAY (), JSON_MERGE () 및 JSON_OBJECT (). Section 12.16.2,“JSON 값을 생성하는 함수”를 참조하십시오.
  2. JSON 값을 검색하는 함수 : JSON_CONTAINS (), JSON_CONTAINS_PATH (), JSON_EXTRACT (), JSON_KEYS () 및 JSON_SEARCH (). Section 12.16.3,“JSON 값을 검색하는 함수”를 참조하십시오.
  3. JSON 값을 수정하는 함수 : JSON_APPEND (), JSON_ARRAY_APPEND (), JSON_ARRAY_INSERT (), JSON_INSERT (), JSON_QUOTE (), JSON_REMOVE (), JSON_REPLACE (), JSON_SET () 및 JSON_UNQUOTE (). Section 12.16.4,“JSON 값을 수정하는 함수”를 참조하십시오.
  4. JSON 값에 대한 정보를 제공하는 함수 : JSON_DEPTH (), JSON_LENGTH (), JSON_TYPE () 및 JSON_VALID (). Section 12.16.5,“JSON 값 속성을 반환하는 함수”를 참조하십시오.

MySQL 5.7.9 이상에서는 JSON_EXTRACT (열, 경로)의 약어로 column-> path를 사용할 수 있습니다. 이것은 WHERE, ORDER BY 및 GROUP BY 절을 포함하여 SQL 문에서 열 식별자가 발생할 수있는 모든 열에 대한 별칭으로 작동합니다. 여기에는 SELECT, UPDATE, DELETE, CREATE TABLE 및 기타 SQL 문이 포함됩니다. 왼쪽은 별칭이 아니라 JSON 열 식별자 여야합니다. 오른쪽은 열 값으로 반환 된 JSON 문서에 대해 평가되는 인용 된 JSON 경로 표현식입니다.

-> 및 JSON_EXTRACT ()에 대한 자세한 내용은 Section 12.16.3,“JSON 값을 검색하는 함수”를 참조하십시오. MySQL 5.7의 JSON 경로 지원에 대한 자세한 내용은 JSON 값 검색 및 수정을 참조하십시오. Secondary Indexes 및 Virtual Generated Columns도 참조하십시오.

더 많은 정보:

https://dev.mysql.com/doc/refman/5.7/en/json.html


26

json 문자는 스토리지와 관련하여 특별한 것이 아닙니다.

{, }, [, ], ', a-z, 0-9.... 정말 특별한 아무것도 및 텍스트로 저장할 수 있습니다.

당신이 가질 첫 번째 문제는

{profile_id : 22, 사용자 이름 : 'Robert', 비밀번호 : 'skhgeeht893htgn34ythg9er'}

자신의 절차가 있고 mysql 용 jsondecode를 개발하지 않는 한 데이터베이스에 저장된 것은 업데이트하기가 쉽지 않습니다.

UPDATE users SET JSON(user_data,'username') = 'New User';

그래서 그렇게 할 수 없기 때문에 먼저 json을 선택하고, 디코딩하고, 변경하고, 업데이트해야하므로 이론적으로 적절한 데이터베이스 구조를 구성하는 데 더 많은 시간을 소비하는 것이 좋습니다!

저는 json을 사용하여 데이터를 저장하지만 메타 데이터 만 사용합니다. 사용자 특정과 관련이없고 자주 업데이트되지 않는 데이터입니다. 예를 들어 사용자가 게시물을 추가하고 해당 게시물에 이미지를 추가하면 이미지를 파싱하고 엄지 손가락을 만들고 그런 다음 json 형식의 엄지 URL을 사용하십시오.


전혀 업데이트하지 않을 때 데이터베이스에 json 문자열을 저장하는 것으로 충분합니까? LIKE를 사용하여 json 데이터에 대한 일반 검색을 수행하고 싶습니다. Wordpress조차도 플러그인 메타 데이터를 데이터베이스에 json 문자열로 저장합니다.
shasi kanth 2015 년

@shasikanth, JSON 데이터에서 값을 검색하는 경우 더 나은 접근 방식을 찾겠습니다
Kirby

15

쿼리를 사용하여 JSON 데이터를 얻는 것이 얼마나 어려운지 설명하기 위해이를 처리하기 위해 만든 쿼리를 공유하겠습니다.

배열이나 다른 객체는 고려하지 않고 기본 데이터 유형 만 고려합니다. 4 개의 column 인스턴스를 JSON을 저장하는 열 이름으로 변경하고 myfield 의 4 개 인스턴스 를 액세스하려는 JSON 필드로 변경 해야합니다.

SELECT
    SUBSTRING(
        REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
        LOCATE(
            CONCAT('myfield', ':'),
            REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
        ) + CHAR_LENGTH(CONCAT('myfield', ':')),
        LOCATE(
            ',',
            SUBSTRING(
                REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', ''),
                LOCATE(
                    CONCAT('myfield', ':'),
                    REPLACE(REPLACE(REPLACE(column, '{', ''), '}', ','), '"', '')
                ) + CHAR_LENGTH(CONCAT('myfield', ':'))
            )
        ) - 1
    )
    AS myfield
FROM mytable WHERE id = '3435'

5
이 서버 측을 쿼리하지 않을 것입니다. 이것은 blob을 저장하고 클라이언트 측으로 되 돌리는 것입니다. 그런 다음 JS를 사용하여 쿼리합니다. 이것은 오래 전에 tho :) 나는 이후이 물건을 위해 MongoDB로 옮겼습니다 :)이 꽤 매끄러운 쿼리 tho에 대한 Upvote.
Oscar Godson

그 사람이 정기적으로 해당 JSON 데이터에 액세스 할 것인지에 대한 질문이라고 생각합니다. 예를 들어 필수가 아닌 헤더를 배열로 옮기고 JSON으로 구문 분석 한 다음 저장합니다. JSON을 검색 할 때 (희귀 한 추가 헤더 AJAX 요청의 경우) 간단히 MySQL에서 가져 와서 JSON을 배열로 읽고 헤더를 에코 아웃합니다. 더 많은 데이터 집약적 인 경우 JSON으로 저장하면 안됩니다.

10

실제로 사용 사례에 따라 다릅니다. 보고에 전혀 가치가없고 다른 테이블과의 JOIN을 통해 쿼리되지 않는 정보를 저장하는 경우 JSON으로 인코딩 된 단일 텍스트 필드에 데이터를 저장하는 것이 합리적 일 수 있습니다.

이는 데이터 모델을 크게 단순화 할 수 있습니다. 그러나 RobertPitt가 언급했듯이이 데이터를 정규화 된 다른 데이터와 결합 할 수있을 것이라고 기대하지 마십시오.


2
내 생각과 일치 해. 조인 / 검색되지 않거나 거의 업데이트되지 않은 데이터가 TEXT 필드에 json을 사용하지 않는 이유는 무엇입니까? 이에 대한 좋은 예는 각 식품 항목이 영양 정보를 저장해야하는 식품 항목 테이블입니다. 서빙 크기, 단백질, 탄수화물, 총 지방, 포화 지방 등. 그러나 그뿐만 아니라 값 (0.2)과 측정 단위 (g, oz, fl oz, ml)를 저장해야합니다. (당신이하는 일에 따라) 검색 할 필요가없는 데이터를 고려하면 1 TEXT 대 16 int / varchar / enum 열이 좋은 절충안이라고 말할 것입니다.
Brad Moore

바로 그거죠!!! SQL로 필터링 할 계획이없는 변수 및 / 또는 알 수없는 데이터 구조를 저장해야 할 때 유용합니다. 데이터는있는 그대로 저장되며 다른 사람 (앱 코드)이 구조와이 데이터로 수행 할 작업을 알고있을 수 있습니다.
Delmo

9

이것은 오래된 질문이지만 구글 검색 결과 상단에서 여전히 볼 수 있기 때문에 질문을 받고 4 년 후에 새로운 답변을 추가하는 것이 의미가있을 것 같다.

우선 RDBMS에 JSON을 저장하는 데 더 나은 지원이 있습니다. PostgreSQL로 전환하는 것을 고려할 수 있습니다 (MySQL은 v5.7.7부터 JSON을 지원했지만). PostgreSQL은 더 많은 기능을 지원한다는 점을 제외하고는 MySQL과 매우 유사한 SQL 명령을 사용합니다. 그들이 추가 한 함수 중 하나는 JSON 데이터 유형을 제공하고 이제 저장된 JSON을 쿼리 할 수 ​​있다는 것입니다. (이에 대한 일부 참조 ) 예를 들어 php에서 PDO를 사용하거나 Laravel에서 eloquent를 사용하여 프로그램에서 직접 쿼리를 작성하지 않는 경우 서버에 PostgreSQL을 설치하고 데이터베이스 연결 설정을 변경하기 만하면됩니다. 코드를 변경할 필요도 없습니다.

대부분의 경우 다른 답변에서 제안했듯이 RDBMS에서 직접 JSON으로 데이터를 저장하는 것은 좋은 생각이 아닙니다. 하지만 몇 가지 예외가 있습니다. 내가 생각할 수있는 한 가지 상황은 가변 개수의 연결된 항목이있는 필드입니다.

예를 들어, 블로그 게시물의 태그를 저장하려면 일반적으로 블로그 게시물 용 테이블, 태그 테이블 및 일치하는 테이블이 필요합니다. 따라서 사용자가 게시물을 편집하고 해당 게시물과 관련된 태그를 표시해야하는 경우 3 개의 테이블을 쿼리해야합니다. 매칭 테이블 / 태그 테이블이 길면 성능이 크게 저하됩니다.

태그를 블로그 게시물 테이블에 JSON으로 저장하면 동일한 작업에 단일 테이블 검색 만 필요합니다. 그러면 사용자는 블로그 게시물을 더 빨리 볼 수 있지만 태그에 연결된 게시물에 대한 보고서를 작성하거나 태그로 검색하려는 경우 성능이 저하됩니다.

데이터베이스의 비정규 화를 시도 할 수도 있습니다. 데이터를 복제하고 두 가지 방법으로 데이터를 저장하면 두 가지 방법의 이점을 모두 얻을 수 있습니다. 데이터를 저장하는 데 약간의 시간과 더 많은 저장 공간이 필요합니다 (더 많은 컴퓨팅 성능에 비해 저렴함).


8

이것을 고려해야하는 유일한 두 가지 이유는 다음과 같습니다.

  • 정규화 된 접근 방식으로는 성능이 충분하지 않습니다.
  • 특히 유동적이거나 유연하거나 변화하는 데이터를 쉽게 모델링 할 수 없습니다.

여기에 내 접근 방식에 대해 약간 썼습니다.

NoSQL 데이터 저장소를 사용할 때 어떤 확장 성 문제가 발생 했습니까?

(상위 답변 참조)

JSON조차도 충분히 빠르지 않았기 때문에 맞춤형 텍스트 형식 접근 방식을 사용했습니다. 일 했음 / 우리를 위해 계속 잘 작동합니다.

MongoDB와 같은 것을 사용하지 않는 이유가 있습니까? (MySQL이 "필수"일 수 있습니다. 궁금합니다.)


6

이 질문에 대답하는 모든 사람은 @deceze를 제외하고는 하나의 중요한 문제를 놓치고있는 것 같습니다 . 작업에 적합한 도구를 사용하십시오 . 관계형 데이터베이스에 거의 모든 유형의 데이터를 저장하도록 강제 할 수 있으며 Mongo가 관계형 데이터를 처리하도록 강제 할 수 있지만 비용은 얼마입니까? 스키마 디자인에서 애플리케이션 코드에 이르기까지 모든 수준의 개발 및 유지 관리에서 복잡성이 발생합니다. 성능 저하는 말할 것도 없습니다.

2014 년에는 특정 유형의 데이터를 예외적으로 잘 처리하는 많은 데이터베이스 서버에 액세스 할 수 있습니다.

  • Mongo (문서 보관)
  • Redis (키-값 데이터 저장소)
  • MySQL / Maria / PostgreSQL / Oracle / etc (관계형 데이터)
  • CouchDB (JSON)

RabbirMQ 및 Cassandra와 같은 다른 것을 놓쳤을 것입니다. 내 요점은 저장해야하는 데이터에 적합한 도구를 사용하는 것입니다.

애플리케이션에 다양한 데이터의 저장 및 검색이 정말 빠르고 (그리고 그렇지 않은 사람) 애플리케이션에 대해 여러 데이터 소스를 사용하는 것을 주저하지 마십시오. 가장 널리 사용되는 웹 프레임 워크는 여러 데이터 소스 (Rails, Django, Grails, Cake, Zend 등)를 지원합니다. 이 전략은 애플리케이션의 특정 영역, ORM 또는 애플리케이션의 데이터 소스 인터페이스로 복잡성을 제한합니다.


1
귀하의 의견으로는 RabbitMQ가 데이터베이스 서버입니까 아니면 어떤 종류입니까? 나는 메시지를 잃지 않는 멋진 작은 지속성 기능을 가진 메시지 지향 미들웨어라고 말하고 싶지만 데이터를 저장할 수는 없습니다. 내 2 센트.
Osiriz 2015 년

@Osiriz : 맞습니다. 이 토론에 포함하지 말았어야 할 것 같습니다.
CheddarMonkey

5

다음은 JSON 배열의 키를 열에 저장 / 업데이트하는 함수와 JSON 값을 검색하는 다른 함수입니다. 이 함수는 JSON 배열을 저장하는 열 이름이 json 이라고 가정하여 생성 됩니다. PDO를 사용하고 있습니다.

저장 / 업데이트 기능

function save($uid, $key, $val){
 global $dbh; // The PDO object
 $sql = $dbh->prepare("SELECT `json` FROM users WHERE `id`=?");
 $sql->execute(array($uid));
 $data      = $sql->fetch();
 $arr       = json_decode($data['json'],true);
 $arr[$key] = $val; // Update the value
 $sql=$dbh->prepare("UPDATE `users` SET `json`=? WHERE `id`=?");
 $sql->execute(array(
   json_encode($arr), 
   $uid
 ));
}

여기서 $ uid 는 사용자 ID, $ key-업데이트 할 JSON 키이며 값은 $ val 로 언급됩니다 .

가치 기능 얻기

function get($uid, $key){
 global $dbh;
 $sql = $dbh->prepare("SELECT `json` FROM `users` WHERE `id`=?");
 $sql->execute(array($uid));
 $data = $sql->fetch();
 $arr  = json_decode($data['json'], true);
 return $arr[$key];
}

여기서 $ key 는 값이 필요한 JSON 배열 의 키입니다 .


1
이것은 충돌하는 경우에 실패합니다. 방금 읽은 json이 다른 프로세스에 의해 업데이트 된 다음 json을 현재 스레드에 저장하여 덮어 쓰면 어떻게됩니까? SELECT FOR UPDATEjson 데이터 와 같은 잠금 또는 버전 관리 가 필요할 수 있습니다 .
DhruvPathak 2014

@DhruvPathak SELECT FOR UPDATE더 나아질 수 있도록 사용하여 답변을 업데이트 해 주시겠습니까? 나는 그것을 사용하는 방법을 모른다.
Subin 2014-06-04

3

MySQL에 JSON을 저장하기위한 초기 지원이 MySQL 5.7.7 JSON 랩 릴리스 ( linux 바이너리 , 소스 )에 추가되었습니다! 이 릴리스는 2013 년에 공개 된 일련의 JSON 관련 사용자 정의 함수에서 성장한 것으로 보입니다 .

이 초기 네이티브 JSON 지원은 JSN_EXTRACT 함수가 모든 액세스에 대해 구문 분석을 수행하는 대신 이진 조회를 수행 할 수 있도록하는 프리앰블의 조회 테이블을 포함하는 최적화 된 이진 스토리지 형식 인 INSERT에 대한 JSON 유효성 검사를 포함하여 매우 긍정적 인 방향으로 향하고있는 것 같습니다. 또한 특정 JSON 데이터 유형을 처리하고 쿼리하기위한 새로운 함수가 많이 있습니다.

CREATE TABLE users (id INT, preferences JSON);

INSERT INTO users VALUES (1, JSN_OBJECT('showSideBar', true, 'fontSize', 12));

SELECT JSN_EXTRACT(preferences, '$.showSideBar') from users;

+--------------------------------------------------+
| id   | JSN_EXTRACT(preferences, '$.showSideBar') |
+--------------------------------------------------+
| 1    | true                                      |
+--------------------------------------------------+

IMHO, 위의 내용은이 새로운 기능에 대한 훌륭한 사용 사례입니다. 많은 SQL 데이터베이스에는 이미 사용자 테이블이 있으며 진화하는 사용자 기본 설정 집합을 수용하기 위해 스키마를 끝없이 변경하는 대신 단일 JSON 열을 하나만 사용하는 JOIN것이 완벽합니다. 특히 개별 항목에 대해 쿼리 할 필요가 없을 것 같습니다.

아직 초기이지만, MySQL 서버 팀은 변경 통신 훌륭한 일하고있는 블로그 .


2

JSON을 mysql 데이터베이스에 저장하면 실제로 RDBMS를 사용하려는 목적에 위배된다고 생각합니다. 복잡성을 추가 할뿐만 아니라 사용 방법에 따라 성능에 쉽게 영향을 줄 수 있기 때문에 어느 시점에서 조작되거나보고되는 데이터에는 사용하지 않을 것입니다.

그러나 다른 사람이 실제로 이것을 할 수있는 이유를 생각하는지 궁금했습니다. 로깅 목적으로 예외를 만들려고했습니다. 제 경우에는 가변적 인 양의 매개 변수와 오류가있는 요청을 기록하고 싶습니다. 이 상황에서 요청 유형에 대한 테이블을 사용하고 얻은 다른 값의 JSON 문자열이있는 요청 자체를 사용하려고합니다.

위의 상황에서 요청은 기록되고 JSON 문자열 필드 내에서 조작되거나 색인화되지 않습니다. 그러나 더 복잡한 환경에서는 이러한 유형의 데이터에 대해 더 많은 의도가있는 것을 사용하여 해당 시스템에 저장하려고 할 것입니다. 다른 사람들이 말했듯이 그것은 당신이 성취하려는 것에 달려 있지만 표준을 따르는 것은 항상 수명과 신뢰성에 도움이됩니다!


2

JSON은 PostgreSQL 데이터베이스에서도 유효한 데이터 유형입니다. 그러나 MySQL 데이터베이스는 아직 공식적으로 JSON을 지원하지 않습니다. 그러나 그것은 굽고 있습니다 : http://mysqlserverteam.com/json-labs-release-native-json-data-type-and-binary-format/

또한 일부 데이터가 데이터베이스의 문자열로 직렬화되는 것이 더 나은 경우가 많다는 데 동의합니다. 주된 이유는 정기적으로 쿼리하지 않고 자체 스키마가 변경 될 수있는 경우 일 수 있습니다. 이에 해당하는 데이터베이스 스키마를 변경하고 싶지 않을 수 있습니다. 두 번째 이유는 직렬화 된 문자열이 외부 소스에서 직접 가져온 경우, 모든 문자열을 구문 분석하고 사용할 때까지 어떤 비용으로도 데이터베이스에 공급하지 않을 수 있다는 것입니다. 따라서 다른 데이터베이스간에 전환하는 것이 더 쉬울 것이기 때문에 JSON을 지원하는 새 MySQL 릴리스를 기다릴 것입니다.


1

나는 프로젝트를 위해 무엇이든 기록하기 위해 json을 사용합니다. 사실 저는 세 개의 테이블을 사용합니다! 하나는 json의 데이터, 하나는 json 구조의 각 메타 데이터 인덱스 용 (각 메타는 고유 한 ID로 인코딩 됨), 세션 사용자 용입니다. 이 초기 코드 상태에서는 벤치 마크를 정량화 할 수 없지만, 예를 들어 카테고리 (또는 사용자로서의 모든 것)를 얻기 위해 사용자 뷰 (인덱스와 내부 조인)를 사용했으며 매우 느 렸습니다 (매우 느 렸습니다. , mysql에서 사용되는 뷰는 좋은 방법이 아닙니다). 이 구조의 검색 모듈은 내가 원하는 모든 것을 할 수 있지만, 완전한 json 데이터 레코드 개념에서 mongodb가 더 효율적이라고 생각합니다. 예를 들어, 사용자 뷰를 사용하여 범주 트리를 만들고 빵 경로를 만듭니다. 할 너무 많은 쿼리! 아파치 자체가 사라졌습니다! 사실,이 작은 웹 사이트에서는 트리와 이동 경로를 생성하는 PHP를 알고 있습니다. 데이터 추출은 검색 모듈 (인덱스 만 사용)에 의해 수행되며 데이터 테이블은 업데이트에만 사용됩니다. 원하는 경우 모든 인덱스를 파괴하고 각 데이터로 재생성 할 수 있으며, 역방향 작업을 수행하여 모든 데이터 (json)를 파괴하고 인덱스 테이블로만 재생성 할 수 있습니다. 내 프로젝트는 php와 mysql에서 실행되고 있지만 언젠가 노드 js와 mongodb를 사용하는 것이이 프로젝트에 더 효율적일 것입니다.

할 수 있다고 생각하면 json을 사용하십시오. 실수 였다면 잊어 버리세요. 좋은 선택 또는 나쁜 선택을 시도하지만 시도하십시오!

낮은

프랑스 사용자


1
이해하지 못했습니다. 저는 영어를 기본적으로 사용하지 않지만 마침표 (.), 쉼표 (,) 및 단락 (Enter 키)을 사용하여 아이디어를 구성하는 것이 좋습니다. 그런 다음, 단지 다음, 데이터베이스 ;-) 구성하려고
디에고 Jancic

당신이 맞아요, 사실은 대답을 혼동하고, 예를 보여줌으로써 더 분명해야합니다. 그러나 mysql을 mongoDB로 대체 할 수 있다면 json (mongodb의 기본)을 사용하는 것이 더 효율적일 것입니다. mysql이 필수 인 경우 며칠 후에 다시 시도해 봅시다!
최저

1

나는 이것이 정말로 늦었다는 것을 알고 있지만 테이블을 정규화하는 RDBMS 표준을 일정 지점까지 유지 한 다음 JSON에 데이터를 그 지점을 넘어서는 텍스트 값으로 저장하는 하이브리드 접근 방식을 사용한 비슷한 상황이있었습니다. 예를 들어 RDBMS 정규화 규칙에 따라 4 개의 테이블에 데이터를 저장합니다. 그러나 동적 스키마를 수용하기 위해 네 번째 테이블에서 데이터를 JSON 형식으로 저장합니다. 데이터를 검색하고 싶을 때마다 JSON 데이터를 검색하고 파싱하여 Java로 표시합니다. 이것은 지금까지 나를 위해 일했으며 ETL을 사용하여 테이블의 json 데이터로 변환하는 필드를 정규화 된 방식으로 여전히 인덱싱 할 수 있는지 확인했습니다. 이는 사용자가 애플리케이션에서 작업하는 동안 최소한의 지연에 직면하고 필드가 데이터 분석 등을 위해 RDBMS 친화적 인 형식으로 변환되도록합니다.


0

이 요점을 사용할 수 있습니다 : https://gist.github.com/AminaG/33d90cb99c26298c48f670b8ffac39c3

서버에 설치 한 후 (슈퍼가 아닌 루트 권한 만 필요) 다음과 같이 할 수 있습니다.

select extract_json_value('{"a":["a","2"]}','(/a)')

a 2 이것을 사용하여 JSON 내부에서 무엇이든 반환 할 수 있습니다. 좋은 부분은 MySQL 5.1,5.2,5.6을 지원한다는 것입니다. 그리고 서버에 바이너리를 설치할 필요가 없습니다.

이전 프로젝트를 기반으로 common-schema하지만 오늘날에도 여전히 작동합니다. https://code.google.com/archive/p/common-schema/


요점은 이제 404입니다
neoDev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.