将整数/字符串列表存储到mysql中的最佳方法?
我正在编写一个Golang应用程序,在该应用程序中,从用户处获取IP/主机名的输入结果,并输出到下面的输出中。现在,作为一项要求,我希望将主机的所有端口存储在MySQL数据库中,并在需要时从表中返回它以及历史记录。为了便于检索,在数据库中构造这些数据的最佳方法是什么?考虑有效的设计实践将整数/字符串列表存储到mysql中的最佳方法?,mysql,database-design,Mysql,Database Design,我正在编写一个Golang应用程序,在该应用程序中,从用户处获取IP/主机名的输入结果,并输出到下面的输出中。现在,作为一项要求,我希望将主机的所有端口存储在MySQL数据库中,并在需要时从表中返回它以及历史记录。为了便于检索,在数据库中构造这些数据的最佳方法是什么?考虑有效的设计实践 Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-21 18:50 Eastern Standard Time Nmap scan report
Starting Nmap 7.91 ( https://nmap.org ) at 2021-01-21 18:50 Eastern Standard Time
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00090s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 997 closed ports
PORT STATE SERVICE
135/tcp open msrpc
137/tcp filtered netbios-ns
445/tcp open microsoft-ds
我将为NMAP报告创建一个表:
CREATE TABLE nmap_reports (
nmap_report_id BIGINT AUTO_INCREMENT PRIMARY KEY,
nmap_version VARCHAR(10),
reported_at DATETIME COMMENT 'UTC',
host_status ENUM('up','down') NOT NULL,
host_latency_seconds NUMERIC(9,5),
host_address VARCHAR(10),
not_shown VARCHAR(255)
);
然后是多个端口的另一个表:
CREATE TABLE nmap_report_ports (
nmap_report_id BIGINT NOT NULL,
port SMALLINT NOT NULL,
protocol ENUM('tcp','udp') NOT NULL,
state ENUM('open','filtered') NOT NULL DEFAULT 'open',
service VARCHAR(20),
PRIMARY KEY (nmap_report_id, port, protocol),
FOREIGN KEY (nmap_report_id) REFERENCES nmap_reports(nmap_report_id)
);
因此,报告将在nmap\u报告中产生一行,在nmap\u报告端口中产生零到多行,每行引用第一个表中的行
这是存储复杂多值属性的最佳方法,以支持:
- 数据完整性
- 储存效率
- 对数据进行查询的最大灵活性
这是一种正确的表达方式
“考虑有效的设计实践”--“效率”不是绝对的标准。有数百万个相互矛盾的解决方案,每个解决方案对于给定的约束都是“有效的”。创建表nmap\U report\U ports(nmap_report_id BIGINT NOT NULL您的意思是第二个表的nmap_port_report_id吗?不,它是第一个表的外键。第一个表具有生成新值的自动递增功能。第二个表只引用它们。我使用一种约定,在可能的情况下,我将外键命名为它引用的表的主键ences.Field“nmap\u report\u id”没有默认值-在第二个表中插入时发生此错误。从中,我没有为第二个表的此字段提供任何值,因为我希望它引用表1并具有相同的值。我是否应该为此提供值?是的,您必须指定一个值,因为该列不为NULL,并且没有默认值,并且不是自动增量。您可以在nmap\u报告
表中使用要引用的行的主键值。如果您刚刚插入了该行,您应该能够使用LAST\u INSERT\u ID()
来获取最近生成的值。谢谢您的帮助