Tôi sẽ tạo ra một bảng với hai lĩnh vực - ID
như BIGINT
và IPAddress
là một trong hai varchar(45)
hoặc varbinary(16)
. Ý tưởng là lưu trữ tất cả các địa chỉ IP duy nhất và sử dụng tham chiếu ID
thay vì thực tế IP address
trong các bảng khác.
Nói chung, tôi sẽ tạo một thủ tục được lưu trữ đang trả về đã ID
cho IP address
hoặc (nếu không tìm thấy địa chỉ) chèn địa chỉ và trả lại địa chỉ đã tạo ID
.
Tôi hy vọng sẽ có nhiều hồ sơ (tôi không thể biết chính xác có bao nhiêu), nhưng tôi cần thủ tục được lưu trữ ở trên để được thực thi nhanh nhất có thể. Vì vậy, tôi tự hỏi làm thế nào để lưu trữ địa chỉ IP thực tế - ở định dạng văn bản hoặc byte. Cái nào sẽ tốt hơn?
Tôi đã viết các SQL CLR
hàm để chuyển đổi byte địa chỉ IP thành chuỗi và ngược lại, vì vậy chuyển đổi không phải là vấn đề (làm việc với cả hai IPv4
và IPv6
).
Tôi đoán tôi cần tạo một chỉ mục để tối ưu hóa tìm kiếm, nhưng tôi không chắc mình nên đưa IP address
trường vào chỉ mục được nhóm hay để tạo một chỉ mục riêng và loại tìm kiếm nào sẽ nhanh hơn?
IPv4
tôi đoán tôi sẽ chuyển đổi địa chỉ thành INT
và sử dụng trường làm khóa chỉ mục. Nhưng đối với IPv6
tôi cần sử dụng hai BIGINT
trường và tôi thích lưu trữ giá trị trong một trường - đối với tôi tự nhiên hơn.