Как структурировать данные «категории» в базе данных?

#mysql #database #database-design

#mysql #База данных #база данных-дизайн

Вопрос:

У меня есть веб-сайт, для которого я создаю «категории», которые будут работать почти так же, как теги StackOverflow.

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

В чем я не уверен, так это в том, что когда запись содержит n разных категорий, как сохранить это в базе данных. Должен ли я иметь record_ids в таблице элементов, к которой принадлежат категории, и просто разделять их запятой? Или у меня должна быть отдельная таблица с чем-то вроде item_categories с item_id, category_id и т. Д. И Просто объединить эту таблицу и таблицу элементов, а также таблицу категорий при получении категории?

Лестница кажется медленной из-за объединения, но более организованной и чистой.

Или есть другой способ структурировать это, о котором я не подумал? Каков хороший способ структурирования такого рода данных?

Комментарии:

1. Все предлагают создать дизайн таблицы 3. Но меня беспокоит, не приведет ли это к слишком медленному объединению? 🙁

2. Реляционные базы данных довольно хорошо объединяют таблицы, правильно индексируют и не слишком беспокоятся об этом.

3. Я получил запросы с более чем 10 объединениями на рабочем сервере под большой нагрузкой. Обычно это не проблема, если вы создаете правильные индексы. Для личного сайта, возможно, на 100 страницах, каждая из которых содержит пару тегов, беспокоиться вообще не о чем.

Ответ №1:

Сделайте три таблицы. Один для страницы, один для категорий (вместе с метаинформацией и т. Д.) И один для их связывания. Эта последняя таблица должна иметь только идентификатор страницы и идентификатор категории, чтобы связать записи из обеих таблиц вместе.

Никогда не храните значения, разделенные запятыми, в базе данных, если вам нужно использовать их при объединении или поиске.

Ответ №2:

Вы должны использовать отдельную таблицу, как вы говорите. Это называется нормализацией.

Если вы используете столбец со значениями, разделенными запятыми, подумайте о производительности при доступе к значениям по сравнению с выполнением объединения. Вам нужно будет разделить каждое значение, а затем выполнить сравнение, чтобы увидеть, есть ли совпадение.

Ответ №3:

Или у меня должна быть отдельная таблица с чем-то вроде item_categories с item_id, category_id и т. Д. И Просто объединить эту таблицу и таблицу элементов, а также таблицу категорий при получении категории?

Да, это. Это классическая связь M: N в SQL.