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
列,但考虑到具体情况,这些类型似乎是浪费
数据库通常对这类事情很精明吗?或者,是否有某种方法可以向数据库提示这种行为是它可以可靠利用的
我正在使用MySQL5.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啊,谢谢,这实际上看起来是“正确的事情”。我仍然想探索一下是否有更简单的方法向数据库表明我想要什么,因为我实际上不希望自己做所有可能的值的簿记。根据我下面的回答,您只需要很少的簿记,并且可以轻松地将其隔离到存储过程和视图中。