【问题标题】:How to normalize live database如何规范化实时数据库
【发布时间】:2011-03-17 21:15:54
【问题描述】:

我需要对数据结构进行规范化。我有一张包含大量冗余数据的表(42 列)

几个例子:

files_shit (id, filename String, upload_user, user_name, tags text, ....)

我想创建 3 个表 fileusertags

我有将近 30 000 条记录。

将数据从file_shit 复制到filesuserstags 并创建引用的最佳方法是什么? (标签和文件之间将是另一个表file_tags

【问题讨论】:

    标签: mysql query-optimization normalization


    【解决方案1】:

    首先,您无法转换此表。您将不得不使用新的。一种简单的方法是将此表用作临时表。创建新表。然后从此表中选择并添加到这些表中。

    您必须确定每个表的主键。然后填写表格(出于参照完整性等原因,您可能必须确定首先填写哪个表格......)。

     Sudo code eg : insert into files(columns..)Select <files columns> from files_shit group by primary_colum;
    

    (注意 - 这意味着您将使用主列作为主键。如果您想使用自动生成的整数(最佳),您将必须执行查找...)

    Lot 依赖于新的模式和关系(您在这里没有明确定义)。希望这会有所帮助。

    编辑-查找

    每个表都有一个 INT id 字段。例如。文件 ID。这些将是系统生成的(主要是 auto_increment)。简而言之,此信息不在您当前的表中。因此,当您将文件添加到文件表并获得 file_id 时,您必须“查找”该文件的 id 以添加到用户表以满足您的外键关系(基于它们的存在方式) . 简单的 EG - 尝试在主表中添加额外的 file_id/tag_id 列。

    首先填写标签表(基本上是那些不引用任何其他的)。

    通过加入标签表(查找)为每一行填写主表tag_id。

    UPDATE <mainTable> mT JOIN  tag_table tT on mT.tag_pk_column= tT.tag_pk_column
    

    SET mT.tag_id=tT.tag_id

    现在插入文件...select file_pk_col, tag_Id group by file_pk_col

    -这是标签表的示例查找。

    【讨论】:

    • “您必须执行查找...”是什么意思?什么是查找?你能用SQL给出答案吗?关系:users 1 ----- n files n ---- n tags(最后一个可以进一步优化)。谢谢。
    • @jcubic 查看查找的编辑。 Ps - 如果你有多对多的关系,你可能需要一个表来指定那些 FILE_TAGS(file_id, tag_id) 类型。
    • 是的,我知道我跳过这个是为了限制我的问题中的表格数量。哇。我可以在 UPDATE 中加入吗?惊人的。我可以在单个 UPDATE 中同时使用 SELECT、JOIN 和 GROUP BY 吗?
    【解决方案2】:

    最简单的方法是使数据库脱机,创建新表,包括所有所需的约束,然后使用INSERT INTO . . . SELECT column_list FROM old_table 填充新表。一些数据可能不会满足新表中的约束;你必须解决这个问题。

    如果您不能使数据库脱机,或者如果您必须使更改对应用程序透明,则会变得更加复杂。触发器、规则和可更新视图将对此有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-10-05
      • 2018-10-30
      • 2014-05-30
      • 1970-01-01
      • 2012-10-08
      • 2012-06-21
      相关资源
      最近更新 更多