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

在MySQL的单个单元格中存储多个值,mysql,string,numbers,Mysql,String,Numbers,我使用分隔符(例如“1,5,10”)和文本数据类型在MySQL单元中存储多个数字 我如何执行这样的查找 SELECT * FROM MyTable WHERE MultiVals CONTAINS "5" 最后,这是存储这些值的首选方法吗?我像链接器表一样使用它,将某些行链接到另一个表中的多个其他行(通过ID)。由于我试图最小化DB的文件大小,所以我认为这将是一种更紧凑的链接方法,而不是使用其他表,如: Person ID Product ID ----------- --

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

我如何执行这样的查找

SELECT * FROM MyTable WHERE MultiVals CONTAINS "5"
最后,这是存储这些值的首选方法吗?我像链接器表一样使用它,将某些行链接到另一个表中的多个其他行(通过ID)。由于我试图最小化DB的文件大小,所以我认为这将是一种更紧凑的链接方法,而不是使用其他表,如:

Person ID       Product ID
-----------     -----------
3               1
3               2
3               3
7               5
7               7
select * from mytable where concat(',', multivals, ',') like '%,5,%' 

建议在具有两个外键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

这将确保通过使用逗号-s匹配值,因此值5将只匹配“5”而不是“15”

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

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

Person ID       Product ID
-----------     -----------
3               1
3               2
3               3
7               5
7               7
select * from mytable where concat(',', multivals, ',') like '%,5,%' 
这很可能会破坏除少量数据以外的任何性能,或者编写一个函数来拆分行(基于分隔符“,”)并检查结果数组,或者使用全文索引


编辑
find_in_set
操作符比使用
之类的
要优雅得多,尽管我不知道它是如何在幕后实现的。

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

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

你不应该那样做。您应该创建一个链接到myTable并在行中保存值的表。你为什么要这么做的理由太多了,但我个人最喜欢的是考虑将来的投资。p> 使用分隔数据迟早会遇到问题,原因可能是负载增加或数据量过大

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


综上所述,如果你不打算做任何严肃的SUTF(MyTable中至少有百万条记录或一个多变量字段中超过50个值),你可以继续做你现在一直在做的事情。-您不会看到任何性能提升

它被称为复合表,传统上命名为“C_TABLE1_TABLE2”。这是一个值得怀疑的学习方法,我们将其命名为map_TABLE1_TABLE2:)如何在MySQL中配置外键?我是否将列标记为“索引”?您必须创建一个特定的约束,如删除级联上的
约束外键('fk_project_id')引用'projects'('project_id')
这将在最后的create table子句中进行。。。否则,只需使用PhpMyAdmin来了解语法,为什么要尝试最小化db的文件大小???哈哈。有没有建造过可伸缩的东西?询问您的系统管理员他们认为企业存储成本是多少。