Pasti menyimpan alamat IP sebagai angka, jika Anda tidak keberatan dengan sedikit kerja ekstra yang diperlukan, terutama jika Anda perlu melakukan kueri pada alamat dan Anda memiliki tabel/koleksi yang besar.
Inilah alasannya:
Penyimpanan
- Alamat IPv4 adalah 4 byte jika disimpan sebagai bilangan bulat yang tidak ditandatangani.
- Alamat IPv4 bervariasi antara 10 byte dan 18 byte saat ditulis sebagai string dalam bentuk oktet bertitik. (Mari kita asumsikan rata-ratanya adalah 14 byte.)
Itu adalah 7-15 byte untuk karakter, ditambah 2-3 byte jika Anda menggunakan tipe string panjang variabel, yang bervariasi berdasarkan database yang Anda gunakan. Jika Anda memiliki representasi string panjang tetap yang tersedia, maka Anda harus menggunakan bidang lebar tetap 15 karakter.
Penyimpanan disk murah, jadi itu bukan faktor dalam sebagian besar kasus penggunaan. Memori, bagaimanapun, tidak semurah, dan jika Anda memiliki tabel/koleksi besar dan Anda ingin melakukan kueri cepat, maka Anda memerlukan file index. Penalti penyimpanan 2-3x dari pengkodean string secara drastis mengurangi jumlah catatan yang dapat Anda indeks sambil tetap menyimpan indeks tetap di memori.
- Alamat IPv6 adalah 16 byte jika disimpan sebagai bilangan bulat yang tidak ditandatangani. (Kemungkinan sebagai beberapa bilangan bulat 4 atau 8 byte, bergantung pada platform Anda.)
- Alamat IPv6 berkisar dari 6 byte hingga 42 byte saat dikodekan sebagai string dalam notasi hex yang disingkat.
Di ujung bawah, alamat belakang loop (::1) adalah 3 byte ditambah overhead string panjang variabel. Di kelas atas, alamat seperti 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2
menggunakan 39 byte ditambah overhead string panjang variabel.
Berbeda dengan IPv4, tidak aman untuk mengasumsikan panjang string IPv6 rata-rata akan menjadi rata-rata 6 dan 42, karena jumlah alamat dengan jumlah nol berturut-turut yang signifikan adalah bagian yang sangat kecil dari keseluruhan ruang alamat IPv6. Hanya beberapa alamat khusus, seperti alamat loopback dan autoconf, yang mungkin dapat dikompresi dengan cara ini.
Sekali lagi, ini adalah penalti penyimpanan>2x untuk penyandian string versus penyandian bilangan bulat.
Matematika Jaringan
Apakah menurut Anda router menyimpan alamat IP sebagai string? Tentu saja tidak.
Jika Anda perlu menghitung jaringan pada alamat IP, representasi string akan merepotkan. Misalnya. jika Anda ingin menulis kueri yang mencari semua alamat pada subnet tertentu ("kembalikan semua catatan dengan alamat IP di 10.7.200.104/27", Anda dapat dengan mudah melakukannya dengan menutupi alamat integer dengan subnet mask integer. ( Mongo tidak mendukung kueri khusus ini, tetapi sebagian besar RDBMS mendukungnya.) Jika Anda menyimpan alamat sebagai string, maka kueri Anda perlu mengonversi setiap baris menjadi bilangan bulat, lalu menutupinya, yang beberapa kali lipat lebih lambat.(Bitwise masking untuk alamat IPv4 dapat dilakukan dalam beberapa siklus CPU menggunakan 2 register. Mengubah string menjadi integer memerlukan pengulangan string.)
Demikian pula, kueri rentang ("kembalikan semua rekaman semua rekaman antara 192.168.1.5 dan 192.168.50.100") dengan alamat bilangan bulat akan dapat menggunakan indeks, sedangkan kueri rentang pada alamat string tidak.
Intinya
Dibutuhkan sedikit lebih banyak pekerjaan, tetapi tidak banyak (ada sejuta fungsi aton() dan ntoa() di luar sana), tetapi jika Anda sedang membangun sesuatu yang serius dan solid dan Anda ingin membuktikannya di masa depan terhadap persyaratan dan kemungkinan kumpulan data besar, Anda harus menyimpan alamat IP sebagai bilangan bulat, bukan string.
Jika Anda melakukan sesuatu dengan cepat dan kotor serta tidak keberatan dengan kemungkinan renovasi di masa mendatang, gunakan string.
Untuk tujuan OP, jika Anda mengoptimalkan kecepatan dan ruang dan Anda tidak berpikir Anda ingin sering menanyakannya, lalu mengapa menggunakan database sama sekali? Cukup cetak alamat IP ke file. Itu akan lebih cepat dan lebih hemat penyimpanan daripada menyimpannya di database (dengan API terkait dan overhead penyimpanan).