2017-03-25 1 views
2

나는 많은 관계로 많은 구축을 위해 노력하고있어, 그래서 3 구조체가 :이 그것을 할 수있는 올바른 방법이지만, 내 문제는 지금은 알 수 없다는 것입니다 생각Datastore - 구조 ID (golang) 안에 키를 넣는 방법?

type Orders struct { 
    ID int64 
    CustomerID string 
    etc 
} 

type Products struct { 
    ID int64 
    Name string 
    Description string 
    etc 
} 

type OrderDetails struct { 
    OrderID int64 
    ProductID string 
    Quantity int 
} 

을 방법 내가 말할 수있는 한, datastore.IncompleteKey("Products", nil)은 당신이 그것을 넣을 때까지 새로운 키 값을 반환하지 않을 것이기 때문에 두 개의 client.Put 요청을하지 않고 데이터 스토어 키를 넣는다.

어떤 사람들은 key *datastore.Key을 사용하는 것이 좋습니다. ID int64 대신 키를 ID로 변환하는 것이 좋습니다

도움이 될 것입니다.

답변

2

하나의 옵션은 Client.Put()에 전화하기 전에 구조체에서 설정할 수있는 미리 키를 할당하는 것입니다.

Client.AllocateIDs()과 함께 ID를 할당 할 수 있습니다. 불완전한 키의 조각을 전달할 수 있으며 데이터 저장소가 보유한 완전 슬라이스 (datastore.Key)가 반환됩니다. 따라서 불완전한 키가있는 엔티티를 저장할 때 다른 사용자에게 "주지"하거나 사용하지 않아도됩니다. Key.ID 필드에서 할당 된 키의 숫자 ID에 액세스 할 수 있습니다.

엔티티에 숫자 키 ID를 저장하는 것은 불필요하며 자원 낭비라고 느낍니다. 예를 들어 항목을로드 할 때마다 Client.Get() 또는 복수형 Client.GetAll()을 사용하면 키가 반환되며 후 처리 단계로 구조체의 숫자 ID를 "수동으로"채울 수 있습니다. 데이터 저장소에서 엔티티를 가져올 때마다이 작업을 수행하는 함수에서이 사후 처리 기능을 래핑 할 수도 있습니다. 당신이 OrderID를 포함 넣은 OrderDetails 법인이있는 경우

예를 들어, 각각의 Order 기업의 datastore.Key를 구성 datastore.IDKey()를 사용할 수 있습니다. 그 일을 예 : 숫자 ID가 알려진 경우 엔티티에서 "자기 ID"를 저장하지 말아야 의미

var orderDetails OrderDetails 
// Load orderDetails 

orderKey := datastore.IDKey("order", orderDetails.OrderID, nil) 
// Now you have the key for the Order entity 

var order Order 
err := client.Get(ctx, orderKey, &order) 

, 당신은 datastore.Key 값을 구성 할 수 있습니다.

또한 관련 질문을 참조하십시오 Can I use AllocateIDs as "string" ? datastore

+0

와우, 나는 .. 감사가 필요 정확히 많은 <3 ..하지만 난 당신이 경우에 나는, 위의 예에서 의미가 낭비하는 이유에 대해 정말 궁금 해요 OrderDetails의 Client.GetAll()을 사용하면 OrderID 및 ProductID를 저장하지 않으면 Orders 및 Products를 어떻게 얻을 수 있습니까? – fisker

+0

@fisker 숫자 ID에서'datastore.Key'를 만들기 위해'datastore.IDKey()'를 사용할 수 있습니다. 편집 된 답변보기, 예제 추가. – icza

+0

Ahh, 이해할 것 같아요. 그래서 Orders와 Products (웹 애플리케이션에서 ID를 표시하기 위해) ID 필드를 계속 갖고 싶다면'datastore : "-"를 써서 낭비하지 않도록해야합니다. ('client.Get (ctx, orderKey, & order) '를 실행 한 후에)'order.ID = orderKey.ID'를 설정할 수 있습니까? – fisker

관련 문제