2

을 만드는 : 중요한 방법 자동차 (ndb.Model)과 지점 (ndb.Model) 각각.나는 두 가지 모델이 구글 앱 엔진의 화합물 또는 복합 키

@classmethod 
def car_key(cls, company_name, car_registration_id): 
    if not (company_name.isalnum() and car_registration_id.isalnum()): 
     raise ValueError("Company & car_registration_id must be alphanumeric") 
    key_name = company_name + "-" + car_registration_id 
    return ndb.Key("Car", key_name) 

지점 키 :

@classmethod 
def branch_key(cls, company_name, branch_name): 
    if not (company_name.isalnum() and branch_name.isalnum()): 
     raise ValueError("Company & Branch names must be alphanumeric") 
    key_name = company_name + "-" + branch_name 
    return ndb.Key("Branch", key_name) 

나는이를 생각하고 그러나 당신이 키를 사용하기로되어있는 방법을 정말 조금 못생긴하지.

(자동차 등록 자동차에 고유하지만 때로는 한 회사가 다른 회사에 자동차를 판매 할 수 있으며, 또한 자동차 나뭇 가지 사이를 이동).

기업이 많은 자동차 나 많은 지점, 당신은 초에 한 번씩 엔티티 그룹에 쓸 수 있기 때문에 큰 개체 그룹을 원하지 않는 가정 수 있기 때문에

.

키 정의는 어떻게해야합니까?

나는 자동차가 많은 회사를 가질 가능성이 없기 때문에 car_key = ndb.Key("Car", car_reg_id, "Company", company_name) 을 고려하고있다. 그래서 엔티티 그룹은 너무 크지 않을 것이다.

그러나 나는 많은 회사가 같은 지점 이름을 가질 수 있기 때문에 분기 키에 대해 무엇을해야하고, 많은 지점은 같은 회사가있을 수 있습니다 모르겠어요.

답변

3

당신은 바로 GAE에서 조상의 관계는 데이터의 논리적 구조를 기반으로되지 않아야 함을 확인했습니다.

응용 프로그램의 트랜잭션 동작을 기반으로해야합니다. 조상은 당신의 삶을 어렵게 만듭니다. 예를 들어, 복합 키를 사용하면 키의 모든 요소를 ​​알지 못하면 키별로 해당 엔티티를 가져올 수 없습니다. 자동차 ID를 알고 있다면 다른 구성 요소를 모른 채로 가져올 수 없습니다.

강력한 일관성을 유지하는 데 필요한 쿼리를 고려하십시오. 특정 분기에서 모든 차량을 쿼리 할 때 강력한 일관성이 필요하면 우연히이를 사용하여 조상으로 고려해야합니다.

엔티티 그룹을 사용하는 또 다른 이유는 트랜잭션에서 수행해야 할 작업을 고려하십시오.

또한 명심하십시오, 당신은 전혀 실체 그룹 (상황에 아마 대답)가 필요하지 않을 수 있습니다.

또는 논리 개념 모델과 정확하게 일치하지 않는 엔티티 그룹이 필요할 수 있지만 특정 트랜잭션에 대해 조상이 필요하기 때문에 조상은 순수하게 존재하는 엔티티 일 수 있습니다.

+0

감사합니다. 나는 항상 로그인 한 사용자 계정과 관련된 회사 이름과 지점 이름을 알고 있습니다. 따라서 나는 열쇠를 그대로 유지할 것입니다. (중간에 "-"가 붙은 두 개의 문자열). 각 지점에 대해 자동차 등록 ID 목록을 작성하겠습니다. 그러면 관련 자동차를 살펴보고 등록 ID가 주어질 "자동차 수정"을 클릭하십시오. –