gpt4 book ai didi

mysql - SQL:具有大量常用值的文本类型

转载 作者:行者123 更新时间:2023-11-29 02:13:31 25 4
gpt4 key购买 nike

我有一个基本如下所示的表格:

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 个新的不同值或更少),而我每天会有数千个新观察结果。

现在我只是想为 Service 列使用 VARCHAR 或 mysql 的 TEXT 类型,但考虑到这种情况看起来很浪费。

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

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


编辑:

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

最佳答案

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

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

您的存储过程需要:

  • 检查服务是否存在,如果不存在则插入。 INSERT IGNORE ... 可能是你的 friend 。
  • 使用 SELECT id INTO @serv_id FROM ServiceType WHERE name = [service_name]; 获取服务的 ID;
  • 使用服务 ID 而不是服务插入到表中。

不要过度优化。 MySQL 存储 TINYINT 的效率并不比 INT 高,因此只要使用后者,它就不会失败,直到您拥有数十亿个服务。

关于mysql - SQL:具有大量常用值的文本类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45223535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com