SQL:具有许多常用值的文本类型

时间:2017-07-20 19:20:24

标签: 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   | 184
...       | bvm-2   | 104
...       | bvm-2   | 4
...       | bvm-2   | 14
...       | bvm-2   | 657
...       | bvm-2   | 6
...       | bvm-2   | 6

Service列不会有很多不同的值。我不知道在创建表时所有可能的值是什么,所以我不能使用枚举,但是不同值的数量将会非常缓慢地增长(每月少于10个新的不同值或者我会每天有数以千计的新观察结果。

现在我只想在VARCHAR列中使用TEXT或mysql的Service类型,但考虑到情况的具体情况,这些似乎很浪费。

数据库通常对这类事情很聪明吗?或者有什么方法可以向数据库提示这种行为是否可以可靠地利用?

我正在使用MySQL 5.7。我更喜欢符合标准或可移植的标准,但我也对MySQL特定的解决方法持开放态度。

编辑:

换句话说,我想要的是将列视为枚举,但让数据库根据表中显示的数据动态计算出不同的枚举值。

2 个答案:

答案 0 :(得分:2)

每次需要使用enum时,都应考虑创建另一个表并引用它。它是基本的标准化。因此,为ServiceType创建一个包含nameid字段的表,name可以是VARCHARid应为{{} 1}}。然后,实际表只使用INT而不是服务名称。

您可以编写一个简单的存储过程来插入和查找重复的名称以及一个视图来访问结果,因此在DB之外您几乎不知道它是如何在内部处理的。

您的存储过程需要:

  • 检查服务是否存在,如果不存在则插入。 id可能是你的朋友。
  • 使用INSERT IGNORE ...
  • 获取服务的ID
  • 使用服务ID而不是服务插入表中。

不要过度优化。 MySQL不会比SELECT id INTO @serv_id FROM ServiceType WHERE name = [service_name];更有效地存储TINYINT,所以只使用后者并且在您拥有数十亿服务之前它不会失败。

答案 1 :(得分:0)

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

希望它会有所帮助