如何在mysql中存储类型可以是数字、日期或字符串的数据

2024-03-05

我们正在开发一个监控系统。在我们的系统中,值是由运行在不同服务器上的代理报告的。报告的观察结果可以是如下值:

  • 一个数值。例如"CPU USAGE" = 55. 表示 55% 的 CPU 处于使用状态 使用)。
  • 某些事件被解雇。例如“备份完成”。
  • 状态:例如SQL Server 已脱机。

我们想要存储这些观察结果(这些观察结果事先并不知道,并且将动态添加到系统中而无需重新编译)。

我们正在考虑向观察表添加不同的列,如下所示:

IntMeasure -> INTEGER
FloatMeasure -> FLOAT
Status -> varchar(255)

因此,如果我们要存储的值是数字,我们可以根据类型使用 IntMeasure 或 FloatMeasure。如果该值为状态,我们可以存储状态文字字符串(如果我们决定添加 Statuses(id, name) 表,则可以存储状态 id)。

我们认为可以有一个更正确的设计,但由于连接和动态表名称取决于类型,可能会变得缓慢和黑暗?如果我们无法在查询中提前指定表,那么联接将如何工作?


我没有做过正式的研究,但根据我自己的经验,我猜测超过 80% 的数据库设计缺陷是由于将性能作为最重要(如果不是唯一)考虑因素而设计的。

如果好的设计需要多个表,请创建多个表。不要自动假设连接是应该避免的。它们很少是性能问题的真正原因。

在数据库设计的所有阶段中,首要考虑的因素是数据完整性。 “答案可能并不总是正确的,但我们可以很快给你”并不是任何商店都应该努力实现的目标。一旦数据完整性被锁定,如果性能成为问题,可以解决。不要牺牲数据完整性,尤其是为了解决可能不存在的问题。

考虑到这一点,看看你需要什么。您有需要存储的观察结果。这些观察结果的属性数量和类型可能有所不同,可以是测量值、事件通知和状态变化等,并且有可能添加未来的观察结果。

这似乎符合标准的“类型/子类型”模式,其中“观察”条目是类型,每种类型或观察种类是子类型,并建议某种形式的类型指示符字段,例如:

create table Observations(
   ...,
   ObservationKind  char( 1 ) check( ObservationKind in( 'M', 'E', 'S' )),
   ...
);

但是在检查约束中硬编码这样的列表的可维护性水平非常低。它成为架构的一部分,只能使用 DDL 语句进行更改。这不是您的 DBA 所期待的。

因此,在自己的查找表中包含各种观察结果:

ID  Name         Meaning
==  ===========  =======
M   Measurement  The value of some system metric (CPU_Usage).
E   Event        An event has been detected.
S   Status       A change in a status has been detected.

(char 字段也可以是 int 或smallint。我在这里使用 char 进行说明。)

然后用 PK 和所有观察结果共有的属性填写观察结果表。

create table Observations(
   ID               int identity primary key,
   ObservationKind  char( 1 ) not null,
   DateEntered      date not null,
   ...,
   constraint FK_ObservationKind foreign key( ObservationKind )
      references ObservationKinds( ID ),
   constraint UQ_ObservationIDKind( ID, ObservationKind )
);

在 Kind 字段和 PK 的组合上创建唯一索引可能看起来很奇怪,它本身就是唯一的,但请耐心等待。

现在每种类型或子类型都有自己的表格。请注意,每种观察都会获得一个表,而不是数据类型。

create table Measurements(
    ID                   int not null,
    ObservationKind      char( 1 ) check( ObservationKind = 'M' ),
    Name                 varchar( 32 ) not null, -- Such as "CPU Usage"
    Value                double not null, -- such as 55.00
    ...,  -- other attributes of Measurement observations
    constraint PK_Measurements primary key( ID, ObservationKind ),
    constraint FK_Measurements_Observations foreign key( ID, ObservationKind )
        references Observations( ID, ObservationKind )
);

前两个字段对于其他类型的观测值是相同的,除了检查约束将强制该值为适当的类型。其他字段可能在数量、名称和数据类型方面有所不同。

让我们检查一下Measurements 表中可能存在的示例元组:

ID    ObservationKind  Name       Value  ...
====  ===============  =========  =====
1001  M                CPU Usage  55.0   ...

为了使该元组存在于该表中,观察表中必须首先存在 ID 值为 1001 且观察类型值为“M”的匹配条目。 ID 值为 1001 的其他条目不能存在于观察表或测量表中,并且根本不能存在于任何其他“种类”表(事件、状态)中。这对于所有类型的表都以相同的方式工作。

我还建议为每种观察创建一个视图,它将提供每种观察与主观察表的连接:

create view MeasurementObservations as
    select ...
    from   Observations o
    join   Measurements m
        on m.ID = o.ID;

任何仅处理测量的代码都只需要访问此视图而不是基础表。使用视图在应用程序代码和原始数据之间创建一堵抽象墙,大大增强了数据库的可维护性。

现在,创建另一种观察(例如“Error”)涉及到 ObservationKinds 表的简单 Insert 语句:

