【问题标题】:How to a denormalize repeating mysql data?如何对重复的mysql数据进行非规范化?
【发布时间】:2017-03-29 16:19:31
【问题描述】:

您好,我需要对包含重复数据的 MySQL 表进行一些非规范化处理。

我的“出版物”表目前是这种格式:

Publications Source Table   

|  title                   |       author
--------------------------------------------
|  my paper                |       michael
|  my paper                |       bill
|  my paper                |       jill
|  other paper             |       tom
|  other paper             |       amy
|  third paper             |       ben
|  third paper             |       sophie

我需要把它改成这种格式:

Publications Destination Table

|  title                   |    author   |  author2   |  author 3
|-----------------------------------------------------------------
|  my paper                |    michael  |  bill      |  jill
|  other paper             |    tom      |  amy       |
|  third paper             |    ben      |  sophie    |

现在,为了您的信息,我需要这样做,以便最终获得 CSV 文件,以便可以将数据从旧系统导出到需要这种格式的 CSV 文件的新系统。

表中还有许多其他字段,源表中有大约 60,000 行,但只有大约 15,000 个唯一标题。在源表中,每个作者有一行。在目的地中,title 将是一个唯一标识符。每个唯一的出版物标题我需要一行。此外,我还可以提前计算出任何一份出版物上最多的作者数量,如果这会使问题变得更容易的话。

如何在 MySQL 中做到这一点?谢谢

【问题讨论】:

  • 你的谷歌搜索字符串是mysql pivot query
  • 上面的第一个表格设计比您要创建的表格要好,但仍需努力。我希望出版物表只包含标题和出版物只能具有一个值的任何其他信息。然后为发布可能有多个值的每条信息创建一个单独的表。
  • 请不要说我试图获取的格式只是其他人已经为其编写了导入程序的格式。数据最终将存储在高度规范化的企业数据库系统中,但供应商已为我们提供了使用此特定 CSV 格式将数据导入其中的选项。

标签: mysql sql export-to-csv denormalization


【解决方案1】:

如果您实际上并不想改变表的结构,而只是想取出数据以便将其导入新系统,您可以尝试 mysql 中的 GROUP_CONCAT() 函数:

SELECT title, GROUP_CONCAT(author SEPARATOR "|") AS authors FROM publications GROUP BY title;

我使用竖线作为分隔符,因为您的标题很可能包含逗号。如果您希望它最终成为 csv 文件,您可以对管道字符执行查找和替换,以将其转换为所需的任何内容(例如,", ")。

【讨论】:

  • 我认为产生正确输出的 查询 比重组表格产生正确的输出更好地服务于 OP。
  • 这是朝着正确方向迈出的一步,我仍然需要添加标题列“author1, author2 ... author13”,并合并到文本文件中,但这并不难。
【解决方案2】:

我的建议是您实际上对表格进行规范化,而不是为补充作者添加新列。所以你的新表结构看起来像这样:

Publications Source Table   

|  title_id         |       title
--------------------------------------------
|  1                |       my paper
|  2                |       other paper
|  3                |       third paper


|  title_id      |       author
--------------------------------------------
|  1             |       michael
|  1             |       bill
|  1             |       jill
|  2             |       tom
|  2             |       amy
|  3             |       ben
|  3             |       sophie

【讨论】:

  • 为什么要推荐,因为我需要这种格式的数据,以便可以将其从旧系统导出到需要这种格式的 CSV 文件的新系统中。
  • 如果这个其他系统是“新的”,你可以控制它吗?你能改变它的要求吗?还是倡导变革?我提出的更符合标准的数据库设计实践。如果 csv 反映了新的表结构,那么在您的设计中,针对新系统中的表编写查询将变得更加困难。而且我的设计在每个标题的作者数量方面更加灵活。当标题少于我假设频繁出现的最大值时,您的设计将创建许多空的作者字段。
  • 添加新的代理 id 号码与规范化无关
  • id 编号与创建一个模式有关,该模式将“释放修改异常的数据库”,如下所述:en.wikipedia.org/wiki/Database_normalization 和许多其他地方。在整个表格中一遍又一遍地重复标题是对表格进行非规范化的方法。
  • 这不是关于规范化的争论,我只需要获取目标格式的 csv 文件,因为其他人已经编写了使用该格式的导入程序。数据最终会进入一个高度规范化的数据库,但我有两个选择: 1:手动输入 15000 条记录,向供应商提供 CSV 文件,他们会为我导入。
猜你喜欢
  • 2017-06-23
  • 2010-10-22
  • 2017-10-05
  • 1970-01-01
  • 2021-09-05
  • 2013-06-30
  • 2018-12-12
  • 2013-03-08
  • 2020-07-31
相关资源
最近更新 更多