ฉันจะสร้างตารางที่มีสองช่อง - ID
เป็นBIGINT
และIPAddress
เป็นอย่างใดอย่างหนึ่งหรือvarchar(45)
varbinary(16)
แนวคิดคือการจัดเก็บที่อยู่ IP ที่ไม่ซ้ำกันทั้งหมดและใช้การอ้างอิงID
แทนจริงIP address
ในตารางอื่น ๆ
โดยทั่วไปฉันจะสร้างการจัดเก็บที่กลับมาID
สำหรับการรับIP address
หรือ (ถ้าอยู่ไม่พบ) ID
แทรกอยู่และกลับที่สร้างขึ้น
ฉันคาดหวังว่าจะมีบันทึกจำนวนมาก (ฉันไม่สามารถบอกได้อย่างชัดเจนว่ามีจำนวนเท่าใด) แต่ฉันต้องการขั้นตอนการจัดเก็บด้านบนเพื่อดำเนินการโดยเร็วที่สุด ดังนั้นฉันจึงสงสัยว่าจะเก็บที่อยู่ IP จริงไว้อย่างไรในรูปแบบข้อความหรือไบต์ อันไหนจะดีกว่ากัน?
ฉันได้เขียนSQL CLR
ฟังก์ชันสำหรับแปลงที่อยู่ IP เป็นสตริงและย้อนกลับดังนั้นการแปลงจึงไม่ใช่ปัญหา (ทำงานกับทั้งสองIPv4
และIPv6
)
ฉันเดาว่าฉันต้องสร้างดัชนีเพื่อปรับการค้นหาให้เหมาะสม แต่ฉันไม่แน่ใจว่าฉันควรรวมIP address
ฟิลด์ไว้ในดัชนีกลุ่มหรือเพื่อสร้างดัชนีแยกต่างหากและการค้นหาประเภทใดจะเร็วขึ้น
IPv4
ฉันเดาฉันจะแปลงที่อยู่INT
และใช้ฟิลด์เป็นคีย์ดัชนี แต่สำหรับIPv6
ฉันต้องใช้สองBIGINT
เขตข้อมูลและฉันต้องการเก็บค่าไว้ในเขตข้อมูลเดียว - ดูเหมือนว่าฉันจะเป็นธรรมชาติมากขึ้น