Вместо хранения account_id в таблице Products используйте для этих значений отдельную таблицу, чтобы каждое значение этого атрибута занимало свою строку. В этой новой таблице Contacts реализуется отношение «множество-множество* между продуктами (Products) и учетными записями (Accounts):
Файл примера: Jaywalking/soln/create.sql
CREATE TABLE Contacts (
product_id BIGINT UNSIGNED NOT NULL, account_id BIGINT UNSIGNED NOT NULL, PRIMARY KEY (product_id, account_id),
FOREIGN KEY (product_id) REFERENCES Products(product_id), FOREIGN KEY (accounted) REFERENCES Accounts (account_id)) ;
INSERT INTO Contacts (product_id, account_id)
VALUES (123, 12), (123, 34), (345, 23), (567, 12), (567, 34);
Когда в таблице содержатся внешние ключи, ссылающиеся на две таблицы, она называется таблицей пересечений*. Она реализует отношение «множество-множество» между двумя упоминаемыми таблицами. То есть каждый продукт может быть связан посредством таблицы пересечений с несколькими учетными записями. Аналогично, каждая учетная запись может быть связана с несколькими продуктами. См. диаграмму отношения объектов (рис. 2.1).
Запрос продуктов по учетной записи, а также другими способами
Наиболее простой способ запроса атрибутов всех продуктов для заданной учетной записи состоит в объединении таблицы Products с таблицей Contacts:
Файлпримера -.Jaywalking/soln/join.sql
SELECT p.*
FROM Products AS p JOIN Contacts AS с ON (p. product_id = с.product_id)
WHERE c.account_id = 34;
Некоторые возражают против запросов, содержащих операцию объединения, думая, что такие запросы плохо функционируют. Однако этим запросом индексы используются гораздо лучше, чем решением, показанным ранее в разделе «Антипаттерн».
1 Для идентификации данной таблицы используются и другие термины, например: объединенная таблица, таблица «множество-множество», таблица сопоставлений. Название не имеет особого значения, поскольку идея остается той же.
Подобным образом запрос сведений об учетных записях легко прочитать и легко оптимизировать. В отличие от скрытого применения регулярных выражений, запросом эффективно используются индексы для объединения.
Файл примераijaywalking/soln/join.sql SELECT а.*
FROM Accounts AS a JOIN Contacts AS с ON (a. account_id = с. account_id)
WHERE c.product_id = 123;
Опубликовал vovan666
June 18 2013 12:24:37 ·
0 Комментариев ·
3438 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.