2012-04-24 7 views
3

GAE에서 내 DAO 레이어에 Objectify를 사용하고 있습니다. 대부분의 엔티티를 소프트 삭제 가능하게 만들고 싶습니다.이 엔티티를 isActive 부울로 확장하는 것이 좋습니다. 임베디드를 사용해야합니까, 아니면 인터페이스를 isSoftDeleteable로 설정해야합니까?Google App Engine/Objectify 소프트 삭제

이유 나는 동일한 엔터티 종류 (적어도 _ah/admin에서 볼 수있는 것)와 동일한 부모 클래스를 사용하여 개체를 저장하는 것을 목표로하고 있으며 모든 항목이 같은 엔터티에있을 때 쿼리 속도가 느려질 수 있습니다. 어쩌면?

GAE에서 소프트 삭제를 수행하는 가장 좋은 방법은 무엇입니까?

미리 알려 주시기 바랍니다.

+0

Datastore는 하나뿐입니다. 아마도 당신은 같은 종류의 존재를 의미했을 것입니다. –

+0

예 ... 동일한 엔티티 종류를 의미했습니다. Peter에게 수정을위한 –

답변

5

이 질문에 대한 정답은 하나도 없습니다. 최적의 솔루션은 주로 특정 시점에 삭제 된 상태로 유지 될 가능성이있는 엔티티의 비율에 따라 달라집니다.

하나의 옵션은 @Index(IfTrue.class) boolean active; 같은 필드를 저장하고 모든 쿼리에이 필터를 추가하는 것입니다

ofy.load().type(Thing.class).filter("size >", 20).filter("active", true) 

이것의 단점은 별도의 인덱스를 추가 필요로한다는 것이다 - 당신이 지금 여러 프로퍼티를 필요로 할 수 있기 때문에 가능하면 여러 단일 속성 인덱스가 충분할 인덱스.

또는 '삭제됨'플래그를 저장하고 삭제 된 항목을 쿼리 결과에서 수동으로 제외 할 수 있습니다. 유지 관리해야 할 인덱스가 적지 만 원하지 않는 레코드를 가져올 때 각 쿼리에 추가 오버 헤드가 추가됩니다. 삭제 된 항목이 드문 경우이 문제가되지 않습니다.

마지막 트릭. 아마 가장 유용 할 것이므로 삭제 된 날짜를 인덱스에 저장하는 것이 가장 좋습니다. @Index Date deleted; 이렇게하면 filter("deleted", null)이 활성 항목을 가져올 수 있으며 삭제할 수있는 정말 오래된 항목을 얻기 위해 datestamp로 필터링 할 수 있습니다. 그러나 이로 인해 삭제 된 날짜가 여러 속성 색인으로 색인화되어 삭제 된 항목의 비율이 높을 경우 색인 크기가 크게 증가 할 수 있습니다. 이 경우 @Index(IfNull.class) Date deleted;을 사용하고 map-reduce를 사용하여 충분히 오래된 엔티티를 제거 할 수 있습니다.

+0

을 부탁드립니다. 모든 Entity에 부울 필드를 추가하고 추상/부모 클래스를 갖는 대신 색인을 작성하고 모든 Entity에서이를 확장하도록하는 것이 더 좋습니다. –

+0

삭제 가능한 각 클래스에 부울/날짜 필드를 추가할지 또는 삭제 가능한 클래스를 Deletable (부울/날짜 포함)으로 확장할지 여부는 거의 중요하지 않습니다. 그러나 'isa'Deletable을 모델링해야하는 강력한 이유가 없다면 이는 과장된 것처럼 들릴 것입니다. 단일 상속 문제가 발생할 수도 있습니다. Deletable 인터페이스를 사용하는 것이 더 나을 것입니다. – stickfigure

1

나는 StickFigure의 답변에 동의합니다. "빈"색인과 "널 (null)"색인의 차이점을 이용하십시오. 단점은 각 쓰기가 더 많은 데이터 저장소 쓰기 작업을 필요로한다는 것입니다. 인덱스를 추가 할 때마다 값을 업데이트 할 때마다 필요한 최소 2 개의 추가 쓰기 연산 (오름차순 및 내림차순) 인덱스가 필요합니다. 색인을 삭제하면 2 회 더 기록됩니다. 개인적으로 이것은 가치있는 일이라고 생각합니다.

엔티티 종류의 단일 속성에 대한 쿼리를 수행 할 때마다 쿼리 시간이 상당히 예측 가능해야합니다. 커버 아래에서 일어나는 일을 생각하면 병렬 배치를 수행하기 전에 순차적으로 항목 목록을 탐색하기 때문입니다 엔티티 데이터를 얻는다.