다차원 관계를 가진 두 개의 모델 인 Transaction과 Person이 있습니다. 각 거래에는 인원이 포함되어 있습니다. 각 개인의 경우, 해당 개인이 연결된 각 거래에 연결된 금액도 있습니다. 따라서 관계 데이터를 사용하여 다 대다 관계를 모델링해야합니다. 나는이 같은 모델이이 방법으로Google App Engine에서 관계 데이터를 사용하여 다 대다 모델링하기
http://code.google.com/intl/sv-SE/appengine/articles/modeling.html
:
class TransactionPerson(db.Model):
# References
transaction = db.ReferenceProperty(Transaction, required=True)
person = db.ReferenceProperty(Person, required=True)
# Values
amount = db.FloatProperty(required=True)
을하지만 사람마다 양을 요약해야하는 경우 때문에 나는 성능이 아주 나쁜 찾을 구글은이 방법을 제안한다 모든 트랜잭션에서 금액을 합산하면서 "조인"을 구현하기 위해 Person * Transaction * TransactionPerson 시간을 반복해야합니다.
내 생각
내 생각은 트랜잭션 모델이리스트하는 것입니다 :
class Transaction(db.Model):
persons = ListProperty(db.Key)
persons_amount = ListProperty(float)
내가 관련 찾기 위해 각각의 사람에 대한 모든 TransactionPerson을 통해 루프를하지 않아도이 방법을 트랜잭션. 그리고 여전히 사람을 기반으로 트랜잭션을 쿼리 할 수 있습니다.
질문
- 이 가능합니까? 저장/검색 할 때 목록 순서가 항상 동일하므로 목록간에 색인이 동기화됩니다.
- 관련 데이터와 다 대 다 관계를 구현하는 좋은 방법입니까?
그러나 왜 덜 효율적인 작업을 야기 할 때 중급 연관 엔터티가 좋은 접근 방법입니까? 예를 들어 당신의 접근법; 트랜잭션이 업데이트되면 트랜잭션과 관련된 모든 Person 객체를 자주 업데이트해야합니다. 내 접근 방식을 사용하면 필요하지 않습니다. 협회 법인을 사용하는 것이 더 나은 이유는 무엇입니까? – thejaz
둘 중 어느 것이 더 나은 선택 일지 모르겠지만, 제 대답은 요약 데이터를 계산하는 특정 질문에 초점을 맞추고 있습니다. 특정 요청을 만족시키기 위해 소수 이상의 엔티티를로드해야하는 경우 값이 변경 될 때와 같이 요청에서 해당 프로세스를 추출하고 다른 방식으로 빌드하는 방법을 찾아야 할 것입니다. – SingleNegationElimination
요약 데이터는 한 가지 예일뿐입니다. 나는 종종 거래에서 모든 사람을 얻고 싶다. 나는 실제적으로 동일한 Person * Transaction * TransactionPerson 루프를 가지기를 원한다. 비록 그것이 더 희귀 할지라도 (나는 TransactionPerson을 추가하거나 편집 할 때조차도), 현명한 성능으로 받아 들일 수 없다. 거래에 해당 데이터 (사람 목록)를 캐싱해야한다고해도 내 질문에서 제안한 것과 동일하지만 목록에 관계 데이터가 추가되어 있습니다. 중복 된 데이터로 이어지지는 않습니다. 어떻게 할 건데? – thejaz