Bagaimana cara berpikir di toko data dan bukannya di database?

183

Sebagai contoh, Google App Engine menggunakan Google Datastore, bukan database standar, untuk menyimpan data. Adakah yang punya kiat untuk menggunakan Google Datastore alih-alih database? Sepertinya saya sudah melatih pikiran saya untuk berpikir 100% dalam hubungan objek yang memetakan langsung ke struktur tabel, dan sekarang sulit untuk melihat sesuatu yang berbeda. Saya dapat memahami beberapa manfaat dari Google Datastore (mis. Kinerja dan kemampuan untuk mendistribusikan data), tetapi beberapa fungsionalitas basis data yang baik dikorbankan (misalnya bergabung).

Apakah ada orang yang telah bekerja dengan Google Datastore atau BigTable memiliki saran bagus untuk bekerja bersama mereka?

Jim
sumber
DataSource adalah api lama yang kami hapus secara bertahap - itu sangat terkait dengan model koneksi database. DataStore adalah api tingkat rendah yang memungkinkan akses ke pendekatan berbasis streaming "mentah" ke konten GIS, menggunakan FeatureReaders dan FeatureWriter.
murali
Sekarang Google Cloud SQL menyediakan dukungan basis data relasional untuk Google App Engine. Jika Anda masih mencari solusi untuk penyimpanan data, Anda dapat menggunakan Google Cloud SQL .
Chandana
Anda mungkin ingin memeriksa API Mungo Datastore: bit.ly/13eSDpr
quark

Jawaban:

149

Ada dua hal utama yang harus dilakukan tentang datastore App Engine jika dibandingkan dengan database relasional 'tradisional':

  • Datastore tidak membedakan antara sisipan dan pembaruan. Ketika Anda memanggil put () pada suatu entitas, entitas itu akan disimpan ke datastore dengan kunci uniknya, dan apa pun yang memiliki kunci itu akan ditimpa. Pada dasarnya, setiap jenis entitas dalam datastore bertindak seperti peta besar atau daftar yang diurutkan.
  • Querying, seperti yang Anda singgung, jauh lebih terbatas. Tidak ada yang bergabung, untuk memulai.

Hal utama yang harus disadari - dan alasan di balik kedua perbedaan ini - adalah bahwa Bigtable pada dasarnya bertindak seperti kamus yang sangat teratur. Dengan demikian, operasi put hanya menetapkan nilai untuk kunci yang diberikan - terlepas dari nilai sebelumnya untuk kunci itu, dan operasi pengambilan terbatas untuk mengambil kunci tunggal atau rentang kunci yang berdekatan. Kueri yang lebih canggih dimungkinkan dengan indeks, yang pada dasarnya hanya tabel sendiri, memungkinkan Anda untuk menerapkan kueri yang lebih kompleks sebagai pemindaian pada rentang yang berdekatan.

Setelah Anda menyerapnya, Anda memiliki pengetahuan dasar yang diperlukan untuk memahami kemampuan dan keterbatasan datastore. Pembatasan yang mungkin tampak sewenang-wenang mungkin lebih masuk akal.

Kuncinya di sini adalah bahwa meskipun ini adalah pembatasan atas apa yang dapat Anda lakukan dalam basis data relasional, pembatasan yang sama inilah yang membuatnya praktis untuk meningkatkan skala yang dirancang untuk ditangani oleh Bigtable. Anda tidak bisa mengeksekusi semacam query yang terlihat bagus di atas kertas tetapi sangat lambat dalam database SQL.

Dalam hal bagaimana mengubah cara Anda merepresentasikan data, hal yang paling penting adalah perhitungan awal. Alih-alih melakukan penggabungan pada waktu kueri, prakalkulasi data dan simpan di datastore sedapat mungkin. Jika Anda ingin memilih catatan acak, buat angka acak dan simpan dengan setiap catatan. Ada banyak buku resep dan kiat semacam ini di sini. Sunting: Buku masak tidak ada lagi.

Nick Johnson
sumber
4
Kabar baiknya, internet belum melupakan buku masak, yaitu arsip internet belum lupa. Hantu situs masih ada di sini: web.archive.org/web/20090416113704/http://…
EasilyBaffled
42

Cara saya telah beralih pikiran adalah untuk melupakan database sama sekali.

Dalam dunia db relasional Anda selalu harus khawatir tentang normalisasi data dan struktur tabel Anda. Parit semuanya. Cukup tata letak halaman web Anda. Letakkan semuanya. Sekarang lihat mereka. Anda sudah 2/3 di sana.

Jika Anda lupa gagasan bahwa ukuran basis data penting dan data tidak boleh diduplikasi maka Anda 3/4 di sana dan Anda bahkan tidak perlu menulis kode apa pun! Biarkan pandangan Anda menentukan Model Anda. Anda tidak harus mengambil objek dan membuatnya menjadi 2 dimensi lagi seperti di dunia relasional. Anda dapat menyimpan objek dengan bentuk sekarang.

