Теги статьи должны быть много ко многим или столбец с разделителем - PullRequest
0 голосов
/ 22 декабря 2018

Имея веб-сайт, на котором пользователь может публиковать статью максимум с 10 тегами, я искал способ проектирования базы данных: все было для многих.

Но я обнаружил, что гораздо проще добавлять теги статей с помощью& или что-нибудь ... Как это: c#&c++&c&db&syntax.

Будет ли оно отличаться в запросах или чем-то?

1 Ответ

0 голосов
/ 22 декабря 2018

Привыкай ко многим, ко многим отношениям

Они не причинят тебе вреда (слишком много;))

но я обнаружил, что гораздо проще добавлять теги статей с помощью

Единственное «преимущество» - не привыкать к чему-то новому (но хорошему).

Добавление тега к статье:

Поле с разделителями:

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 #).С ПК хранится как внешний ключ.Одно обновление тега изменяет его везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...