Pertanyaan ini adalah tentang masalah yang agak lebih rumit daripada yang telah dibahas dalam pertanyaan-pertanyaan lama ini, yang semuanya merupakan duplikat satu sama lain:
Saran untuk struktur database untuk multilanguage (2011 Jun)
Apa struktur basis data terbaik untuk menyimpan data multibahasa? (2010 Feb)
Apa praktik terbaik untuk desain basis data multi-bahasa? (2009 Mei)
Skema untuk basis data multi bahasa (2008 November)
Skema basis data yang paling populer untuk mendukung antarmuka pengguna multibahasa tampaknya memiliki semua teks yang diterjemahkan dari semua bahasa dalam satu tabel dengan 3 kolom: id teks, kode bahasa, dan teks itu sendiri. Id teks dan kode bahasa bersama-sama membentuk kunci utama.
Semuanya baik-baik saja, tetapi sekarang pertimbangkan komplikasi: anggaplah bahwa teks-teks tersebut perlu dicari. Misalkan, misalnya, ini adalah e-shop multi-bahasa. Ini berarti bahwa untuk setiap kategori produk yang dimasukkan ke dalam basis data, pemilik toko akan memasukkan nama kategori produk di setiap bahasa N yang didukung, dan kemudian pembelanja akan dapat mencari kategori produk dengan nama, dalam bahasa mereka sendiri .
Ada masalah: Collation .
Bahasa yang berbeda memiliki urutan susunan yang berbeda, dan urutan susunan yang berfungsi untuk satu bahasa tidak berfungsi untuk yang lain. Jadi jika semua teks dari semua bahasa berada pada satu kolom, urutan kolasi apa yang akan mereka miliki? Bagaimana kita akan meminta database untuk menemukan id teks dari teks tertentu? Sementara dalam sebuah produk web, akurasi dan kinerja pencarian mungkin tidak terlalu penting, untuk keperluan diskusi ini, mari kita asumsikan bahwa itu benar-benar penting.
Sebagian besar administrator basis data akrab dengan konsep collation dalam arti "collation of the database". Untungnya, itu hanya susunan standar, yang digunakan jika tidak ada informasi susunan lainnya, tetapi ada tempat lain juga, tempat susunan dapat ditentukan:
Perintah SQL CREATE INDEX mendukung spesifikasi pemeriksaan. (Meskipun rumor mengatakan bahwa Microsoft SQL Server tidak mendukungnya; apakah ada yang tahu tentang itu?)
Pernyataan SQL SELECT juga mendukung collation, tetapi dalam hal ini spesifikasi collation berfungsi sebagai fungsi, yang menyebabkan pemindaian indeks alih-alih pencarian indeks, sesuatu yang mungkin tidak diizinkan jika kita menginginkan kinerja. (Kemudian lagi, jika itu yang terbaik yang bisa kita miliki, itu mungkin lebih baik daripada tidak sama sekali.)
Saya juga mendengar bahwa di Microsoft SQL Server Anda dapat memiliki kolom yang tidak bertahan, dihitung di mana Anda dapat menentukan susunan dan membuat indeks yang difilter, meskipun saya belum pernah mendengar ini sebelumnya, dan jika itu hanya Microsoft-SQL-Server-saja fitur, maka saya lebih suka menahan diri dari menggunakannya, tidak peduli seberapa keren dan dipikirkan dengan baik itu.
Jadi, mengingat semua itu, bagaimana kita menyusun basis data kita, dan bagaimana kita melakukan pertanyaan kita, jika tujuannya adalah basis data multibahasa yang dapat diperbarui dan dicari?
Pertanyaan ini terinspirasi oleh sebuah diskusi yang terjadi di sini: bagaimana nvarchar (max) akan menyimpan data dalam database akan lebih cepat jika beberapa data kurang dari 4000 karakter?