Как хранить теги в тегах MySQL, одно поле всего или одно поле для каждого тега?

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


person Steven    schedule 30.11.2009    source источник


Ответы (2)


Я думаю, что отношение многие ко многим поможет вам

что-то типа

--------             -----------------           ------------
- tags -   <-------> - products_tags - <-------> - products - 
--------             -----------------           ------------

редактировать:

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

  1. полностью нормализовалось
  2. DRY: если вам нужно изменить имя тега, вы можете это сделать, и вы увидите изменение везде
  3. и Т. Д.

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

person Gabriel Sosa    schedule 30.11.2009

Я бы сделал что-то вроде этого...

tblAvailableTags
  - tag_id
  - tag_name

tblTasks
  - task_id
  - task_name
  - ...etc

tblTaskTags
  - task_tag_id
  - task_id
  - tag_id

Таким образом, tblTaskTags будет вашим связующим звеном между ними... так что вы можете сделать что-то для эффекта

SELECT * FROM tblTaskTags WHERE task_id = выбранный идентификатор задачи

person the_e    schedule 30.11.2009
comment
Хорошо, но task_tag_id не нужен, потому что task_id+tag_id вместе могут действовать как первичный ключ. - person Tomas; 07.05.2010
comment
это более предпочтительный ответ для меня :) - person Xavier_Ex; 17.12.2012