2016-12-24 3 views
0

Я работаю над веб-сайтом, который просит пользователя предоставить тег их вновь созданному контенту (похожим на теги stackoverflow). Но как хранить эти теги? , если база данных mysql используется, тогда я должен установить ограничение на количество столбцов и количество самих тегов. Так как я хочу предоставить пользователю неограниченный параметр маркировки, какой подход следует соблюдать?Как хранить неограниченные теги в базе данных?

+0

Что делать, если я иду с ограниченными метками, скажем, что их всего 20. Затем мне нужно создать 20 столбцов и предположим, что некоторые пользователи дали меньше тегов (чаще всего это будет так). В этом случае большинство столбцов будут пустыми. Что делать в этом случае, это хороший дизайн, чтобы позволить так много записей в таблице пустым? – Republic

ответ

5

Это классический От 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' 
+0

Спасибо. Что, если я пойду с ограниченными тегами, скажем, им всего 20. Затем мне нужно создать 20 столбцов и предположим, что некоторые пользователи дали меньше тегов (чаще всего это будет так). В этом случае большинство столбцов будут пустыми. Что делать в этом случае, это хороший дизайн, чтобы позволить так много записей в таблице пустым? – Republic

+0

Дизайн, о котором я упоминаю в своем ответе, - это тот, который нужно выбрать независимо от количества тегов, исправленных или нет. Хорошо, если есть макс. только один тег за сообщение, тогда вы, конечно, не сделаете это так. –

0

Что бы я сделал: создайте отдельную таблицу, в которой хранятся имена тегов. Затем вам нужно использовать внешний ключ, и по существу, когда они выбирают теги, у вас есть каждая запись ссылки на строку в таблицу тэгов. Это позволит вам хранить «неограниченные теги», так как вы можете просто добавлять к таблице тегов.

-1

Есть несколько способов решить эту проблему:

  1. Как подсказывает другой ответ, создать tags таблица в базе данных специально. Это самый традиционный способ сделать это. Например, wordpress имеет таблицы tags и categories, которые ссылаются на таблицу posts, где хранится каждое опубликованное пользователем сообщение.
  2. Другой способ - сохранить его в поле json (в настоящее время большинство баз данных имеют его, включая mysql и pgsql) в самой главной таблице, вместо хранения в отдельной таблице tags. Преимущество этого заключается в том, что ваши запросы будут быстрее, поскольку одно соединение будет устранено. Недостатком является то, что вы не получите обычных преимуществ от нормализации, т. Е. Эффективного размера хранилища.
  3. Другой быстрый и грязный способ, но «старая школа» заключается в использовании разделителя в одном поле заметок или LOB для хранения ваших тегов. Используя разделитель запятой, это будет что-то вроде: html,css,javascript, а затем разделить с помощью разделителя всякий раз, когда вы хотите их обработать. Конечно, очевидным недостатком является то, что вы не сможете использовать этот разделитель (запятая в этом примере) как часть тега.
+1

Идея о том, что устранение JOINs каким-то образом улучшает производительность запросов, просто ошибочна – Strawberry