Saya telah belajar tentang bit string
tipe data belakangan ini, dan saya cukup ingin tahu tentang:
Di bagian bawah halaman dokumen ini ada kalimat:
... ditambah 5 atau 8 byte overhead tergantung pada panjang string
Bagaimana bit string ditangani dalam bahasa lain seperti PHP, Java, C #, C ++, dll., Melalui driver seperti Npgsql, ODBC, dll.
Untuk pertanyaan # 1, menggunakan smallint atau bigint akan jauh lebih efisien penyimpanan, dan mungkin akan menawarkan peningkatan kinerja karena bilangan bulat didukung di mana-mana. Sebagian besar bahasa pemrograman menangani operasi bit pada bilangan bulat dengan mudah. Jika itu masalahnya, apa gunanya memperkenalkan tipe data bit-string? Apakah ini Hanya untuk kasus yang membutuhkan sedikit topeng? Pengindeksan bidang bit mungkin? Saya lebih ingin tahu tentang bagaimana pengindeksan bidang bit dilakukan di PostgreSQL.
Untuk # 2, saya bingung, lebih dari sekadar ingin tahu. Sebagai contoh, bagaimana jika saya menyimpan topeng bit hari minggu di bidang bit (7), satu bit untuk sehari, dengan bit terendah mewakili hari Senin. Lalu saya meminta nilai dalam PHP dan C ++. Apa yang akan saya dapatkan? Dokumentasi mengatakan saya akan memiliki string bit, namun string bit bukanlah sesuatu yang dapat saya gunakan secara langsung - seperti halnya integer. Maka dalam hal ini, haruskah saya menyerah pada bidang bit?
Adakah yang bisa menjelaskan mengapa dan kapan saya harus menggunakan sedikit atau sedikit variasi?
sumber
Jawaban:
Jika Anda hanya memiliki beberapa variabel, saya akan mempertimbangkan untuk menjaga
boolean
kolom terpisah .NULL
nilai untuk bit individual jika Anda membutuhkannya. Anda selalu dapat menentukan kolomNOT NULL
jika tidak.Mengoptimalkan penyimpanan
Jika Anda memiliki lebih dari satu variabel penuh tangan tetapi kurang dari 33, sebuah
integer
kolom dapat memberikan yang terbaik bagi Anda. (Ataubigint
hingga 64 variabel.)=
operator).bit string
atauboolean
.Dengan lebih banyak variabel, atau jika Anda ingin memanipulasi nilai-nilai banyak, atau jika Anda tidak memiliki tabel besar dan ruang disk / RAM tidak ada masalah, atau jika Anda tidak yakin harus memilih apa, saya akan mempertimbangkan
bit(n)
ataubit varying(n)
.Contohnya
Untuk hanya 3 bit informasi, setiap
boolean
kolom bertahan dengan 3 byte,integer
kebutuhan 4 byte danbit string
6 byte (5 +1).Untuk 32 bit informasi, yang
integer
masih membutuhkan 4 byte,bit string
menempati 9 byte untuk yang sama (5 + 4) danboolean
kolom menempati 32 byte.Bacaan lebih lanjut
sumber
Semua tipe PostgreSQL berguna untuk beberapa hal dan kurang bermanfaat untuk yang lain. Secara umum, Anda mendapatkan lebih banyak dari mengkhawatirkan fungsionalitas terlebih dahulu dan kinerja nanti. PostgreSQL memiliki sejumlah besar fungsi untuk memanipulasi berbagai jenis tipe data dan ini tidak terkecuali.
Saya harapkan pada lapisan aplikasi, kecuali driver db Anda menanganinya melalui semacam konversi jenis, Anda akan mendapatkan representasi string dan harus menangani ini. Jadi mungkin bermanfaat atau tidak berguna dalam kapasitas itu.
Di mana itu mungkin berguna adalah ketika Anda ingin memilih catatan berdasarkan pada operasi bitwise, seperti bitwise atau atau bitwise dan, atau memanipulasi data dalam query SQL. Kecuali jika Anda melakukan ini, banyak fitur PostgreSQL yang lebih esoteris kurang membantu.
Perhatikan juga untuk string informasi biner yang lebih panjang ada antarmuka objek besar yang memungkinkan Anda melakukan streaming dll. Dan antarmuka bytea yang memungkinkan representasi string yang lebih ringkas.
tl; dr: Jika Anda membutuhkannya, Anda akan tahu itu. Kalau tidak, simpan file itu di bagian "khusus untuk penggunaan di masa mendatang" di pikiran Anda.
sumber