복붙노트

[SQL] 보관 JSON 데이터베이스 대에 각 키에 대한 새 열을 가진

SQL

보관 JSON 데이터베이스 대에 각 키에 대한 새 열을 가진

내 테이블에 사용자 관련 데이터를 저장하기 위해 다음과 같은 모델을 구현하고 - UID (기본 키) 저장 JSON 형식으로 사용자에 대한 다른 데이터를 메타 칼럼 - 나는 2 열이.

 uid   | meta
--------------------------------------------------
 1     | {name:['foo'], 
       |  emailid:['foo@bar.com','bar@foo.com']}
--------------------------------------------------
 2     | {name:['sann'], 
       |  emailid:['sann@bar.com','sann@foo.com']}
--------------------------------------------------

이 더 좋은 방법입니다 (성능 현명한, 디자인 현명한) 테이블이 UID, 이름, EMAILID처럼 많은 열이 것 하나 열 당 재산 모델보다.

첫 번째 모델이다 내가 좋아하는 어떤 제한이 없다 가능한 한, 당신은 많은 필드로 추가 할 수 있습니다.

또한, 나는 내가 처음 모델을 구현 한 지금, 궁금 해서요. 어떻게 내가 좋아하는, 내가 '갑'과 같은 이름을 가진 모든 사용자를 가져 오기하고자하는, 거기에 쿼리를 수행합니까?

질문 - JSON 또는 열 당 필드 - 사용하여 데이터베이스 (필드의 숫자가 해결되지 않은 것을 염두에두고) 저장소 사용자 관련 데이터에 더 좋은 방법이 무엇입니까? 첫 번째 모델이 구현되는 경우에도, 어떻게 쿼리 데이터베이스에 상기 한 바와 같이? 나는 둘 다 별도의 행 및 JSON의 다른 데이터 쿼리에 의해 검색 할 수있는 모든 데이터를 저장하여 (다른 행이다) 모델 사용해야합니까?

내가 검색을 수행 할 필요가있는 너무 많은 열이 없을 것이기 때문에, 그것은 현명한 모델을 모두 사용할 수 있나요? 키 당 열 내가 검색 및 JSON 다른 사람 (같은 MySQL 데이터베이스에) 데 필요한 데이터 하시나요?

