Yang ingin saya lakukan adalah memiliki sejumlah tabel yang mewakili data mentah, jadi dalam hal ini Anda akan melakukannya
Items (ID pk, Name, <properties>)
Tags (ID pk, Name)
TagItems (TagID fk, ItemID fk)
Ini berfungsi cepat untuk waktu penulisan, dan menjaga semuanya tetap normal, tetapi Anda juga dapat mencatat bahwa untuk setiap tag, Anda harus bergabung dengan tabel dua kali untuk setiap tag lebih lanjut yang ingin Anda AND, jadi itu lambat dibaca.
Solusi untuk meningkatkan membaca adalah dengan membuat tabel caching pada perintah dengan mengatur prosedur tersimpan yang pada dasarnya membuat tabel baru yang mewakili data dalam format yang diratakan ...
CachedTagItems(ID, Name, <properties>, tag1, tag2, ... tagN)
Kemudian Anda dapat mempertimbangkan seberapa sering tabel Item Tagged harus tetap up to date, jika ada di setiap sisipan, lalu panggil prosedur tersimpan dalam peristiwa penyisipan kursor. Jika ini adalah tugas per jam, maka siapkan pekerjaan per jam untuk menjalankannya.
Sekarang untuk benar-benar pintar dalam pengambilan data, Anda harus membuat prosedur tersimpan untuk mendapatkan data dari tag. Daripada menggunakan kueri bersarang dalam pernyataan kasus besar-besaran, Anda ingin meneruskan satu parameter tunggal yang berisi daftar tag yang ingin Anda pilih dari database, dan mengembalikan kumpulan catatan Item. Ini akan menjadi yang terbaik dalam format biner, menggunakan operator bitwise.
Dalam format biner, mudah dijelaskan. Katakanlah ada empat tag untuk ditugaskan ke suatu item, dalam biner kita bisa menyatakan itu
0000
Jika keempat tag ditugaskan ke objek, objek akan terlihat seperti ini ...
1111
Jika hanya dua yang pertama ...
1100
Maka itu hanya kasus menemukan nilai-nilai biner dengan 1s dan nol di kolom yang Anda inginkan. Menggunakan operator Bitwise SQL Server, Anda dapat memeriksa bahwa ada 1 di kolom pertama menggunakan kueri yang sangat sederhana.
Periksa tautan ini untuk mencari tahu lebih lanjut .