Setelah membaca tentang konsep/teori Google Datastore, saya mulai menggunakan paket datastore Go sebuah>
Skenario: Jenis User
dan LinkedAccount
mengharuskan setiap pengguna memiliki satu atau lebih akun tertaut (yay, login pihak ketiga). Untuk konsistensi yang kuat, LinkedAccounts akan menjadi turunan dari Pengguna terkait. Pembuatan Pengguna baru kemudian melibatkan pembuatan Pengguna dan Akun Tertaut, tidak hanya satu.
Pembuatan pengguna sepertinya merupakan kasus penggunaan yang sempurna untuk transaksi. Jika, katakanlah pembuatan LinkedAccount gagal, maka transaksi akan gagal. Saat ini hal ini tampaknya tidak mungkin dilakukan. Tujuannya adalah untuk membuat induk dan kemudian anak dalam suatu transaksi.
Menurut dokumen
Semua operasi Datastore dalam suatu transaksi harus beroperasi pada entitas dalam grup entitas yang sama jika transaksi tersebut merupakan transaksi grup tunggal
Kami ingin User
dan LinkedAccount
baru berada di grup yang sama, jadi bagi saya sepertinya Datastore harus mendukung skenario ini. Ketakutan saya adalah bahwa maksud yang dimaksudkan adalah bahwa operasi pada entitas yang ada dalam grup yang sama dapat dilakukan dalam satu transaksi.
tx, err := datastore.NewTransaction(ctx)
if err != nil {
return err
}
incompleteUserKey := datastore.NewIncompleteKey(ctx, "User", nil)
pendingKey, err := tx.Put(incompleteUserKey, user)
if err != nil {
return err
}
incompleteLinkedAccountKey := datastore.NewIncompleteKey(ctx, "GithubAccount", incompleteUserKey)
// also tried PendingKey as parent, but its a separate struct type
_, err = tx.Put(incompleteLinkedAccountKey, linkedAccount)
if err != nil {
return err
}
// attempt to commit
if _, err := tx.Commit(); err != nil {
return err
}
return nil
Dari sumber perpustakaan sudah jelas mengapa ini tidak berhasil. PendingKey
bukan kunci dan kunci yang tidak lengkap tidak dapat digunakan sebagai induk.
Apakah ini merupakan batasan yang diperlukan untuk Datastore atau perpustakaan? Bagi mereka yang berpengalaman dengan persyaratan seperti ini, apakah Anda baru saja mengorbankan konsistensi yang kuat dan menjadikan kedua jenis persyaratan tersebut bersifat global?
Untuk kemampuan Google:
- penyimpanan data: kunci tidak valid
- datastore: tidak dapat menggunakan pendingKey sebagai tipe *"google.golang.org/cloud/datastore".Key