해결법

  1. ==============================

    1.이 질문 / 대답은 약간의 인기를 얻고있다 감안할 때, 나는 그것이 업데이 트의 가치라고 생각 했어요.

    이 질문 / 대답은 약간의 인기를 얻고있다 감안할 때, 나는 그것이 업데이 트의 가치라고 생각 했어요.

    이 질문에 처음 게시되었을 때, MySQL은 JSON 데이터 유형에 대한 지원이 없었다과 PostgreSQL의 지원은 초기 단계에 있었다. 5.7 이후, MySQL은 이제 (이진 저장 형식)을 JSON 데이터 형식을 지원과 PostgreSQL JSONB 상당히 성숙. 두 제품은 JSON 객체의 특정 키를 색인에 대한 지원을 포함하여 임의의 문서를 저장할 수있는 성능이 좋은 JSON 유형을 제공합니다.

    그러나, 나는 여전히 관계형 데이터베이스를 사용하는 경우 기본 환경이 여전히 열 당 값을해야한다는 내 원래의 문이 서있다. 관계형 데이터베이스는 여전히 내의 데이터가 상당히 잘 정상화됩니다의 가정에 내장되어 있습니다. JSON 문서에서 키를 볼 때보다 열을 볼 때 쿼리 플래너는 더 나은 최적화 정보가 있습니다. 외부 키 컬럼 사이에 (하지만 JSON 문서의 키 사이) 할 수 있습니다. 중요한 : 스키마의 대부분이 JSON을 사용하여 정당화하기 휘발성 충분한 경우, 당신은 적어도 관계형 데이터베이스가 올바른 선택 인 경우 고려에서 할 수 있습니다.

    말했다 즉, 일부 응용 프로그램은 완벽하게 관계형 또는 문서 중심이다. 대부분의 응용 프로그램은 모두 몇 가지 혼합이있다. 여기에 내가 개인적으로 관계형 데이터베이스에서 JSON 유용하다고 몇 가지 예입니다 :

    나는 확실히뿐만 아니라 다른 사람이되어있어, 그러나 이들은 단지 몇 가지 간단한 예입니다.

    당신이 정말로 당신이 (임의의 문서 크기 제한 제외) 제한없이 원하는만큼 많은 분야로 추가 할 수있게하려면, 같은 MongoDB를 같은 NoSQL의 솔루션을 고려한다.

    사용 가치 당 하나의 열 : 관계형 데이터베이스하십시오. (당신이 실제로 작동하는지 쿼리를 찾을 때 천천히 고통스럽게) 열에서 JSON의 덩어리를 두는 것은 쿼리가 사실상 불가능합니다.

    관계형 데이터베이스 색인화 할 때 데이터 유형을 활용하고, 정규화 된 구조로 구현되도록 의도된다.

    보조 노트로 : 이것은 당신이 관계형 데이터베이스에 JSON을 저장해서는 안 말할 수 없습니다. 당신의 JSON 조회 할 필요가 없습니다 만 표시하기 위해 사용되는 정보를 기술하는 경우 당신이 진정한 메타 데이터를 추가하거나하는 경우, 데이터의 모든 포인트에 대해 별도의 열을 생성하는 과잉 될 수있다.

  2. ==============================

    2.대부분의 것들과 마찬가지로 "이 달려있다." 그것은 오른쪽 또는 잘못 / 좋은 또는 나쁜 자체의 열 또는 JSON 데이터를 저장하지 않도록합니다. 그것은 당신이 나중에 그것으로 무엇을해야하는지에 따라 달라집니다. 이 데이터에 액세스하여 예측 방법은 무엇입니까? 당신은 상호 참조 다른 데이터해야합니까?

    대부분의 것들과 마찬가지로 "이 달려있다." 그것은 오른쪽 또는 잘못 / 좋은 또는 나쁜 자체의 열 또는 JSON 데이터를 저장하지 않도록합니다. 그것은 당신이 나중에 그것으로 무엇을해야하는지에 따라 달라집니다. 이 데이터에 액세스하여 예측 방법은 무엇입니까? 당신은 상호 참조 다른 데이터해야합니까?

    다른 사람들은 꽤 잘 기술적 인 절충이 무엇인지 대답했다.

    많은 사람들이 앱과 기능은 시간과 방법이 데이터 저장이 의사 결정에 미치는 영향 팀을 통해 발전한다는 논의는 않았습니다.

    JSON을 사용하는 유혹 중 하나는 스키마와 팀 훈련되지 않은 경우 그래서, 그것은 JSON 필드에 또 다른 키 / 값 쌍을 고수하는 것은 매우 쉬운 마이그레이션을 방지하는 것입니다 때문입니다. 그것에 대한 마이그레이션 아무도 그것을 위해 무엇을 기억하지 없습니다. 그것은 아무런 검증이 없습니다.

    우리 팀은 포스트 그레스의 측면 기존의 열을 따라 JSON을 사용하고 처음에는 슬라이스 빵 이후 가장 좋은 방법이었다. 우리는 그 유연성은 비용에왔다 실현 어느 날 JSON은 매력적이고 강력하고 갑자기 진짜 고통 포인트입니다. 점은 정말 빨리 섬뜩한 우리는이 디자인 결정의 상단에 다른 많은 일들을 내장했기 때문에 그것은 변화에 어려워진다 가끔있다.

    초과 근무, JSON의 데이터를 가지고, 새로운 기능을 추가 더 우리가 기존의 컬럼에 붙어 경우 추가되었을 수 있습니다 것보다보고 쿼리를 복잡하게되었다. 그래서 우리는 특정 키 값이 너무 열이 속으로 다시 조인 우리가 만들 수 있고 값 사이의 비교를 낚시를 시작했다. 나쁜 생각. 이제 우리는 중복을했다. 새로운 개발자는 보드에 올 것와 혼동? 값은 내가 어느로 다시 저장해야합니까? json으로 하나 열?

    json으로 필드를 이것 저것의 작은 조각을 위해 정크 서랍되었다. 데이터베이스 레벨, 문서 사이에 일관성 또는 무결성에 대한 자료 검증하지 않습니다. 그 대신 기존의 열에서 하드 타입과 제약 조건 검사를 얻기의 응용 프로그램에 대한 모든 책임을 밀었다.

    돌아 보면, JSON은 매우 빠르게 반복하는 우리를 허용하고 문 밖으로 뭔가를 얻을. 그것은 훌륭했다. 우리가 특정 팀 크기에 도달하지만 이후의 유연성 또한 후속 기능의 진화의 진행 속도가 느려졌 기술 부채의 긴 밧줄로 자신을 걸어 우리를 허용했다. 주의해서 사용합니다.

    긴 생각하고 데이터의 본질이 무엇인지에 대해 하드. 그것은 당신의 응용 프로그램의 기초입니다. 어떻게 데이터가 시간이 지남에 사용됩니다. 그리고 어떻게 변경 될 수있다?

  3. ==============================

    3.그냥 거기에 그것을 밖으로 던지기,하지만 워드 프레스는 이런 종류의 물건에 대한 구조 (적어도 워드 프레스 내가 그것을 관찰 처음이었다, 아마 다른 곳에서 유래)가 있습니다.

    그냥 거기에 그것을 밖으로 던지기,하지만 워드 프레스는 이런 종류의 물건에 대한 구조 (적어도 워드 프레스 내가 그것을 관찰 처음이었다, 아마 다른 곳에서 유래)가 있습니다.

    그것은하지만 최대한 빨리되는 NoSQL 솔루션의 일부로서, 무한한 키를 허용하고, JSON의 덩어리를 사용하는 것보다 검색 빠릅니다.

    uid   |   meta_key    |   meta_val
    ----------------------------------
    1         name            Frank
    1         age             12
    2         name            Jeremiah
    3         fav_food        pizza
    .................
    

    편집하다

    과거 / 여러 키를 기억

    uid   | meta_id    |   meta_key    |   meta_val
    ----------------------------------------------------
    1        1             name            Frank
    1        2             name            John
    1        3             age             12
    2        4             name            Jeremiah
    3        5             fav_food        pizza
    .................
    

    및 쿼리 같은 것을 통해 :

    select meta_val from `table` where meta_key = 'name' and uid = 1 order by meta_id desc
    
  4. ==============================

    4.접근 방법의 단점은 당신이 언급 정확히 무엇 :

    접근 방법의 단점은 당신이 언급 정확히 무엇 :

    때마다 당신이 그것에 텍스트 검색을 수행 할 필요가 있기 때문에 그것은 일을 찾기가 매우 느린 있습니다.

    열당 값 대신 전체 문자열과 일치합니다.

    당신의 접근 방식 (JSON 기반의 데이터)를 사용하여 검색해야하고, 당신의 일반 데이터와 함께 표시 할 필요가없는 데이터를 괜찮습니다.

    편집 : 그냥이 명확히하기 위해 위의 고전적인 관계형 데이터베이스에 간다. 즉 원하는 동작 인 경우 NoSQL에 사용 내부적으로 JSON, 그리고 아마도 더 나은 옵션입니다.

  5. ==============================

    5.기본적으로, 당신이 사용하는 첫 번째 모델은 문서 기반 스토리지로라고합니다. 당신은 MongoDB를하고 CouchDB를 같은 인기있는 NoSQL의 문서 기반 데이터베이스에보고해야한다. 기본적으로, 문서 기반 DB 년대에, 당신은 JSON 파일에 데이터를 저장하고 당신은 이러한 JSON 파일에 쿼리 할 수 ​​있습니다.

    기본적으로, 당신이 사용하는 첫 번째 모델은 문서 기반 스토리지로라고합니다. 당신은 MongoDB를하고 CouchDB를 같은 인기있는 NoSQL의 문서 기반 데이터베이스에보고해야한다. 기본적으로, 문서 기반 DB 년대에, 당신은 JSON 파일에 데이터를 저장하고 당신은 이러한 JSON 파일에 쿼리 할 수 ​​있습니다.

    두 번째 모델은 인기있는 관계형 데이터베이스 구조입니다.

    당신이 MySQL을 같은 관계형 데이터베이스를 사용하려는 경우, 당신은 두 번째 모델을 사용하는 것이 좋습니다 것입니다. MySQL을 사용하고 제 모델과 데이터를 저장 소용이 없다.

    두 번째 질문에 대답하려면 먼저 모델을 사용하는 경우 '갑'과 같은 쿼리 이름 방법이 없습니다.

  6. ==============================

    6.당신이 주로 관계형 모델을 사용할지 여부를 주저하고 있다는 것.

    당신이 주로 관계형 모델을 사용할지 여부를 주저하고 있다는 것.

    약자로, 당신의 예는 합리적으로 잘 관계형 모델에 맞는 것입니다,하지만 당신은이 모델의 진화를해야 할 때 문제는 물론 올 수 있습니다.

    당신은 단지 하나가 (또는 몇 미리 정해진) 주요 엔티티 (사용자)의 속성 레벨의 경우, 당신은 여전히 ​​관계형 데이터베이스에서 엔티티 속성 값 (EAV) 모델을 사용할 수 있습니다. (이 또한 장점과 단점이 있습니다.)

    당신은 당신이 응용 프로그램을 사용하여 검색 할 수 있습니다 덜 구조화 된 값을 얻을 거라고 예상되는 경우, MySQL은 여기 최선의 선택을하지 않을 수 있습니다.

    당신은 PostgreSQL을 사용하고 있던 경우에, 당신은 잠재적으로 두 세계의 최고 얻을 수 있습니다. (이건 정말 여기에 데이터의 실제 구조에 따라 달라집니다 ... MySQL은 잘못된 선택 중 하나를 반드시 아니며, NoSQL이 옵션은 관심, 난 그냥 대안을 제안하고있어이 될 수 있습니다.)

    실제로, PostgreSQL는 (MySQL이없는 내가 아는 한 수) 최근 버전에서, 당신은 향상 것이다, 직접 관심의 특정 JSON 요소에 빌드 인덱스에 JSON 데이터에 PLV8를 사용할 수 있습니다 (불변) 기능에 대한 색인을 구축 할 수 있습니다 쿼리의 속도는 데이터를 검색 할 때.

    편집하다:

    응용 프로그램은 또한 다른 업데이트하지 않고 하나를 변경해서는 안 : 당신이 확실 세트가 동기화를 유지하는 두 개의 데이터를하지 않는 경우 두 모델을 혼합하는 (무시할만한 여분의 공간을 가정)하지만 문제가 발생할 수 있습니다 반드시 잘못되지 않습니다 .

    트리거를하는 것입니다 이것을 달성하는 좋은 방법은 업데이트 나 삽입 될 때마다 데이터베이스 서버에서 저장 프로 시저를 실행하여 자동 업데이트를 수행합니다. 내가 알고 있어요까지로, MySQL의 저장 프로 시저 언어는 아마 JSON 처리의 모든 종류에 대한 지원이 부족하다. (아마도 더 유연한 저장 프로 시저 언어와 다른 RDBMS) PLV8 지원 다시 PostgreSQL은 (자동 트리거를 사용하여 관계형 열이 같은 방법으로 인덱스를 업데이트 매우 유사 업데이트) 더 유용 할 것이다.

  7. ==============================

    7.약간의 시간이 오버 헤드가 될 것입니다 테이블에 조인. OLAP 말할 수 있습니다. 나는 두 개의 테이블이있는 경우 하나의 ORDERS 테이블이고 다른 하나는 ORDER_DETAILS입니다. 모든 주문 세부 정보를 얻기 위해 우리는 테이블 증가의 행에는 수백만 년 정도 말할 수 때 잘 너무 느린 내부 조인보다 조인 왼쪽 / .. 쿼리 느리게 만들 것 두 테이블을 조인해야합니다. 나는 우리가 각각의 ORDERS 항목에 JSON 문자열 / 객체를 추가하면 피해야합니다 가입 생각. 추가 보고서 생성이 빨라집니다 ...

    약간의 시간이 오버 헤드가 될 것입니다 테이블에 조인. OLAP 말할 수 있습니다. 나는 두 개의 테이블이있는 경우 하나의 ORDERS 테이블이고 다른 하나는 ORDER_DETAILS입니다. 모든 주문 세부 정보를 얻기 위해 우리는 테이블 증가의 행에는 수백만 년 정도 말할 수 때 잘 너무 느린 내부 조인보다 조인 왼쪽 / .. 쿼리 느리게 만들 것 두 테이블을 조인해야합니다. 나는 우리가 각각의 ORDERS 항목에 JSON 문자열 / 객체를 추가하면 피해야합니다 가입 생각. 추가 보고서 생성이 빨라집니다 ...

  8. ==============================

    8.짧은 답변 당신은 그들 사이에 혼합해야, , 주소, 제품 variabls 당신이 연락처 데이터처럼 그들과 관계를 만들려고되지 않도록 데이터를 JSON 사용

    짧은 답변 당신은 그들 사이에 혼합해야, , 주소, 제품 variabls 당신이 연락처 데이터처럼 그들과 관계를 만들려고되지 않도록 데이터를 JSON 사용

  9. ==============================

    9.당신은 관계형 데이터베이스에 비 관계형 모델에 맞게하려고, 난 당신이 더 나은 같은 MongoDB를 같이되는 NoSQL 데이터베이스를 사용하여 제공 될 것이라고 생각합니다. 이는 맞는 필드의 수에는 제한 (전형적인 MongoDB를 수집 예 참조)이없는 당신의 요구 사항과에 미리 정의 된 스키마가 없습니다. 예를 들어, 당신이 당신의 문서를 조회 할 거라고하는 방법에 대한 아이디어를 얻기 위해 MongoDB의 문서를 확인하세요

    당신은 관계형 데이터베이스에 비 관계형 모델에 맞게하려고, 난 당신이 더 나은 같은 MongoDB를 같이되는 NoSQL 데이터베이스를 사용하여 제공 될 것이라고 생각합니다. 이는 맞는 필드의 수에는 제한 (전형적인 MongoDB를 수집 예 참조)이없는 당신의 요구 사항과에 미리 정의 된 스키마가 없습니다. 예를 들어, 당신이 당신의 문서를 조회 할 거라고하는 방법에 대한 아이디어를 얻기 위해 MongoDB의 문서를 확인하세요

    db.mycollection.find(
        {
          name: 'sann'
        }
    )
    
  10. ==============================

    10.다른 사람들이 지적했듯이 쿼리 속도가 느려질 수 있습니다. 그 대신에 의해 쿼리에 적어도 '_ID'열을 추가하는 것이 좋습니다 것입니다.

    다른 사람들이 지적했듯이 쿼리 속도가 느려질 수 있습니다. 그 대신에 의해 쿼리에 적어도 '_ID'열을 추가하는 것이 좋습니다 것입니다.

  11. from https://stackoverflow.com/questions/15367696/storing-json-in-database-vs-having-a-new-column-for-each-key by cc-by-sa and MIT license