【问题标题】:Best way to store a list of integers/strings into mysql? [closed]将整数/字符串列表存储到mysql的最佳方法? [关闭]
【发布时间】:2021-04-26 11:23:59
【问题描述】:

我正在编写一个 Golang 应用程序,其中从用户那里获取 IP/主机名的输入会导致以下输出。现在作为一项要求,我想将主机的所有端口存储在 MySQL Db 中,并在请求时将其与历史记录一起从表中返回。在数据库中构造这些数据以便于检索的最佳方法是什么?考虑有效的设计实践

   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

【问题讨论】:

  • “考虑高效的设计实践”——“效率”并不是绝对的标准。有数百万个相互矛盾的解决方案,每个解决方案对于给定的约束都是“有效的”。

标签: mysql database-design


【解决方案1】:

我将为 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_reports 中的一行,nmap_report_ports 中的零到多行,每一行引用第一个表中的行。

这是存储复杂多值属性以支持的最佳方式:

  • 数据完整性
  • 存储效率
  • 数据查询的最大灵活性

这是表示one-to-many relationship 的正确方式。

Avoid storing data in comma-separated lists.

【讨论】:

  • CREATE TABLE nmap_report_ports ( nmap_report_id BIGINT NOT NULL 你的意思是第二个表的 nmap_port_report _id 吗?
  • 不,它是第一个表的外键。第一个表具有自动增量以生成新值。第二个表只是引用它们。我使用了一个约定,在可能的情况下,我将外键命名为与其引用的表的主键相同。
  • 字段 'nmap_report_id' 没有默认值 - 插入第二个表时出现此错误。从我没有为第二个表的该字段提供任何值,因为我希望它从表 1 中引用并具有相同的值。我应该为此提供价值吗?
  • 是的,您必须指定一个值,因为该列不是 NULL 并且没有 DEFAULT 并且不是 AUTO_INCREMENT。在nmap_reports 表中使用要引用的行的主键值。如果您刚刚插入该行,您应该能够使用LAST_INSERT_ID() 来获取最近生成的值。
  • 谢谢你的工作就像一个魅力
猜你喜欢
  • 2023-03-17
  • 2013-03-02
  • 2010-10-08
  • 1970-01-01
  • 2011-09-07
  • 2021-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多