【问题标题】:How to create a table with similiar data the RIGHT way?如何以正确的方式创建具有相似数据的表?
【发布时间】:2019-01-04 08:01:46
【问题描述】:

我正在尝试制作一个程序,该程序将 ping 一些服务器和服务,无论它们是否在线,并且 将其写入数据库。所以在制作时我只是想知道哪种方法是最好的制作方法,我很可能需要这三个项目,但有时我不需要。

这是我当前的架构:

CREATE TABLE webservice_historylog (
    id_webServiceConnection BIGINT PRIMARY KEY AUTO_INCREMENT,
    id_Location varchar,
    datetime_Connect datetime,
    response_TimeMs int,
    status_Code varchar(5),
    status_Message varchar(255)
);

CREATE TABLE internet_historylog (
        id_internetConnection BIGINT PRIMARY KEY AUTO_INCREMENT,
        id_Location varchar,
        datetime_Connect datetime,
        response_TimeMs int,
        status_Code varchar(5),
        status_Message varchar(255)
);

CREATE TABLE postgresql_historylog (
        id_postgresqlConnection BIGINT PRIMARY KEY AUTO_INCREMENT,
        id_Location varchar,
        datetime_Connect datetime,
        response_TimeMs int,
        status_Code varchar(5),
        status_Message varchar(255)
);

我猜我可以用它制作一个视图表..

或者我应该把它放在一张桌子下面吗?像这样..

CREATE TABLE connection_historylog (
            id_Connection BIGINT PRIMARY KEY AUTO_INCREMENT,
            id_Location varchar,
            connectionType varchar, # Internet, WebService, Databases
            datetime_Connect datetime,
            response_TimeMs int,
            status_Code varchar(5),
            status_Message varchar(255)
);

我想要的:

提高了长期目标的性能,因为它每分钟都在积极地写作。这也会影响我以后如何调用这些数据。可以询问更多信息。

【问题讨论】:

  • 为什么time_Connect 的类型是date?为什么不使用 datetimetimestamp 类型的单列来包含日期和时间?
  • 哦,抱歉,会解决的。为什么不datetime?我在某处读过最好分别使用datetime。但我不太确定自己,因为我是数据库新手,但如果结果是错误的,请纠正我。
  • 这是一个错误的陈述。使用 datetimetimestamp 格式,不要分隔日期和时间。如果您将它们分开,它将使您未来的查询变得复杂,并无缘无故地给您的数据库增加压力。 DateTime 格式仅应在您只需要存储日期或时间时使用,此处不是这种情况。
  • 啊,好的,在 damien_the_unbeliever 发表评论后,我开始再次寻找它。问题已更新。也感谢@ThomasG 的启发!
  • 只有当您确定将来不会添加大量“连接类型”时,您当前的模式才有效,这将迫使您创建额外的表并编写新代码。就我个人而言,我会选择第二个选项:将所有日志放在同一个表中并带有类型列。

标签: mysql sql database mariadb


【解决方案1】:

一般来说,您应该将相似的表放在一个表中。随着时间的推移,这具有多种优势:

  • 查看不同类型数据的查询要简单得多,也更容易优化。
  • 您可以通过插入现有表来添加新类型。
  • 维护和操作更简单。例如,添加索引只需要在一个表上进行,而不需要在多个表上进行。
  • 在仅插入环境中,表将具有已填充的数据页,这对性能更好。

为了使这样的环境发挥最佳效果,您需要索引,也许还需要分区。具体索引取决于数据的使用方式。

【讨论】:

    【解决方案2】:

    单表,但主要是因为这可能是“正确”的方式。

    其他说明:

    • 两种方式的写入性能都相同。
    • 每分钟一个INSERT 是微不足道的。即使是 1/秒也是微不足道的。 1000/秒可能有点冒险。
    • 读取的性能取决于您将进行的过滤/排序。一旦我们看到SELECTs,我们就可以讨论INDEXes
    • 1 行/分钟小于 100 万行/年,因此我认为无需讨论扩展。
    • 没有任何东西(目前)表明PARTITIONing 会有任何用处。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-10
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      相关资源
      最近更新 更多