Нормализация существующей базы данных MS Access

У меня есть одна большая база данных доступа, которую мне нужно нормализовать в пять таблиц и таблицу поиска. Я понимаю теорию нормализации и уже набросал внешний вид таблиц, но не понимаю, как преобразовать мою таблицу, чтобы нормализовать базу данных. Анализаторы таблиц не предлагают той разбивки, которую я хочу.


person Community    schedule 10.11.2008    source источник


Ответы (4)


Если у вас есть одна таблица, добавьте в нее поле Автонумерация.

Затем создайте другие таблицы и используйте значение Autonumber из исходной отдельной таблицы в качестве внешнего ключа, чтобы снова соединить их с исходными данными.

Если бы у вас был 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, вы бы добавили qryPhones с этим SQL:

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

Очевидно, это только самый простой пример. Вы бы сделали то же самое для всех полей. Суть в том, что вам нужно создать значение PK для исходной таблицы, которое свяжет все производные записи с исходной таблицей.

person David-W-Fenton    schedule 10.11.2008
comment
Это отличный и подробный ответ. Хотел бы я проголосовать за него больше одного раза! - person James Marshall; 14.11.2008
comment
@David W. Fenton: вы не можете использовать запрос UNION в качестве подзапроса в Jet SQL - неправильно. Попробуйте это, используя Northwind в режиме запросов ANSI-92: SELECT DT1.digit FROM (SELECT DISTINCT 1 AS Digit FROM Orders UNION SELECT DISTINCT 2 FROM Orders) AS DT1; - person onedaywhen; 24.06.2009

Могут ли запросы, особенно запросы Union, предложить решение? Где вы видите проблему?

person Fionnuala    schedule 10.11.2008
comment
Никогда не рассматривал запрос на объединение. Я не знаю, какие шаги необходимо предпринять, чтобы сохранить отношения нетронутыми после того, как я разделю таблицу. - person ; 10.11.2008

База данных представляет собой довольно типичную базу данных, в которой нет ничего особенного, что отличало бы ее от других.

База данных состоит из одной таблицы с:

название компании, адрес, телефон и т. д. контактное лицо с типичными соответствующими полями

Это в основном будет служить маркетинговой базой данных, и мне нужно будет отслеживать события, деловую переписку и тому подобное. Я просто теряюсь в том, как сохранить отношения нетронутыми.

person Community    schedule 10.11.2008

Вы имеете в виду отношения в окне отношений? Их можно легко восстановить. Или вы имеете в виду ключевые поля и т.д.? Иногда это может быть сложно и может включать промежуточные таблицы. Каждый случай индивидуален. Как сказал doofledorfer, вы, скорее всего, получите более конкретный совет, если разместите схемы.

person Fionnuala    schedule 10.11.2008