Ya, ini adalah penjelasan sederhana tentang cobaan itu, tetapi ini membantu saya melupakan database dan hanya membuat aplikasi. Saya telah membuat 4 aplikasi App Engine sejauh ini menggunakan filosofi ini dan masih banyak lagi yang akan datang.

pengguna19087
sumber
2
Saya suka "Biarkan pandangan Anda menentukan Model Anda." sedikit. Saya pikir itu adalah hang-up yang datang dari RDBMS, tetapi itu menyederhanakan semuanya.
cbednarski
23

Saya selalu tertawa ketika orang keluar dengan - itu tidak berhubungan. Saya sudah menulis cellectr di Django dan ini adalah potongan dari model saya di bawah ini. Seperti yang akan Anda lihat, saya memiliki liga yang dikelola atau dilatih oleh pengguna. Saya bisa dari liga mendapatkan semua manajer, atau dari pengguna yang diberikan saya bisa mengembalikan liga yang dia latih atau manajer.

Hanya karena tidak ada dukungan kunci asing spesifik tidak berarti Anda tidak dapat memiliki model database dengan hubungan.

Dua pence saya.


class League(BaseModel):
    name = db.StringProperty()    
    managers = db.ListProperty(db.Key) #all the users who can view/edit this league
    coaches = db.ListProperty(db.Key) #all the users who are able to view this league

    def get_managers(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.managers)

    def get_coaches(self):
        # This returns the models themselves, not just the keys that are stored in teams
        return UserPrefs.get(self.coaches)      

    def __str__(self):
        return self.name

    # Need to delete all the associated games, teams and players
    def delete(self):
        for player in self.leagues_players:
            player.delete()
        for game in self.leagues_games:
            game.delete()
        for team in self.leagues_teams:
            team.delete()            
        super(League, self).delete()

class UserPrefs(db.Model):
    user = db.UserProperty()
    league_ref = db.ReferenceProperty(reference_class=League,
                            collection_name='users') #league the users are managing

    def __str__(self):
        return self.user.nickname

    # many-to-many relationship, a user can coach many leagues, a league can be
    # coached by many users
    @property
    def managing(self):
        return League.gql('WHERE managers = :1', self.key())

    @property
    def coaching(self):
        return League.gql('WHERE coaches = :1', self.key())

    # remove all references to me when I'm deleted
    def delete(self):
        for manager in self.managing:
            manager.managers.remove(self.key())
            manager.put()
        for coach in self.managing:
            coach.coaches.remove(self.key())
            coaches.put()            
        super(UserPrefs, self).delete()    
Phil Stollery
sumber
12

Saya datang dari dunia Database Relasional lalu saya menemukan hal Datastore ini. butuh beberapa hari untuk menguasainya. nah ada beberapa temuan saya.

Anda pasti sudah tahu bahwa Datastore dibangun untuk skala dan itu adalah hal yang memisahkannya dari RDMBS. untuk skala yang lebih baik dengan dataset besar, App Engine telah melakukan beberapa perubahan (beberapa berarti banyak perubahan).

RDBMS VS
Struktur DataStore
Dalam database, kami biasanya menyusun data kami dalam Tabel, Baris yang di Datastore itu menjadi Jenis dan Entitas .

Hubungan
Dalam RDBMS, Sebagian besar orang mengikuti hubungan Satu-ke-Satu, Banyak-ke-Satu, Banyak-ke-Banyak, Di Datastore, Karena memiliki hal "Tidak Bergabung" tetapi masih dapat mencapai normalisasi dengan menggunakan " ReferenceProperty "Misalnya Contoh Hubungan Satu-ke-Satu .

Indeks
Biasanya di RDMBS kami membuat indeks seperti Primary Key, Foreign Key, Unique Key dan Index key untuk mempercepat pencarian dan meningkatkan kinerja basis data kami. Di datastore, Anda harus membuat setidaknya satu indeks per jenis (secara otomatis akan menghasilkan apakah Anda suka atau tidak) karena datastore mencari entitas Anda berdasarkan indeks ini dan percayalah itu adalah bagian terbaik, Di RDBMS Anda dapat mencari menggunakan bidang non-indeks meskipun akan memakan waktu tetapi akan. Di Datastore Anda tidak dapat mencari menggunakan properti non-indeks.

Hitung
Dalam RDMBS, jauh lebih mudah untuk menghitung (*) tetapi dalam datastore, Tolong jangan berpikir dengan cara normal (Ya ada fungsi hitung) karena memiliki 1000 Batas dan akan dikenakan biaya sebanyak operasi kecil sebagai entitas yang tidak bagus tapi kami selalu punya pilihan bagus, kami bisa menggunakan Shard Counters .

