MySQL хранит и ищет строку

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

В настоящее время я сохраняю категории как значение VARCHAR в базе данных mysql. Например, поле будет содержать 2,4,8, если пользователь выбрал категории с ID: 2, 4 и 8.

Чтобы получить сообщения в блоге для категории с идентификатором 4, я использую:

SELECT col FROM table WHERE LOCATE(',4,', CONCAT(',',col,','))

Мне сказали, что значения, разделенные десятичной запятой, недопустимы (очень плохо), когда речь идет о хорошей структуре базы данных!

Может ли кто-нибудь предоставить мне хороший способ/метод, чтобы сделать это наиболее эффективным способом?

заранее спасибо


person Kristian    schedule 05.08.2010    source источник


Ответы (2)


Гибкая и надежная настройка, как много раз публиковалось в SO:

POSTS
id
name
text

CATEGORIES
id 
name

POST_CATEGORIES
post_id
category_id

Где текущий запрос будет:

SELECT p.id, p.name, p.text
FROM posts p
JOIN post_categories pc
ON pc.post_id = p.id
AND pc.category_id = 4;
person Wrikken    schedule 05.08.2010

Посмотрите на нормализацию реляционной базы данных. Для вашего конкретного случая рассмотрите возможность создания 2 дополнительных таблиц, категорий и категорий блогов, в дополнение к таблице содержимого вашего блога. Категории содержат определение всех тегов/категорий и ничего больше. Таблица BlogCategories представляет собой таблицу перекрестных ссылок «многие ко многим», которая, вероятно, в вашем случае просто содержит ссылку внешнего ключа на таблицу Blog и ссылку внешнего ключа на таблицу категорий. Это позволяет связать 1 запись в блоге с несколькими категориями и 1 категорию с несколькими записями в блоге.

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

person Tahbaza    schedule 05.08.2010