Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将整数/字符串列表存储到mysql中的最佳方法?_Mysql_Database Design - Fatal编程技术网

将整数/字符串列表存储到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

我正在编写一个Golang应用程序,在该应用程序中,从用户处获取IP/主机名的输入结果,并输出到下面的输出中。现在,作为一项要求,我希望将主机的所有端口存储在MySQL数据库中,并在需要时从表中返回它以及历史记录。为了便于检索,在数据库中构造这些数据的最佳方法是什么?考虑有效的设计实践

   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()
来获取最近生成的值。谢谢您的帮助