Belum lama ini saya berbicara dengan kolega saya dan dia jelas-jelas menentang penggunaan topeng bit karena sulit untuk memahami semua nilai yang disimpan dalam database. Menurut pendapat saya tidak selalu ide buruk untuk menggunakannya, misalnya untuk menentukan peran pengguna saat ini. Kalau tidak, Anda perlu menyimpannya di tabel terpisah, yang akan menyebabkan satu lagi BERGABUNG. Bisakah Anda memberi tahu saya jika saya salah? Adakah efek samping lain, keuntungan / kerugian dari penggunaan bit mask?
database
patterns-and-practices
bit
advantages
Alex Ovechkin
sumber
sumber
Jawaban:
Saya bekerja dengan aplikasi yang menggunakan bitmasks untuk menyimpan tugas peran pengguna. Rasa sakit di pantat. Jika ini membuat saya bias, bersalah seperti yang dituduhkan.
Jika Anda sudah menggunakan basis data relasional, ini merupakan anti-pola yang melanggar sebagian besar teori relasional dan semua aturan normalisasi. Ketika Anda membangun penyimpanan data Anda sendiri, itu mungkin bukan ide yang buruk.
Ada yang namanya terlalu banyak tabel yang bergabung, tetapi database relasional dibangun untuk menangani hal ini. Banyak yang memiliki fitur tambahan jika kinerja menjadi masalah: indeks, tampilan yang diindeks, dll. Bahkan jika nilai yang Anda cari tidak terlalu sering berubah, yang merupakan keuntungan bagi Bitmask, kelebihan dari keharusan mengelola pengindeksan adalah cukup mudah di database.
Meskipun database melakukan pekerjaan yang baik dalam mengumpulkan data, mereka bisa menjadi lamban ketika Anda mulai memperkenalkan hal-hal seperti rumus kompleks atau Fungsi Skalar ke dalam kumpulan data. Anda dapat melakukan bitwise di aplikasi Anda, tetapi jika semua yang Anda lakukan adalah mendapatkan data terkait (mencari peran pengguna), Anda tidak mengambil keuntungan dari apa yang dilakukan penyimpanan data Anda yang terbaik.
Argumen terakhir saya yang menentangnya adalah kesederhanaan untuk pengembang lain. Anda memiliki pengguna, peran, dan tugas. Ini set hubungan banyak-ke-banyak (karena ada lebih dari satu hubungan) yang sangat umum, itu harus mudah dikelola. Itu hanya hal-hal CRUD.
sumber
where some_bit_mask & 12 > 0
tanpa pemindaian baris-demi-baris.user_role_map
atauuser_priv_map
meja akan cukup.Anda telah menyebutkan pro dan kontra yang relevan:
Memutuskan apa yang harus dilakukan memerlukan lebih banyak info:
Jadi yang harus Anda lakukan adalah mengumpulkan faktor-faktor risiko dan kemudian menimbangnya , untuk melihat apakah pro lebih besar daripada kontra.
sumber
Jika Anda benar-benar, benar-benar , benar-benar kekurangan ruang disk, maka Anda mungkin mempertimbangkan bitmap untuk hak akses pengguna. Jika kinerja adalah kekhawatiran Anda, lupakan saja semuanya, karena memisahkannya sebenarnya akan lebih lambat. Anda tidak dapat mengindeks bidang yang dipetakan secara bermakna, menghasilkan pemindaian tabel basis data, yang [hampir] selalu menjadi pembunuh kinerja.
Kecuali Anda Amazon atau Netflix, jumlah data yang terlibat dalam izin pengguna akan diabaikan dibandingkan dengan semua yang Anda pegang.
Setiap DBMS yang serius dapat menangani "gabung ekstra" itu tanpa berkedip.
sumber
Kembali ketika penyimpanan mahal, anugerah dengan topeng bit adalah mereka menghemat ruang. Pada hari-hari data besar, ini bukan masalah dulu.
Mengambil contoh yang Anda kutip - memiliki peran disimpan sebagai bit mask akan menjadi semacam bau kode dari sudut pandang desain database karena akan melanggar bentuk normal pertama . Dalam hal ini, mereka anti-pola.
Semua ini dikatakan, tidak harus satu atau yang lain. Anda bisa menyimpan data sebagai bit mask dan kemudian memiliki tampilan yang dapat menarik peran pengguna dengan cepat. Anda juga akan mendapat manfaat dengan melihat sekilas pengguna mana yang memiliki peran yang sama.
sumber
Satu-satunya keuntungan menggunakan bitmask adalah jika arti bit fields tidak statis. Tabel relasional hanya berfungsi dengan baik jika Anda tahu sebelumnya apa setiap bidang pada catatan: Anda harus mengidentifikasi bidang dalam
CREATE TABLE
pernyataan DDL.Jika arti dari masing-masing bidang bit dapat dikonfigurasi saat runtime, atau sebaliknya tidak diketahui sebelumnya, maka mungkin masuk akal untuk menyimpan boolean sebagai bidang bit. Bahkan kemudian, adalah mungkin untuk menentukan meja dengan bidang sewenang-wenang:
field_1
,field_2
, dll ini memberi Anda lebih bersih desain relasional, meskipun masih tidak ideal. Apakah ini preferensial untuk bidang bit sebagian besar adalah masalah pendapat, karena tidak ada solusi yang ideal.Jika Anda tahu apa yang diwakili bit selama pengembangan, lalu buat bidang untuk setiap bit dan berikan nama yang bermakna .
Berhati-hatilah dengan efek platform bagian dalam . Jika Anda akhirnya mendefinisikan bidang yang acak tapi diketik dengan baik itu adalah satu hal, tetapi jika Anda melangkah terlalu jauh dari itu, Anda akan menemukan kembali basis data relasional ... di dalam basis data relasional.
sumber
Saya tidak setuju dengan bitmask. Saya menemukan sebagian besar pencela mereka tidak mengerti biner dan heksadesimal. Untuk kejelasan, gunakan mnemonik yang baik.
Keuntungan yang tidak disebutkan di atas adalah kemampuan untuk menambahkan makna baru ke topeng bit tanpa penambahan kolom yang berpotensi memakan waktu. Desainer db kami (yang mendahului saya) memilikinya di meja yang sekarang mendapat 5 juta catatan baru setiap hari. Menambahkan kolom baru untuk mewakili perilaku baru akan membutuhkan waktu yang lama, sementara mendefinisikan bit baru (kita telah mengkonsumsi 33 dari 64) tidak memerlukan tabel untuk dibangun kembali.
Tidak, topeng bit tidak dapat diindeks tetapi membangun 33 indeks akan menjadi konyol dan akan memperlambat penyisipan ke perayapan. Pencarian tabel menggunakan tanggal & catat indeks "pemilik", karenanya indeks pada topeng bit ini, jika mungkin, tidak akan pernah digunakan.
sumber
Jika tujuannya hanya untuk menghemat ruang disk, saya pikir itu ide yang buruk:
Namun ada beberapa kasus, yang bisa jusitfiy penggunaan bidang bit:
sumber