Недавно я ответил на вопрос, который мне задал разработчик программного обеспечения, пытавшийся предотвратить дублирование строк. Кстати, этот вопрос встречается довольно-таки часто. Сначала я думал, что у него отсутствует первичный ключ. Но проблема была в другом.
В своей базе управления контентом он хранил статьи для публикации на веб-сайте. Он пользовался таблицей пересечений для отношения «множество-множество» между таблицей статей и таблицей тегов.
Файл npHHepaiJD-Required/intro/articletags.sql
CREATE TABLE ArticleTags (
id SERIAL PRIMARY KEY,
article_id BIGINT UNSIGNED NOT NULL,
tag_id BIGINT UNSIGNED NOT NULL,
FOREIGN KEY (article_id) REFERENCES Articles (id),
FOREIGN KEY (tag_id) REFERENCES Tags (id)
) ;
При подсчете количества статей с заданным тегом он из запросов получал неправильные результаты. Ему было известно, что существовало только пять статей с тегом «есопоту» (экономика), а запрос выдавал, что этих статей семь.
Файл npM4epa:JD-Required/intro/articletags.sql
SELECT tag_id, COUNT (*) AS articles_per_tag FROM ArticleTags WHERE tag_id = 327;
Когда разработчик запрашивал все строки, соответствующие идентификатору tag_id, он видел, что тег связан с одной определенной статьей в три-пликате; одну и ту же связь отображали три строки, хотя у них были разные значения id.
id tag_id article_id
22 327 1234
23 327 1234
24 327 1234
Данная таблица содержала первичный ключ, но этот первичный ключ не предотвращал появление в столбцах дубликатов, которые оказались причиной беспокойства. Возможным «лекарством» могло бы стать создание ограничения UNIQUE ПО двум другим столбцам, но зачем вообще нужен столбец id в этих условиях?
Опубликовал vovan666
June 18 2013 12:25:18 ·
0 Комментариев ·
3507 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.