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