如何规范化实时数据库

时间:2011-03-17 01:53:31

标签: mysql query-optimization normalization

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

几个例子:

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

我要创建3个表fileusertags

我有近30 000条记录。

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

2 个答案:

答案 0 :(得分:3)

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

您必须为每个表标识主键。然后填写表格(由于参考完整性的原因等等,你可能必须先确定要填写的表格。)。

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

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

Lot依赖于新的架构和关系(这里你没有明确定义)。希望这会有所帮助。

编辑 - 查询

每个table.eg都有一个INT id字段。 file_id的。这些将是系统生成的(主要是auto_increment)。简单来说,此信息不在您当前的表中。因此,当您将文件添加到文件表中并获取file_id时,您必须“查找”此文件的ID以添加到用户表以满足您的外键关系(基于它们的存在方式) 。 SIMPLE 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

现在插入文件...按file_pk_col选择file_pk_col,tag_Id

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

答案 1 :(得分:0)

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

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