2014-11-23 3 views
-1

Я прочитал все вопросы из ссылок и понял, что лучший способ хранения адреса IPv4/IPv6 для индексирования - 2xBIGINT. Но как я могу индексировать их в другой таблице, используя внешний ключ с лучшими характеристиками?mysql Сохранение адреса ipv6 с ограничением внешнего ключа

Мое требование прост. Я пытаюсь создать таблицу для хранения IP-адреса (IPv4, IPv6) с маской (таблица называется subnets). Теперь у меня есть другая таблица с именем interfaces, где каждый интерфейс может иметь IP-адрес. Каков наилучший способ применения внешних ключей между subnets и interfaces.

Я думал об этом прямо сейчас ...

-- 
-- Table structure for IP addresses `subnets`. stores the IP addresses with version (v4/v6) and type (unicast/multicast) 
-- 

CREATE TABLE subnets (
    top_ip BIGINT UNSIGNED DEFAULT NULL COMMENT 'top half of the IP Address in INT. If IPv4, then its NULL', 
    bottom_ip BIGINT UNSIGNED NOT NULL COMMENT 'bottom half of the IPv6 Address or full IPv4 address in INT', 
    mask INTEGER UNSIGNED NOT NULL COMMENT 'IP subnet mask', 
    version CHAR(2) NOT NULL DEFAULT '' COMMENT 'IP version. can be v4 or v6', 
    type VARCHAR(20) NOT NULL DEFAULT '' COMMENT 'type of address. can be unicast or multicast', 
    created_date DATETIME DEFAULT CURRENT_TIMESTAMP, 
    updated_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    UNIQUE KEY uniq_ip_addr (top_ip, bottom_ip) 
    PRIMARY KEY (top_ip, bottom_ip) 
) DEFAULT CHARSET=utf8 ENGINE=InnoDB; 

-- 
-- Table structure for table `interfaces` 
-- 

CREATE TABLE device_interface (
    intf_id INTEGER UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    intf_top_ip BIGINT UNSIGNED DEFAULT NULL, 
    intf_bottom_ip BIGINT UNSIGNED NOT NULL, 
    CONSTRAINT subnet FOREIGN KEY (intf_top_ip, intf_bottom_ip) REFERENCES subnets(top_ip, bottom_ip), 
    intf_name VARCHAR(100) NOT NULL, 
    created_date DATETIME DEFAULT CURRENT_TIMESTAMP, 
    updated_date DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
) DEFAULT CHARSET=utf8 ENGINE=InnoDB; 

Ссылки:

  1. Storing IPv6 Addresses in MySQL
  2. How to store IPv6-compatible address in a relational database
+0

Я знаю, что это не отвечает на ваш вопрос, но если переключение программного обеспечения базы данных является вариантом, вы должны посмотреть PostgreSQL , Он имеет гораздо лучшие типы данных для такого использования. –

ответ

0

Ну, после изучения много ... Я просто решили использовать один столбец VARBINARY(16) для хранения I Pv4/IPv6 и использовать его как PRIMARY KEY вместо 2 столбцов BIGINT только потому, что его плохая идея разбить простой адрес IPv6 на два отдельных столбца для цели управления. И я действительно сомневаюсь, что производительность будет иметь какое-либо существенное влияние (было бы, если бы я использовал VARCHAR вместо этого)

Смежные вопросы