【发布时间】:2009-06-24 06:01:11
【问题描述】:
我有一个大型访问数据库,我需要将其规范化为五个表和一个查找表。我了解规范化背后的理论,并且已经勾勒出表格的外观,但是我对如何转换表格以使数据库进行规范化感到迷茫。表分析器不提供我想要的细分。
【问题讨论】:
标签: ms-access normalizing
我有一个大型访问数据库,我需要将其规范化为五个表和一个查找表。我了解规范化背后的理论,并且已经勾勒出表格的外观,但是我对如何转换表格以使数据库进行规范化感到迷茫。表分析器不提供我想要的细分。
【问题讨论】:
标签: ms-access normalizing
如果您只有一个表,请在其中添加一个自动编号字段。
然后创建您的其他表,并使用原始单个表中的自动编号值作为外键将它们连接回原始数据。
如果你有 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 值,它将所有派生记录绑定回原始表。
【讨论】:
SELECT DT1.digit FROM (SELECT DISTINCT 1 AS Digit FROM Orders UNION SELECT DISTINCT 2 FROM Orders) AS DT1;
查询,尤其是联合查询,能否提供解决方案?您在哪里发现问题?
【讨论】:
该数据库是一个非常典型的数据库,没有什么特别的区别。
数据库由一张表组成:
公司名称、地址、电话等。 典型相关领域的联系人
这基本上将用作营销数据库,我需要跟踪事件、商业信函等。我只是不知道如何保持关系完好无损。
【讨论】:
您是指关系窗口中的关系吗?这些可以很容易地重建。或者你的意思是关键领域等?这有时可能很困难,并且可能涉及中间表。每种情况都不同。正如 doofledorfer 所说,如果您发布架构,您可能会得到更具体的建议。
【讨论】: