mysql存储带外键约束的ipv6地址

时间:2014-11-23 20:26:51

标签: mysql ip-address ipv6

我已阅读参考文献中的所有问题,并了解存储用于索引的IPv4 / IPv6地址的最佳方法是2xBIGINT。但是,如何使用具有最佳性能的外键索引另一个表中的那些?

我的要求很简单。我正在尝试创建一个用于存储带掩码的IP地址(IPv4,IPv6)的表(称为subnets的表)。现在,我有另一个名为interfaces的表,其中每个接口都可以有一个ip地址。在subnetsinterfaces表之间应用外键的最佳方法是什么。

我现在想到了这个......

--
-- 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

1 个答案:

答案 0 :(得分:0)

嗯,经过大量的研究......我只是决定只使用一列VARBINARY(16)来存储IPv4 / IPv6地址,并将其用作PRIMARY KEY而不是2 BIGINT列只是因为它是一个坏主意将可简单的IPv6地址分成两个单独的列以实现可管理性目的。而且我真的怀疑性能是否会产生任何重大影响(如果我使用VARCHAR肯定会有这种影响)