F   Fault        A fault or error has been detected.

当然,您需要为这些错误观察创建新的表和视图,但这样做不会对现有的表、视图或应用程序代码产生影响(当然,编写新代码来处理新观察的情况除外) 。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在mysql中存储类型可以是数字、日期或字符串的数据 的相关文章

  • MySQL 将 ÅäÖ 视为 AAO?

    这两个查询给了我完全相同的结果 select from topics where name Harligt select from topics where name H rligt 这怎么可能 看起来mysql在搜索时会将 翻译成aao
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 返回年份数组作为年份范围

    我正在尝试查询一个包含以下内容的表character varying 年份列 并将这些年份作为逗号分隔的年份范围字符串返回 年份范围将由数组中存在的连续年份确定 不连续的年份 年份范围应以逗号分隔 数据类型的原因是character var
  • 对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

    我有一张桌子 上面有VARCHAR列及其上的索引 每当一个SELECT COUNT 是在这张表上完成的 该表检查了COLUMN N OR COLUMN IS NULL它返回双倍的行数 SELECT 与相同的where子句将返回正确的记录数
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • 无法删除数据库 mysql:错误 3664 (HY000)

    我的应用程序中有一个名为X Files 我想要drop它 但每当我运行命令时drop database X Files我收到以下错误 mysql gt drop database X Files ERROR 3664 HY000 Faile
  • 在 MySQL 中插入时检查并防止相似字符串

    简要信息 我有3张桌子 Set id name SetItem set id item id position TempSet id 我有一个函数可以生成新的随机组合Item桌子 基本上 总是在成功生成之后 我在中创建一个新行Set表 获取
  • 如何使用 AJAX/jQuery 显示打印内容?

    所以我试图理解整个 AJAX jQuery 的事情 现在 当我单独运行这个 PHP 脚本时 我必须等待并观察轮子旋转 直到循环完成然后加载 while row mysql fetch array res postcode to storm
  • 如何将列中的天数添加到 DB2 中的当前日期?

    我正在编写此 SQL 来动态计算一定的天数 如下所示 但我不知道如何让它工作 因为我不断收到错误 select Current Date Dynamic numbr of days calculation here from TableNa
  • 如何解决 注意:未定义索引:第 21 行 C:\xampp\htdocs\invmgt\manufactured_goods\change.php 中的 id [重复]

    这个问题在这里已经有答案了 我的 PHP 代码有一个问题 显示 注意 未定义的索引 我确信它非常简单 因为我是初学者 所以我不太清楚到底出了什么问题 所以请帮助我 这是代码
  • MySQL 跨表计数(*) 查询帮助

    SELECT name COUNT AS count FROM t1 t2 WHERE t2 id t1 id GROUP BY t2 id 我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数 到目前为止我已经得到了上面的内容
  • 如何将“mysql source”命令与 mysql 变量一起使用?

    我需要从 mysql shell 执行一个基于如下条件的 SQL 文件 mysql gt 源 var 其中 var 包含文件名 这不可能 source是MySQL客户端程序在本地识别并执行的命令 变量存在于服务器上 因此客户端不知道什么 v
  • 退出 PHP 脚本后终止或停止 MySQL 查询

    我在工作中运行一个统计服务器 由于运行的查询量很大 该服务器有时会变得非常慢 我们的营销团队使用它作为主要统计工具 团队中的某些人有时会在脚本结束之前退出脚本 通过关闭浏览器或选项卡 同时 SQL 查询继续执行 当有人关闭或离开 PHP 脚
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • Postgres 中 -Infinity 和 Infinity 的适当值

    在一种情况下 我们必须在 Postgres DB 中存储 无穷大和 无穷大的值 应该考虑什么合适的值 如果没有 请建议最合适的替代方案 你实际上可以使用 infinity and infinity for FLOAT4 and FLOAT8
  • 如何在Oracle中从表中选择列,*?

    我正在创建很多脚本 有时为了检查表是否根据我的需要进行更新 我会即时编写几个 SELECT 语句 在 SQL SERVER 中你可以这样写 SELECT Column1 FROM MY TABLE 出于可见性原因 这很有用 但是这似乎在 O
  • 通过Java从MySQL中获取大量记录

    有一个 MySQL 表 服务器上的用户 它有 28 行和 100 万条记录 也可能会增加 我想从这个表中获取所有行 对它们进行一些操作 然后将它们添加到 MongoDB 中 我知道通过简单的 从用户中选择 操作来检索这些记录将花费大量时间
  • mysql 数据库正在复制,但在主服务器上创建的用户未在从服务器上复制

    在主从复制中 我们使用 mysql DB 在从服务器上复制少量数据库 我在主服务器上创建了一个用户 不幸的是它没有在从服务器上复制 Replicate Do DB app1 app2 mysql 用户创建命令 GRANT SELECT on
  • SQL Server 中的嵌套事务

    sql server 允许嵌套事务吗 如果是的话那么交易的优先级是什么 来自 SQL Server 上的 MSDN 文档 嵌套交易 http msdn microsoft com en us library ms189336 SQL 90
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