2009-08-27 54 views
0

我有一个包含20-30列和50000行和 一个表一个巨大的访问mdb文件我有一些这样的事信息数据库设计和规范化问题

列:

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 

这里我有一些与地址有关的列值重复是否有一种方法来规范化上表,以便我们可以删除重复或重复数据。

在此先感谢。

回答

2

下面是一个简单的答案。你只需要将你的地址字段移动到一个新表(删除dups)并添加一个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 
+0

这正是我所做的,但是在向表1中添加新行时,如何插入地址标识符? – SweetGangster 2009-08-27 23:13:31

+0

您可以在Access中创建一个表单,让用户选择一个现有的地址或输入一个新的地址。你只需要定义一对多关系然后构建一个表单。 – 2009-08-27 23:14:58

+0

首先,你添加表2中的地址(或者如果有的话),然后拉取address_id并将其插入表1中的其余数据中。 – 2009-08-27 23:15:20

1

吉姆·W具有良好的开端,但要进一步规范化,使您的冗余地址元素成单独的表格也是如此。

创建重复地址数据的表(国家/地区,州/省等)拥有数据表后,您需要将诸如StateID,CountryID等列添加到地址表中。

您现在有修复现有数据的选项。您可以快速和肮脏,并使用Update语句将所有新创建的ID字段设置为指向正确的数据表。

UPDATE Addresses SET StateID=1 WHERE STATE='AL' 

你可以很快做到这一点作为一个批处理.sql文件,但我建议通过地址表推出,并尝试将当前的“国家”匹配在新的条目更编程解决方案各国表。如果找到,地址表上的StateID将使用来自状态中对应行的ID进行更新。

然后,您可以从地址表中删除旧的状态字段,因为它现在已经标准化并整齐地放入单独的状态表中。

可以对所有冗余数据元素重复该过程。但是,IMO db标准化可能太过分了。例如,如果您有一个常用的查询,在规范化后需要10个连接才能完成,您可能会看到性能下降。这似乎并不是这种情况,因为我认为你在正确的轨道上。

从以上评论: @Lance我想要类似的东西,但这里是问题,我有原始数据以单表的形式进来,我需要改进和发送到两个表我可以添加地址表2,但我不知道如何在表1中插入address_id

您可以使用@@ IDENTITY从地址表中检索新创建的ID,并使用此值更新address_ID。

+0

您可以使用@@ IDENTITY从地址表中检索新创建的ID,并使用此值更新address_ID。你能解释清楚一点吗? – SweetGangster 2009-08-27 23:40:42

+0

他正在讨论设置(地址表)address_id到一个IDENTITY数据类型(它就像访问中的自动编号)。然后,当您使用SQL INSERT命令将地址插入到该表中时,您可以获取此自动编号并更新第一个表中的相应address_id字段 – 2009-08-27 23:50:50

+0

我确实在第二个表中声明了adress_id列作为标识,但是我仍然无法完成以及如何更新第一个表adress_id基于第二个表列值我想用sql游标来比较两个表列,如果它匹配,然后更新第一个表中的adres_id,但似乎有我的游标代码有问题我使用嵌套游标 – SweetGangster 2009-08-28 00:12:04