Определено запазете IP адресите като числа, ако нямате нищо против допълнителната работа, която отнема, особено ако трябва да правите заявки за адресите и имате големи таблици/колекции.
Ето защо:
Съхранение
- Един IPv4 адрес е 4 байта, ако се съхранява като цяло число без знак.
- Един IPv4 адрес варира между 10 байта и 18 байта, когато е изписан като низ в точка с точка. (Да приемем, че средната стойност е 14 байта.)
Това е 7-15 байта за знаците, плюс 2-3 байта, ако използвате тип низ с променлива дължина, който варира в зависимост от базата данни, която използвате. Ако имате налично представяне на низ с фиксирана дължина, тогава трябва да използвате поле с фиксирана ширина от 15 знака.
Дисковото съхранение е евтино, така че това не е фактор в повечето случаи на употреба. Паметта обаче не е толкова евтина и ако имате голяма таблица/колекция и искате да правите бързи заявки, тогава имате нужда от индекс. Наказанието за съхранение от 2-3 пъти при кодиране на низ драстично намалява количеството записи, които можете да индексирате, като същевременно запазвате индекса резидентен в паметта.
- Един IPv6 адрес е 16 байта, ако се съхранява като цяло число без знак. (Вероятно като множество цели числа от 4 или 8 байта, в зависимост от вашата платформа.)
- Един IPv6 адрес варира от 6 байта до 42 байта, когато е кодиран като низ в съкратена шестнадесетична нотация.
В долния край, обратният адрес на цикъл (::1) е 3 байта плюс служебния низ с променлива дължина. Във високия край, адрес като 2002:4559:1FE2:1FE2:4559:1FE2:4559:1FE2
използва 39 байта плюс низовете с променлива дължина.
За разлика от IPv4, не е безопасно да се приеме, че средната дължина на низа на IPv6 ще бъде средна от 6 и 42, тъй като броят на адресите със значителен брой последователни нули е много малка част от общото IPv6 адресно пространство. Само някои специални адреси, като loopback и autoconf адреси, вероятно ще бъдат компресирани по този начин.
Отново, това е наказание за съхранение от>2x за кодиране на низ спрямо кодиране на цяло число.
Мрежова математика
Мислите ли, че рутерите съхраняват IP адресите като низове? Разбира се, че не го правят.
Ако трябва да правите мрежова математика за IP адреси, представянето на низове е главоболие. напр. ако искате да напишете заявка, която търси всички адреси в конкретна подмрежа („връщане на всички записи с IP адрес в 10.7.200.104/27“, можете лесно да направите това, като маскирате целочислен адрес с маска на целочислена подмрежа. ( Mongo не поддържа тази конкретна заявка, но повечето RDBMS го правят.) Ако съхранявате адреси като низове, тогава вашата заявка ще трябва да преобразува всеки ред в цяло число, след което да го маскира, което е с няколко порядъка по-бавно. (Побитово маскиране за IPv4 адрес може да се извърши за няколко цикъла на процесора, като се използват 2 регистъра. Преобразуването на низ в цяло число изисква превъртане през низа.)
По същия начин заявките за диапазон („връщане на всички записи, всички записи между 192.168.1.50 и 192.168.50.100“) с целочислени адреси ще могат да използват индекси, докато заявките за диапазон на адреси на низове няма да.
Изводът
Отнема малко повече работа, но не много (има милион функции aton() и ntoa() там), но ако изграждате нещо сериозно и солидно и искате да го укрепите в бъдеще спрямо бъдещи изисквания и възможността за голям набор от данни, трябва да съхранявате IP адресите като цели числа, а не низове.
Ако правите нещо бързо и мръсно и нямате нищо против възможността за ремоделиране в бъдеще, тогава използвайте низове.
За целта на ОП, ако оптимизирате за скорост и пространство и не мислите, че искате да го заявявате често, тогава защо изобщо да използвате база данни? Просто отпечатайте IP адреси във файл. Това би било по-бързо и по-ефективно за съхранение, отколкото съхраняването му в база данни (със свързан API и допълнителни разходи за съхранение).