Нормализация существующей базы данных MS Access
У меня есть одна большая база данных доступа, которую мне нужно нормализовать на пять таблиц и таблицу поиска. Я понимаю теорию, лежащую в основе нормализации, и уже набросал внешний вид таблиц, но я заблудился о том, как преобразовать мою таблицу, чтобы нормализовать базу данных. Анализаторы таблиц не дают той разбивки, которую я хочу.
4 ответа
Если у вас есть одна таблица, добавьте в нее поле Autonumber.
Затем создайте ваши другие таблицы и используйте значение 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 для исходной таблицы, которое свяжет все производные записи с исходной таблицей.
Могут ли запросы, в частности запросы Union, предложить решение? Где вы видите проблему?
Вы имеете в виду отношения в окне отношений? Они могут быть легко восстановлены. Или вы имеете в виду ключевые поля и т.д.? Иногда это может быть сложно и может включать промежуточные таблицы. Каждый случай индивидуален. Как сказал doofledorfer, вы, вероятно, получите более конкретный совет, если разместите схемы.
База данных является довольно типичной базой данных, в которой нет ничего особенного, чтобы отличить ее от других.
База данных состоит из одной таблицы с:
название компании, адрес, телефон и т. д. контактное лицо с типичными смежными полями
Это будет в основном служить базой данных маркетинга, и мне нужно будет отслеживать события, деловую переписку и тому подобное. Я просто заблудился о том, как сохранить отношения в целости и сохранности.