【问题标题】:Normalizing an existing MS Access Database规范化现有的 MS Access 数据库
【发布时间】:2009-06-24 06:01:11
【问题描述】:

我有一个大型访问数据库,我需要将其规范化为五个表和一个查找表。我了解规范化背后的理论,并且已经勾勒出表格的外观,但是我对如何转换表格以使数据库进行规范化感到迷茫。表分析器不提供我想要的细分。

【问题讨论】:

    标签: ms-access normalizing


    【解决方案1】:

    如果您只有一个表,请在其中添加一个自动编号字段。

    然后创建您的其他表,并使用原始单个表中的自动编号值作为外键将它们连接回原始数据。

    如果你有 tblPerson:

      tblPerson
      LastName, FirstName, WorkPhone, HomePhone
    

    如果您想将其分解,添加 PersonID 自动编号,然后创建一个电话表:

      tblPhone
      PhoneID, PersonID, PhoneNumber, Type
    

    然后,您将从 tblPerson 为适当的字段附加数据:

      INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
      SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work"
      FROM tblPerson
      WHERE tblPerson.WorkPhone Is Not Null;
    

    然后你会为家庭电话运行另一个查询:

      INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
      SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home"
      FROM tblPerson
      WHERE tblPerson.HomePhone Is Not Null;
    

    有人建议了一个 UNION 查询,您必须保存它,因为您不能将 UNION 查询作为 Jet SQL 中的子选择。保存的查询如下所示:

      SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work" As Type
      FROM tblPerson
      WHERE tblPerson.WorkPhone Is Not Null
      UNION ALL 
      SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home" As Type
      FROM tblPerson
      WHERE tblPerson.HomePhone Is Not Null;
    

    如果您将其保存为 qryPhones,那么您将使用以下 SQL 附加 qryPhones:

      INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
      SELECT qryPhones.PersonID, qryPhones.WorkPhone, qryPhones.Type
      FROM qryPhones;
    

    显然,这只是最简单的例子。你会为所有领域做同样的事情。关键是您必须为源表创建一个 PK 值,它将所有派生记录绑定回原始表。

    【讨论】:

    • 这是一个出色且详细的回复。希望我能不止一次投票!
    • @David W. Fenton:“您不能将 UNION 查询作为 Jet SQL 中的子选择”——不正确。在 ANSI-92 查询模式下使用 Northwind 试试这个:SELECT DT1.digit FROM (SELECT DISTINCT 1 AS Digit FROM Orders UNION SELECT DISTINCT 2 FROM Orders) AS DT1;
    【解决方案2】:

    查询,尤其是联合查询,能否提供解决方案?您在哪里发现问题?

    【讨论】:

    • 从未考虑过联合查询。我不知道在分离表格后保持关系完整所需的步骤。
    【解决方案3】:

    该数据库是一个非常典型的数据库,没有什么特别的区别。

    数据库由一张表组成:

    公司名称、地址、电话等。 典型相关领域的联系人

    这基本上将用作营销数据库,我需要跟踪事件、商业信函等。我只是不知道如何保持关系完好无损。

    【讨论】:

      【解决方案4】:

      您是指关系窗口中的关系吗?这些可以很容易地重建。或者你的意思是关键领域等?这有时可能很困难,并且可能涉及中间表。每种情况都不同。正如 doofledorfer 所说,如果您发布架构,您可能会得到更具体的建议。

      【讨论】:

        猜你喜欢
        • 2014-07-09
        • 2011-04-05
        • 1970-01-01
        • 2014-12-02
        • 2012-10-08
        • 2012-06-21
        相关资源
        最近更新 更多