规范化现有的MS Access数据库

2 ms-access normalizing

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

Dav*_*ton 5

如果您有一个表,请为其添加一个自动编号字段.

然后创建其他表,并使用原始单个表中的Autonumber值作为外键将它们连接回原始数据.

如果你有tblPerson:

  tblPerson
  LastName, FirstName, WorkPhone, HomePhone
Run Code Online (Sandbox Code Playgroud)

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

  tblPhone
  PhoneID, PersonID, PhoneNumber, Type
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

有人建议使用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;
Run Code Online (Sandbox Code Playgroud)

如果你将其保存为qryPhones,那么你将使用此SQL附加qryPhones:

  INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
  SELECT qryPhones.PersonID, qryPhones.WorkPhone, qryPhones.Type
  FROM qryPhones;
Run Code Online (Sandbox Code Playgroud)

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