在MySQL中的单个单元中存储多个值

时间:2010-01-27 07:50:37

标签: mysql string numbers

我使用分隔符(例如“1,5,10”)和TEXT数据类型在MySQL单元格中存储多个数字。

如何执行这样的查找?

SELECT * FROM MyTable WHERE MultiVals CONTAINS "5"

最后,这是存储此类值的首选方法吗?我正在使用它像链接器表,将某些行链接到另一个表中的多个其他行(通过ID)。由于我正在尝试最小化数据库的文件大小,我认为这将是一种更紧凑的链接方法,而不是像这样使用另一个表:

Person ID       Product ID
-----------     -----------
3               1
3               2
3               3
7               5
7               7

4 个答案:

答案 0 :(得分:3)

建议在两个链接表之间用两个外键ID列创建第三个所谓的映射表。

Project ID       Tag ID
-----------     -----------
3               1
3               2
3               3
7               5
7               7

使用这些,两个外键也充当索引。因此,与FIND_IN_SET方法相比,它将大大加快查找速度。 您正在最小化文件大小,因为TEXT数据类型为未使用的位保留空格,而数值存储是最佳的,并使用最小的本地存储。

无论如何,如果你想保持原来的方式,你可以这样做:

SELECT * FROM MyTable WHERE FIND_IN_SET(5,MultiVals) >0

这将确保使用逗号匹配值,因此值5将仅匹配“5”而不是“15”

答案 1 :(得分:2)

你不应该这样做。您应该创建一个链接到myTable的表,并在行中保存值。你应该这样做的原因太多了,但我个人最喜欢的是 - 考虑投资未来。

使用分隔数据,由于负载增加或数据量大,您迟早会遇到问题。

MySql和任何其他关系数据库一样,在搜索int等时比在字符串中搜索更快。更不用说字符串索引需要花费更多的dn资源来维护它们。

所有人都说,如果你不打算做任何严肃的sutff(至少在MyTable中有数百万条记录或在一个MultiVal字段中超过50个值),你可以继续做你现在一直在做的事情。 - 你不会看到任何性能提升。

答案 2 :(得分:1)

尽可能避免这种情况,因为它违反了数据库规范化的规则,并且很难对这些值进行索引。您的值可以保存在单独的查找表或类似内容中。

如果您别无选择,只能使用此设计,那么您可以查询以下值:

select * from mytable where concat(',', multivals, ',') like '%,5,%' 

除了微不足道的数据之外,很可能会破坏性能,或编写一个拆分行的函数(基于你的分隔符“,”)并检查生成的数组,或者使用全文索引。

编辑find_in_set运算符比使用like更优雅,但我不知道它是如何在封面下实现的。

答案 3 :(得分:0)

像其他帖子说的那样,这是一个坏主意,但你仍然可以使用一个简单的正则表达式来执行它

.. where field RLIKE '(^|,)5($|,)'