Mysql SQL:包含许多常用值的文本类型

Mysql SQL:包含许多常用值的文本类型,mysql,sql,Mysql,Sql,我有一张表,基本上如下所示: Timestamp | Service | Observation ----------+---------+------------ ... | vm-1 | 15 ... | vm-1 | 20 ... | vm-1 | 20 ... | vm-1 | 20 ... | vm-1 | 20 ... | vm-1 | 20 ... | bvm-2

我有一张表,基本上如下所示:

Timestamp | Service | Observation
----------+---------+------------
...       | vm-1    | 15
...       | vm-1    | 20
...       | vm-1    | 20
...       | vm-1    | 20
...       | vm-1    | 20
...       | vm-1    | 20
...       | bvm-2   | 184
...       | bvm-2   | 104
...       | bvm-2   | 4
...       | bvm-2   | 14
...       | bvm-2   | 657
...       | bvm-2   | 6
...       | bvm-2   | 6
Service
列不会有很多不同的值。我不知道在表创建时所有可能的值都是什么,所以我不能使用枚举,但不同值的数量将以非常慢的速度增长(每月少于10个新的不同值或更少),而我每天将有数千个新观察值

现在我正在考虑使用
VARCHAR
或mysql的
TEXT
类型作为
Service
列,但考虑到具体情况,这些类型似乎是浪费

数据库通常对这类事情很精明吗?或者,是否有某种方法可以向数据库提示这种行为是它可以可靠利用的

我正在使用MySQL
5.7
。我更喜欢符合标准或可移植的东西,但我也愿意接受MySQL特定的解决方法


编辑:


换句话说,我想让这个列被当作一个枚举来处理,但是让数据库根据表中显示的不同的枚举值动态地计算出来。

每次需要使用<代码>枚举< /C>时,您应该考虑创建另一个表并引用它。这是基本的正常化。因此,为
ServiceType
创建一个带有
name
id
字段的表
name
可以是
VARCHAR
id
应该是
INT
。然后,实际的表只使用
id
而不是服务名称

您可以编写一个简单的存储过程来插入和查找重复的名称,还可以编写一个视图来访问结果,这样在数据库外部您几乎不知道如何在内部处理它

您的存储过程需要:

  • 检查服务是否存在,如果不存在则插入<代码>插入忽略…可能是您的朋友
  • 使用
    将ID从ServiceType中选择为@serv\u ID,其中name=[service\u name]获取服务的ID
  • 使用服务ID而不是服务ID插入到表中

不要过度优化。MySQL不能比
INT
更有效地存储
TINYINT
,所以只要使用后者,它就不会失败,直到你拥有数十亿的服务

我认为,您必须为存储服务创建一个新表,然后可以替换该表主键(service_id)来代替服务文本。但主表服务列应该是int类型,用于存储服务id。因此,请将服务列类型更改为int(4)


希望它会有帮助

A
varchar()
是存储字符串的正确方法。我被你的问题弄糊涂了。@GordonLinoff如果我存储为VARCHAR,并且该列有一百万个值完全相同的条目,比如说
一些很长的名称
,它将存储一百万个相同值的副本,对吗(也许我错了,如果是这样,这是一个愚蠢的问题)?我想提示数据库,您可以将其视为枚举,除非它必须找出枚举值是什么。我可以对它们可以接受的不同值的最大数量指定一些限制。看到这些数据,我认为您应该为服务创建一个单独的表,并使用一个获取服务id的外键,通过这种方法,您的表得到了规范化,每个服务只有一行,而不是重复相同的值。@GenaroMorales啊,谢谢,这实际上看起来是“正确的事情”。我仍然想探索一下是否有更简单的方法向数据库表明我想要什么,因为我实际上不希望自己做所有可能的值的簿记。根据我下面的回答,您只需要很少的簿记,并且可以轻松地将其隔离到存储过程和视图中。