이 데이터 모델을 사용했습니다. (더 나은 방법이 있다면 알려주십시오.) 나는 Club
을 가지고 있는데, 많은 사람이 Courses
일 수 있습니다. 이제 클럽의 모든 members
과 instructors
을 알고 싶습니다. members
및 instructors
은 Course
모델에 저장되며 Club
에는 모델에 대한 참조가 있습니다. Course
에 @property
나에게 괜찮을 것 같다 ..NDB에 관계 값을 효율적으로 저장하는 방법
class Course(ndb.Model):
...
instructor_keys = ndb.KeyProperty(kind="User", repeated=True)
member_keys = ndb.KeyProperty(kind="User", repeated=True)
@property
def instructors(self):
return ndb.get_multi(self.instructor_keys)
@property
def members(self):
return filter(lambda x: x.is_active, ndb.get_multi(self.member_keys))
def add_instructor(self, instructor):
if instructor.key not in self.instructor_keys:
self.instructor_keys.append(instructor.key)
self.put()
def rm_instructor(self, instructor):
if instructor.key in self.instructor_keys:
self.instructor_keys.remove(instructor.key)
self.put()
def add_member(self, member):
if member.key not in self.member_keys:
self.member_keys.append(member.key)
self.put()
def rm_member(self, member):
if member.key in self.member_keys:
self.member_keys.remove(member.key)
self.put()
지금
class Club(ndb.Model):
...
owners_keys = ndb.KeyProperty(kind="User", repeated=True)
course_keys = ndb.KeyProperty(kind="Course", repeated=True)
@property
def members(self):
# TODO: is this correct? efficient?
l_members = []
for courses in self.courses:
l_members = l_members + courses.members
return l_members
@property
def trainers(self):
l_trainers = []
for courses in self.courses:
l_trainers = l_trainers + courses.trainers
return l_trainers
@property
def owners(self):
return ndb.get_multi(self.owners_keys)
@property
def courses(self):
return filter(lambda x: x.is_active, ndb.get_multi(self.course_keys))
def add_owner(self, owner):
if owner.key not in self.owners_keys:
self.owner_keys.append(owner.key)
self.put()
def rm_owner(self, owner):
if owner.key in self.owners_keys:
self.owner_keys.remove(owner.key)
self.put()
def add_course(self, course):
if course.key not in self.courses_keys:
self.course_keys.append(course.key)
self.put()
def rm_course(self, course):
if course.key in self.courses_keys:
self.course_keys.remove(course.key)
self.put()
def membership_type(self, user):
if user.key in self.owners_keys:
return "OWNER"
elif user in self.members:
return "MEMBER"
elif user in self.trainers:
return "TRAINER"
else:
raise Exception("The user %s is not in the club %s" % (user.id, self.id))
를 코드를 참조하십시오. (내가 맞습니까?) 그러나
Club
에있는 것은 매우 비효율적 인 것 같습니다. 모든
Courses
을 반복하여
members
및
trainers
을 계산할 때마다 게다가 이러한 메소드는 캐시되지 않고 매번 계산됩니다. 그래서 매우 비싸면.
의견이 있으십니까? instructors
과 members
을 Club
에있는 키 목록으로 생각하고 있는데, 누군가를 Course
에 추가 할 때마다 클럽을 업데이트하지만 올바른지 확신 할 수 없습니다.
추신 : ndb.get_multi
에 filter
을 더 잘 수행 할 수 있나요? 나는 드 정규화 한가는 대신 모델을 정상화하려고 것
감사합니다. 나는 NDB에서 정규화를 사용하고 올바른 접근법인지에 대해 확신하지 못했습니다. 나는 당신에게 내가 그 질문을 돌려줘야한다는 것에 동의합니다. 그러나'self.member_keys'는 키 목록입니다.이 경우 어떻게해야합니까? – EsseTi
'def build_id (user_key, course_key) :'는 자동으로 그 값에 대한 관계의 id를 설정합니까? 또는 put에서 어떻게 작동합니까? – EsseTi
build_id 예제를 생성시 사용하도록 수정했습니다 (물론 Inscription 클래스에서는 물론이 아닙니다) – marianosimone