2016-09-01 4 views
2

Django 프로젝트는 JSON 필드를 지원하는 postgresql 9.4를 사용합니다. 이 필드를 사용하여 관계형 스키마에서 부분적으로 비 관계형 스키마로 전환하고 싶습니다.Postgres와 Django의 비 관계형 데이터베이스 스키마

모델 FooBar이 있고 각 개체 Bar은 정확히 하나의 Foo에 속한다고 가정 해 봅시다. 현재, 나는 Bar에서 Foo까지의 ForeignKey를 모델로 사용하고 있지만 Foo 모델 인스턴스의 목록으로 직접 Bar 개체를 저장하는 것으로 전환하고 싶습니다. postgresql에서는 FooJSONField을 사용하여 Bar 개체의 JSON 표현 목록을 저장할 수 있지만 JSON에 대한 직렬화를 수동으로 처리해야합니다.

장고의 MongoDB를 ORM 깨끗한 방법으로 그렇게 장고 필드를 제공합니다 포스트그레스 백엔드와 유사한 기능을 할 수있는 방법이

class Foo(models.Model): 
    bar_list = ListField(EmbeddedModelField('Bar')) 

있습니까?

답변

0

서로 내에서 데이터 오브젝트를 중첩하는 것은 매우 비 관계형 데이터베이스 방식이므로 관계형 데이터베이스에서 성능 문제를 일으킬 수 있습니다. 중첩 된 JSON 데이터에

  1. 귀하의 질의 능력은 텍스트로 제한됩니다 : 당신은 포스트 그레스에서 이것을 시도하는 경우

    당신은 몇 가지 문제가 있습니다.

  2. 중첩 된 데이터의 정렬, 집계 등에 대해서는 잊어 버리십시오.
  3. 중첩 된 데이터가 필요할 때와 저장하기 위해 데이터베이스로 다시 보내기 전에 직렬화를 처리해야합니다.
  4. 기본적으로 관계형 데이터베이스에있는 모든 무결성 검사와 Django가 형식에 대해 갖는 멋진 검사를 우회하기 때문에 중첩 된 모델을 변경하면 매우 비중있게됩니다.
  5. Mongo에서 할 수있는 것처럼 중첩 된 개체의 양을 제한 할 방법이 없으므로 쿼리하는 모든 Foo에 대해 모든 중첩 된 개체를 검색해야하므로 쿼리 속도가 느려집니다.

여기에는 하나의 데이터베이스 유형 (관계형 또는 비 관계형)을 사용하고 어느 쪽에서도 잘 작동하는 것이 좋습니다.

Postgres가 외래 키를 사용해야하고 Mongo를 사용하는 경우 중첩 된 객체를 사용합니다.

+1

감사합니다.하지만 몇 년 동안 데이터를 가지고 놀았습니다. 내가 실행 한 쿼리를 알고 있으며,이 리팩터링을 통해 작업 속도를 향상시킬 필요가 있다고 확신합니다 (1. 중첩 된 객체 2.이 객체는 필요하지 않습니다 3. 이것은 ORM에 의해 처리되어야합니다 4.이 모델의 변경은 이미 파이썬 무겁습니다 5. 중첩 객체는 거의 없으며 Foo의 Bar 객체의 평균 개수는 닫습니다 하나에). – pintoch

+0

나는 그것이 잘못된 길을 택한 것을 본다. 데이터에 대한 지식에 의문을 제기하는 것이 아닙니다. 이전에 제가 경험 한 것과이 접근법의 단점을 여러분 께드립니다. 절대적으로 필요하기 때문에 Django 1.9부터 JSONField를 사용할 수 있습니다. 그것은 파이썬 객체를 받아 JSON으로 저장합니다. get 객체가 다시 파이썬으로 파싱 될 때 JSON으로 저장됩니다. –

+0

그래, 그게 내가 내 질문에 언급했던거야, 난 그냥 거기에 더 높은 수준의 버전이 있는지 궁금해. 분명히 거기에 없다, 그래서 대답은 질문. :-) – pintoch