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

时间:2014-10-23 11:19:11

标签: mysql database

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

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

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

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

我只是一名初级开发人员,但我正在努力做到这一点,并希望对此任务有任何建议。我的理解是,以这种方式存储数据会降低查询性能并使处理数据变得更加困难。

编辑:如果这个问题更适合“程序员”交换,我会移动它。直到我发布这样一个网站存在的问题之后我才意识到。

2 个答案:

答案 0 :(得分:1)

如果您知道名为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, '[[:>:]]')
);

REGEXP&#39; [[:&lt;:]] ... [[:&gt;:]]&#39;表达式匹配由&#34;单词边界&#34;分隔的值。 另见:http://dev.mysql.com/doc/refman/5.1/en/regexp.html

例如,如果公司包含行(Id,标签)

(1, 40,41)
(2, 30)

标签包含行(Id)

(30)
(40)
(41)

然后将使用(CompanyId,TagId)

创建CompanyTag
(1, 40)
(1, 41)
(2, 30)

答案 1 :(得分:0)

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