2011-03-17 45 views
0

我需要执行数据结构的规范化。我有一个表有大量的冗余数据(42列)如何正常化活动数据库

几个例子:

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

,我要创建3个表fileusertags

我有近30 000条记录。

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

回答

3

首先,您不能转换此表。你将不得不使用新的。一个简单的方法是将此表用作临时表。创建新表格。然后从该表中选择并添加到这些表中。您将不得不为每个表标识主键。然后填写表格(您可能必须先确定要填充哪个表格以便参考完整性等)。

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

(注 - 这意味着你将使用的主塔(S)作为主键。如果要使用自动生成的整数(最佳),你将不得不执行查找...)

批次取决于新的模式和关系(您在此没有明确定义)。希望这可以帮助。

编辑 - 查找

你将不得不为每个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,TAG_ID组由file_pk_col

- 这是对标签表格的例子查找。

+0

你是什么意思“你将不得不执行查找...”什么是查找?你能用SQL来回答吗?关系:'用户1 ----- n文件n ----标签'(最后一个可以进一步优化)。谢谢。 – jcubic 2011-03-17 10:10:23

+0

@jcubic请参阅编辑以进行查找。 Ps - 如果你有多对多关系,你可能需要一个表来指定那些FILE_TAGS(file_id,tag_id)类型。 – Jai 2011-03-17 12:08:06

+0

是的,我知道我跳过这个来限制我的问题中的表格数量。哇。我可以在UPDATE内部加入吗?真棒。我可以在单个UPDATE中使用SELECT,JOIN和GROUP BY吗? – jcubic 2011-03-17 19:25:53

0

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

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