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

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

2 голосов
/ 06 августа 2010

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

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

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 06 августа 2010

Гибкая и надежная настройка, как много раз публиковалось в 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;
0 голосов
/ 06 августа 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...