Mysql 如何修复以逗号分隔方式存储信息的数据库

Mysql 如何修复以逗号分隔方式存储信息的数据库,mysql,database,Mysql,Database,我目前正在从事一个多年前开发的项目。它是一个PHPweb应用程序,使用MySQL数据库。开发人员这样做,数据库的某些列以逗号分隔的方式存储数据。例如: 一个公司可以有许多标签,一个标签可以有许多公司。开发人员不是将数据存储在带有公司id和标记id的中间表中,而是将公司表中每个标记的名称存储在用逗号分隔的标记列下 我的任务是重新格式化系统的搜索功能,希望能够加快查询速度。这种存储数据的方法立即引起了我的注意,因为它似乎不切实际 我只是想知道我是否可以得到你如何处理这个问题的建议?数据库相当大,但这

我目前正在从事一个多年前开发的项目。它是一个
PHP
web应用程序,使用
MySQL
数据库。开发人员这样做,数据库的某些列以逗号分隔的方式存储数据。例如:

一个公司可以有许多标签,一个标签可以有许多公司。开发人员不是将数据存储在带有公司id和标记id的中间表中,而是将公司表中每个标记的名称存储在用逗号分隔的标记列下

我的任务是重新格式化系统的搜索功能,希望能够加快查询速度。这种存储数据的方法立即引起了我的注意,因为它似乎不切实际

我只是想知道我是否可以得到你如何处理这个问题的建议?数据库相当大,但这并不是不首先包括中间表的借口。我认为最好的方法是为多对多关系创建表,并修改现有逻辑以利用这些表,对吗

我只是一个初级开发人员,但我正在努力把这件事做好,并将感谢任何关于这项任务的建议。据我所知,以这种方式存储数据会降低查询性能,并使处理数据变得更加困难


编辑:如果这个问题更适合“程序员”交流,我将提出它。直到我发布了这个问题,我才意识到这样一个网站的存在

您是否考虑过将逗号分隔的列编写脚本到它们的纵坐标列中,然后对数据库进行规范化?

如果您知道在名为Tag的表中有所有现有标记的列表,下面是创建CompanyTag表的方法:

CREATE TABLE CompanyTag
(
 SELECT company.Id AS CompanyId, tag.Id AS TagId
 FROM Company company
  INNER JOIN Tag tag ON company.Tags REGEXP CONCAT('[[:<:]]', tag.Id, '[[:>:]]')
);
和标记包含行(Id)

然后将使用(CompanyId,TagId)创建CompanyTag


对此评论的其余部分可以忽略。
(1, 40,41)
(2, 30)
(30)
(40)
(41)
(1, 40)
(1, 41)
(2, 30)