Привыкай ко многим, ко многим отношениям
Они не причинят тебе вреда (слишком много;))
но я обнаружил, что гораздо проще добавлять теги статей с помощью
Единственное «преимущество» - не привыкать к чему-то новому (но хорошему).
Добавление тега к статье:
Поле с разделителями:
UPDATE Articels SET Tags = CONCAT(Tags, '&', NewTag) WHERE Article.Id = 123;
m: n (много ко многим):
INSERT INTO ArticlesTags (ArticleId,TagId) Values (123,NewTagId);
Для меня m: n даже меньше, чем разделитель.
Теперь попробуйте отсортировать поле с разделителями, удалить один тег илипосчитать количество статей в теге.Как вы хотите, чтобы тег назначался более одного раза для артикеля?Это нужно проверить с разделителями.С помощью m: n просто создайте уникальный многостолбцовый уникальный индекс для ArticleId / TagId, и база данных не позволит дважды вставить комбинированный код ArticleId, TagId.
Другое влияние заключается в том, что вы (почти) не можете использоватьИндекс в поле с разделителями, так как вам нужно фильтровать для чего-либо.как
WHERE Tag LIKE '%TagToFilter%'
, но вы можете использовать индекс только начиная с первого символа в поле, например:
WHERE Tag LIKE 'TagToFilter%' OR Tag LIKE 'TagToFilter'
Единственное, что сложнее - показать все теги статей.
с разделителями:
SELECT Tags FROM Articles;
m: n
SELECT
Articles.Id
, GROUP_CONCAT(Tags.Tag) AS ConcatTags
FROM
Articles
LEFT JOIN
ArticlesTags
ON
Articles.Id = ArticlesTags.ArticlesId
INNER JOIN
Tags
ON
ArticlesTags.TagId = Tags.Id
GROUP BY
Articles.Id
Еще один недостаток вашего подхода: вы сохраняете строки тегов вместо их первичного ключа.Это вызывает много обновлений, если вы измените тег (например, c-sharp на c #).С ПК хранится как внешний ключ.Одно обновление тега изменяет его везде.