数据库设计和规范化问题

时间:2009-08-27 23:04:17

标签: sql-server database-design

我有一个巨大的访问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

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

提前致谢。

2 个答案:

答案 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。