Я работаю над веб-сайтом, который просит пользователя предоставить тег их вновь созданному контенту (похожим на теги stackoverflow). Но как хранить эти теги? , если база данных mysql используется, тогда я должен установить ограничение на количество столбцов и количество самих тегов. Так как я хочу предоставить пользователю неограниченный параметр маркировки, какой подход следует соблюдать?Как хранить неограниченные теги в базе данных?
ответ
Это классический От n до m отношение. Как это
tags table
----------
id
name
...
content table
-------------
id
title
...
content_tags table
------------------
content_id
tag_id
Для хранения нескольких тегов для одного содержания, добавить запись в таблицу content_tags для каждого тега вы хотите его иметь. Пример:
content_tags table
------------------
content_id | tag_id
1 | 2
1 | 5
1 | 1
Чтобы затем получить теги записи контента сделать:
select t.*
from tags t
join content_tags ct on ct.tag_id = t.id
join content c on ct.content_id = c.id
where c.title = 'my content title'
Спасибо. Что, если я пойду с ограниченными тегами, скажем, им всего 20. Затем мне нужно создать 20 столбцов и предположим, что некоторые пользователи дали меньше тегов (чаще всего это будет так). В этом случае большинство столбцов будут пустыми. Что делать в этом случае, это хороший дизайн, чтобы позволить так много записей в таблице пустым? – Republic
Дизайн, о котором я упоминаю в своем ответе, - это тот, который нужно выбрать независимо от количества тегов, исправленных или нет. Хорошо, если есть макс. только один тег за сообщение, тогда вы, конечно, не сделаете это так. –
Что бы я сделал: создайте отдельную таблицу, в которой хранятся имена тегов. Затем вам нужно использовать внешний ключ, и по существу, когда они выбирают теги, у вас есть каждая запись ссылки на строку в таблицу тэгов. Это позволит вам хранить «неограниченные теги», так как вы можете просто добавлять к таблице тегов.
Есть несколько способов решить эту проблему:
- Как подсказывает другой ответ, создать
tags
таблица в базе данных специально. Это самый традиционный способ сделать это. Например, wordpress имеет таблицыtags
иcategories
, которые ссылаются на таблицуposts
, где хранится каждое опубликованное пользователем сообщение. - Другой способ - сохранить его в поле
json
(в настоящее время большинство баз данных имеют его, включая mysql и pgsql) в самой главной таблице, вместо хранения в отдельной таблицеtags
. Преимущество этого заключается в том, что ваши запросы будут быстрее, поскольку одно соединение будет устранено. Недостатком является то, что вы не получите обычных преимуществ от нормализации, т. Е. Эффективного размера хранилища. - Другой быстрый и грязный способ, но «старая школа» заключается в использовании разделителя в одном поле заметок или LOB для хранения ваших тегов. Используя разделитель запятой, это будет что-то вроде:
html,css,javascript
, а затем разделить с помощью разделителя всякий раз, когда вы хотите их обработать. Конечно, очевидным недостатком является то, что вы не сможете использовать этот разделитель (запятая в этом примере) как часть тега.
Идея о том, что устранение JOINs каким-то образом улучшает производительность запросов, просто ошибочна – Strawberry
Что делать, если я иду с ограниченными метками, скажем, что их всего 20. Затем мне нужно создать 20 столбцов и предположим, что некоторые пользователи дали меньше тегов (чаще всего это будет так). В этом случае большинство столбцов будут пустыми. Что делать в этом случае, это хороший дизайн, чтобы позволить так много записей в таблице пустым? – Republic