我需要对数据结构进行规范化。我有一个包含大量冗余数据的表(42列)
几个例子:
files_shit (id, filename String, upload_user, user_name, tags text, ....)
我要创建3个表file
,user
和tags
我有近30 000条记录。
将数据从file_shit
复制到files
,users
和tags
并创建引用的最佳方法是什么? (标签和文件之间将是另一个表file_tags
)
答案 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
填充新表。有些数据可能无法满足新表中的约束;你必须解决这个问题。
如果您无法使数据库脱机,或者您必须使更改对应用程序透明,则会变得更加复杂。触发器,规则和可更新视图将有助于此。