Chắc chắn lưu địa chỉ IP dưới dạng số, nếu bạn không bận tâm đến việc tốn thêm công sức, đặc biệt nếu bạn cần thực hiện truy vấn trên địa chỉ và bạn có các bảng / bộ sưu tập lớn.
Đây là lý do tại sao:
Bộ nhớ
- Địa chỉ IPv4 là 4 byte nếu được lưu trữ dưới dạng số nguyên không dấu.
- Địa chỉ IPv4 thay đổi trong khoảng từ 10 byte đến 18 byte khi được viết ra dưới dạng chuỗi ở dạng dấu chấm chấm. (Giả sử mức trung bình là 14 byte.)
Đó là 7-15 byte cho các ký tự, cộng thêm 2-3 byte nếu bạn đang sử dụng loại chuỗi có độ dài thay đổi, loại này thay đổi dựa trên cơ sở dữ liệu bạn đang sử dụng. Nếu bạn có sẵn biểu diễn chuỗi độ dài cố định, thì bạn phải sử dụng trường độ rộng cố định gồm 15 ký tự.
Ổ đĩa lưu trữ rẻ, vì vậy đó không phải là một yếu tố trong hầu hết các trường hợp sử dụng. Tuy nhiên, bộ nhớ không rẻ bằng và nếu bạn có một bảng / bộ sưu tập lớn và bạn muốn thực hiện các truy vấn nhanh, thì bạn cần một chỉ mục. Hình phạt lưu trữ 2-3 lần của mã hóa chuỗi làm giảm đáng kể số lượng bản ghi bạn có thể lập chỉ mục trong khi vẫn giữ chỉ mục thường trú trong bộ nhớ.
- Địa chỉ IPv6 là 16 byte nếu được lưu trữ dưới dạng số nguyên không dấu. (Có thể là nhiều số nguyên 4 hoặc 8 byte, tùy thuộc vào nền tảng của bạn.)
- Địa chỉ IPv6 nằm trong khoảng từ 6 byte đến 42 byte khi được mã hóa dưới dạng chuỗi trong ký hiệu hex viết tắt.
Ở phần cuối, địa chỉ quay lại của vòng lặp (::1) là 3 byte cộng với chi phí chuỗi có độ dài thay đổi. Trên cao cấp, một địa chỉ như 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2
sử dụng 39 byte cộng với chi phí chuỗi có độ dài thay đổi.
Không giống như với IPv4, sẽ không an toàn nếu giả sử độ dài chuỗi IPv6 trung bình sẽ là trung bình của 6 và 42, bởi vì số lượng địa chỉ có một số lượng đáng kể các số 0 liên tiếp là một phần rất nhỏ của không gian địa chỉ IPv6 tổng thể. Chỉ một số địa chỉ đặc biệt, như địa chỉ loopback và autoconf, có thể nén được theo cách này.
Một lần nữa, đây là hình phạt lưu trữ> 2x đối với mã hóa chuỗi so với mã hóa số nguyên.
Toán mạng
Bạn có nghĩ rằng bộ định tuyến lưu trữ địa chỉ IP dưới dạng chuỗi không? Tất nhiên là họ không.
Nếu bạn cần thực hiện phép toán mạng trên địa chỉ IP, việc biểu diễn chuỗi là một sự phức tạp. Ví dụ. nếu bạn muốn viết một truy vấn tìm kiếm tất cả các địa chỉ trên một mạng con cụ thể ("trả về tất cả các bản ghi có địa chỉ IP trong 10.7.200.104/27", bạn có thể dễ dàng thực hiện việc này bằng cách che một địa chỉ số nguyên bằng một mặt nạ mạng con số nguyên. ( Mongo không hỗ trợ truy vấn cụ thể này, nhưng hầu hết các RDBMS đều có.) Nếu bạn lưu trữ địa chỉ dưới dạng chuỗi, thì truy vấn của bạn sẽ cần chuyển đổi từng hàng thành số nguyên, sau đó che dấu nó, chậm hơn một số thứ tự cường độ. (Mặt nạ bit đối với địa chỉ IPv4 có thể được thực hiện trong một vài chu kỳ CPU bằng cách sử dụng 2 thanh ghi. Việc chuyển đổi một chuỗi thành một số nguyên yêu cầu lặp qua chuỗi.)
Tương tự, các truy vấn phạm vi ("trả về tất cả các bản ghi tất cả các bản ghi từ 192.168.1.50 đến 192.168.50.100") với địa chỉ số nguyên sẽ có thể sử dụng chỉ mục, trong khi truy vấn phạm vi trên địa chỉ chuỗi sẽ không.
Điểm mấu chốt
Sẽ cần nhiều công việc hơn một chút, nhưng không nhiều (có một triệu hàm aton () và ntoa () ở đó), nhưng nếu bạn đang xây dựng một thứ gì đó nghiêm túc và vững chắc và bạn muốn chứng minh nó trong tương lai trước các yêu cầu trong tương lai và khả năng có một tập dữ liệu lớn, bạn nên lưu trữ địa chỉ IP dưới dạng số nguyên, không phải chuỗi.
Nếu bạn đang làm việc gì đó nhanh chóng và bẩn thỉu và không ngại khả năng phải tu sửa lại trong tương lai, thì hãy sử dụng chuỗi ký tự.
Đối với mục đích của OP, nếu bạn đang tối ưu hóa tốc độ và không gian và bạn không nghĩ rằng bạn muốn truy vấn nó thường xuyên, vậy tại sao lại sử dụng cơ sở dữ liệu? Chỉ cần in địa chỉ IP vào một tệp. Điều đó sẽ nhanh hơn và lưu trữ hiệu quả hơn so với lưu trữ trong cơ sở dữ liệu (với API được liên kết và chi phí lưu trữ).