我有一个巨大的访问mdb文件,其中包含一个包含20-30列和超过50000行的表 我有这样的事情
列:
id desc name phone email fax ab bc zxy sd country state zip .....
1 a ab 12 fff 12 w 2 3 2 d sd 233
2 d ab 12 fff 12 s 2 3 1 d sd 233
这里我有一些与重复地址相关的列值有一种方法来规范化上表,以便我们可以删除重复项或重复数据。
提前致谢。
答案 0 :(得分:2)
这是一个快速回答。您只需将地址字段移动到新表(删除重复项)并将FK添加回主表。
表1(人或其他)
id desc name phone email fax ab bc zxy sd address_id
1 a ab 12 fff 12 w 2 3 2 1
2 d ab 12 fff 12 s 2 3 1 2
3 d ab 12 fff 12 s 2 3 1 2
4 d ab 12 fff 12 s 2 3 1 1
表2(地址)
address_id country state zip .....
1 d sd 233
2 e ac 123
答案 1 :(得分:1)
Jim W有一个良好的开端,但为了进一步规范化,还要将冗余地址元素放入单独的表中。
创建重复地址数据的表(国家,州等)一旦有了数据表,就需要在State表中添加StateID,CountryID等列。
您现在可以选择修复现有数据。您可以快速而又脏,并使用Update语句将所有新创建的ID字段设置为指向正确的数据表。
UPDATE Addresses SET StateID=1 WHERE STATE='AL'
您可以作为批处理.sql文件快速完成此操作,但我建议使用更具编程性的解决方案,遍历Address表并尝试将当前“State”与新States表中的条目进行匹配。如果找到,则使用状态中相应行的id更新地址表上的StateID。
然后,您可以从地址表中删除旧的State字段,因为它现在很好地归一化为一个单独的States表。
可以对所有冗余数据元素重复此过程。但是,IMO数据库规范化可以采取太多措施。例如,如果您有一个常用的查询,在规范化之后,需要10个连接才能完成,您可能会看到性能降低。这似乎不是这里的情况,因为我认为你走在正确的轨道上。
来自上述评论: @Lance我想要类似的东西,但这里是问题我有单表形式的原始数据,我需要改进并将其发送到两个表我可以在表2中添加地址,但我不承担你将如何插入表1中的address_id
您可以使用@@ IDENTITY从地址表中检索新创建的ID,并使用此值更新address_ID。