하나 이상의 태그로 표시된 게시물 (예 : 게시물)이 많습니다. 게시물을 작성하거나 삭제할 수 있으며 사용자는 하나 이상의 태그 (논리 AND와 결합)에 대한 검색 요청을 할 수 있습니다. 내 마음에 온 첫 번째 아이디어는 간단한 모델을 생성 및 삭제 작업의Google App Engine (Python)의 확장 성이 뛰어난 태그
class Post(db.Model):
#blahblah
tags = db.StringListProperty()
구현을 분명했다. 검색은 더욱 복잡합니다. N 개의 태그를 검색하려면 "SELECT * FROM Post WHERE tags = : 1"과 같은 N 개의 GQL 쿼리를 수행하고 커서를 사용하여 결과를 병합하면 성능이 좋지 않습니다.
두 번째 아이디어는 다른 엔티티
class Post(db.Model):
#blahblah
tags = db.ListProperty(db.Key) # For fast access
class Tag(db.Model):
name = db.StringProperty(name="key")
posts = db.ListProperty(db.Key) # List of posts that marked with tag
그것은 키 (훨씬 더 빨리 GQL에 의해 받아보다) 및 메모리에 병합 생각이 구현은 더 나은 성능을 제공하여 DB에서 태그 소요에 태그를 분리하는 것입니다 첫 번째 태그보다 더 많이 사용할 수 있지만 자주 사용되는 태그는 단일 데이터 저장소 개체에 허용되는 최대 크기를 초과 할 수 있습니다. 또 다른 문제가 있습니다. 데이터 저장소는 하나의 객체를 ~ 1/초로만 수정할 수 있기 때문에 자주 사용되는 태그의 경우 수정 대기 시간에 병목 현상이 있습니다.
제안 사항?
게시물 지연을위한 저널을 구현하면 트랜잭션 지연을 해결할 수 있습니다. 게시물이 추가 대기 중일 때 - memcache 복사가 만료 된 경우 저널이있는 각 태그에 대해 "해당 게시물이 해당 태그에 속합니다"(태그 엔티티의 memcache 사본을 수정 함)와 같은 정보가있는 특수 오브젝트를 작성합니다 applier는 모든 저널 항목을 수집하여 데이터 저장소의 태그 엔티티에 적용합니다 (또한 memcache로 복사). –