Kendala Unik
Di RDMBS, Kami menyukai fitur ini, kan? tetapi Datastore memiliki caranya sendiri. Anda tidak dapat mendefinisikan properti sebagai unik :(.

Permintaan
GAE Datatore menyediakan fitur yang lebih baik, banyak LIKE (Oh tidak! Datastore tidak memiliki kata kunci LIKE) SQL yang merupakan GQL .

Sisipan Data / Perbarui / Hapus / Pilih
Ini di mana kita semua tertarik, seperti dalam RDMBS kita memerlukan satu permintaan untuk Sisipkan, Perbarui, Hapus dan Pilih seperti RDBMS, Datastore telah meletakkan, menghapus, mendapatkan (jangan terlalu bersemangat) karena Datastore masukkan atau dapatkan dalam bentuk Tulis, Baca, Operasi Kecil ( Biaya Baca untuk Panggilan Datastore ) dan di situlah Pemodelan Data mulai berlaku. Anda harus meminimalkan operasi ini dan menjalankan aplikasi Anda. Untuk Mengurangi Operasi Baca Anda dapat menggunakan Memcache .

sanjay kushwah
sumber
6

Lihatlah dokumentasi Objectify. Komentar pertama di bagian bawah halaman mengatakan:

"Bagus, walaupun kamu menulis ini untuk menggambarkan Objectify, itu juga salah satu penjelasan paling ringkas tentang databore appengine sendiri yang pernah kubaca. Terima kasih."

https://github.com/objectify/objectify/wiki/Concepts

Jon Stevens
sumber
3

Jika Anda terbiasa memikirkan entitas yang dipetakan ORM, maka pada dasarnya itulah cara kerja datastore berbasis entitas seperti Google App Engine. Untuk sesuatu seperti gabungan, Anda dapat melihat properti referensi . Anda tidak benar-benar perlu khawatir tentang apakah itu menggunakan BigTable untuk backend atau sesuatu yang lain karena backend diabstraksikan oleh antarmuka GQL dan Datastore API.

Mark Cidade
sumber
1
Salah satu masalah dengan properti referensi adalah bahwa mereka dapat dengan cepat membuat masalah kueri 1 + N. (Tarik 1 kueri untuk menemukan 100 orang, lalu buat kueri lain untuk masing-masing dari mereka untuk mendapatkan orang. Alamat.)
0124816
Tautan ke 'properti referensi' terputus, mungkin dengan penambahan dukungan Java. Coba: code.google.com/appengine/docs/python/datastore/…
Spike0xff
tautan diperbaiki. Anda bebas mengedit jawaban apa pun jika / ketika Anda memiliki cukup perwakilan.
Mark Cidade
0

Cara saya melihat datastore adalah, jenis mengidentifikasi tabel, per se, dan entitas adalah baris individual dalam tabel. Jika Google mengambil jenis dari hanya satu meja besar tanpa struktur dan Anda dapat membuang apa pun yang Anda inginkan dalam suatu entitas. Dengan kata lain, jika entitas tidak terikat pada jenis yang cukup banyak Anda dapat memiliki struktur apa pun untuk entitas dan menyimpannya di satu lokasi (jenis file besar tanpa struktur untuk itu, setiap baris memiliki struktur sendiri).

Sekarang kembali ke komentar asli, google datastore dan bigtable adalah dua hal yang berbeda jadi jangan bingung google datastore dengan datastore sense penyimpanan data. Bigtable lebih mahal daripada bigquery (Alasan utama kami tidak melakukannya). Bigquery memang memiliki gabungan yang tepat dan RDBMS seperti bahasa sql dan lebih murah, mengapa tidak menggunakan bigquery. Yang sedang berkata, bigquery memang memiliki beberapa keterbatasan, tergantung pada ukuran data Anda, Anda mungkin atau mungkin tidak menemukannya.

Juga, dalam hal berpikir dalam hal datastore, saya pikir pernyataan yang tepat akan "berpikir dalam hal database NoSQL". Ada terlalu banyak dari mereka yang tersedia di luar sana hari ini tetapi ketika datang ke produk google kecuali google cloud SQL (yang merupakan mySQL) yang lainnya adalah NoSQL.

ringadingding
sumber
-6

Berakar di dunia basis data, menyimpan data bagi saya akan menjadi tabel raksasa (karenanya nama "bigtable"). BigTable adalah contoh yang buruk karena ia melakukan banyak hal yang mungkin tidak dilakukan oleh database biasa, namun itu masih merupakan database. Kemungkinannya kecuali Anda tahu Anda perlu membuat sesuatu seperti "bigtable" Google, Anda mungkin akan baik-baik saja dengan database standar. Mereka membutuhkan itu karena mereka menangani jumlah data dan sistem yang gila secara bersamaan, dan tidak ada sistem yang tersedia secara komersial yang dapat melakukan pekerjaan dengan cara yang tepat seperti yang mereka dapat menunjukkan bahwa mereka membutuhkan pekerjaan yang harus dilakukan.

(referensi bigtable: http://en.wikipedia.org/wiki/BigTable )

devinmoore
sumber
Pertanyaan ini berkaitan secara khusus dengan Google App Engine, yang menggunakan Bigtable; menggunakan database relasional bukanlah suatu opsi.
Nick Johnson