MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Cara terbaik untuk merepresentasikan database multibahasa di mongodb

Anda dapat mendesain skema tempat Anda dapat mereferensikan atau menyematkan dokumen. Mari kita lihat opsi pertama dari dokumen yang disematkan. Dengan aplikasi Anda di atas, Anda dapat menyimpan informasi dalam dokumen sebagai berikut:

// db.table1 schema
{
    "_id": 3, // table1_id
    "is_active": true,
    "created": ISODate("2015-04-07T16:00:30.798Z"),
    "lang": [
        {
            "name": "foo",
            "surname": "bar",
            "address": "xxx"
        },
        {
            "name": "abc",
            "surname": "def",
            "address": "xyz"
        }
    ]
}

Dalam contoh skema di atas, pada dasarnya Anda akan menyematkan table1_lang informasi dalam table1 utama dokumen. Desain ini memiliki kelebihan, salah satunya adalah lokalitas data. Karena MongoDB menyimpan data secara berurutan pada disk, meletakkan semua data yang Anda butuhkan dalam satu dokumen memastikan bahwa disk yang berputar akan membutuhkan lebih sedikit waktu untuk mencari lokasi tertentu pada disk. Jika aplikasi Anda sering mengakses table1 informasi bersama dengan table1_lang data maka Anda hampir pasti ingin pergi ke rute yang disematkan. Keuntungan lain dengan dokumen yang disematkan adalah atomisitas dan isolasi dalam menulis data. Untuk mengilustrasikan ini, katakanlah Anda ingin menghapus dokumen yang memiliki kunci lang "nama" dengan nilai "foo", ini dapat dilakukan dengan satu operasi (atomik):

db.table.remove({"lang.name": "foo"});

Untuk detail lebih lanjut tentang pemodelan data di MongoDB, silakan baca dokumen Pengenalan Pemodelan Data , khususnya Model Hubungan Satu-ke-Banyak dengan Dokumen Tersemat

Opsi desain lainnya adalah referensi dokumen tempat Anda mengikuti skema yang dinormalisasi. Misalnya:

// db.table1 schema
{
    "_id": 3
    "is_active": true
    "created": ISODate("2015-04-07T16:00:30.798Z")
}

// db.table1_lang schema
/*
1
*/
{
    "_id": 1,    
    "table1_id": 3,
    "name": "foo",
    "surname": "bar",
    "address": "xxx"
}
/*
2
*/
{
    "_id": 2,    
    "table1_id": 3,
    "name": "abc",
    "surname": "def",
    "address": "xyz"
}

Pendekatan di atas memberikan peningkatan fleksibilitas dalam melakukan kueri. Misalnya, untuk mengambil semua anak table1_lang dokumen untuk entitas induk utama table1 dengan id 3 akan mudah, cukup buat kueri terhadap koleksi table1_lang :

db.table1_lang.find({"table1_id": 3});

Skema normalisasi di atas menggunakan pendekatan referensi dokumen juga memiliki keuntungan ketika Anda memiliki hubungan satu-ke-banyak dengan arity yang sangat tidak terduga. Jika Anda memiliki ratusan atau ribuan table_lang dokumen per pemberian table entitas, embedding memiliki begitu banyak kemunduran sejauh menyangkut batasan spasial karena semakin besar dokumen, semakin banyak RAM yang digunakan dan dokumen MongoDB memiliki batas ukuran keras 16MB.

Aturan umumnya adalah jika pola kueri aplikasi Anda sudah dikenal dan data cenderung diakses hanya dengan satu cara, pendekatan tersemat akan berfungsi dengan baik. Jika aplikasi Anda menanyakan data dalam banyak cara atau Anda tidak dapat mengantisipasi pola kueri data, model referensi dokumen yang lebih dinormalisasi akan sesuai untuk kasus tersebut.

Referensi:

Pola Desain Terapan MongoDB:Kasus Penggunaan Praktis dengan Basis Data NoSQL Terkemuka Oleh Rick Copeland




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Koleksi Salinan Mongo dan Izin Pengguna

  2. Meteor mongodb $inc dengan pembaruan

  3. Cara menutup kursor di MongoKit

  4. $fitler array bersarang menggunakan $lte $gte

  5. Panggil ke metode yang tidak ditentukan MongoDB\Driver\ReadConcern::isDefault()