Должны ли описательные теги, связанные с объектом, храниться в отдельной таблице базы данных? - PullRequest
2 голосов
/ 14 июня 2009

У меня есть модель вопросов, и, как и StackOverflow, пользователь может пометить каждый вопрос несколькими описательными тегами.

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

Или я могу сохранить теги как одно поле таблицы вопросов в виде списка разделенных пробелами строк?

Я не уверен, что имеет больше смысла - есть ли веская причина для разделения данных?

Ответы [ 4 ]

3 голосов
/ 14 июня 2009

Использование строки с разделителями-запятыми для многозначного атрибута является еще одним антипаттерном SQL. : -)

  • Как долго должна быть строка? Другими словами: сколько тегов может иметь данная запись? (Это зависит от длины отдельных тегов.)

  • Как вы учитываете строки, содержащие символ-разделитель? Что если символ, который вы используете в качестве разделителя, становится допустимым символом в теге?

  • Как вы вставляете или удаляете элементы из списка в SQL? (Вы должны извлечь весь список в приложение, разобрать список, отфильтровать его и повторно опубликовать в базе данных.)

  • Как вы можете сделать агрегаты, такие как COUNT(*) в SQL?

  • Как эффективно выполнять поиск всех записей, имеющих общий тег? (Вы должны использовать дорогостоящие запросы на сопоставление с образцом.)

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

3 голосов
/ 14 июня 2009

Разделение тегов в их собственной таблице, а также еще одна таблица со связями «многие: многие» между тегами и вопросами - это то, что известно в реляционном земельном объявлении «нормальной формы». Это упрощает и ускоряет выполнение таких задач, как пометить все вопросы определенным тегом, найти самые популярные теги и т. Д.

(На всякий случай, если вы не знаете - «отношение многие: многие» - это таблица с двумя столбцами [внешний ключ в тегах и один в вопросах] без ограничений уникальности).

1 голос
/ 14 июня 2009

Я бы поместил вопросы в 1 таблицу, теги - в 1 таблицу, и имел бы отдельную таблицу для соединения тегов с вопросами. Это был бы лучший способ построить эту базу данных. Он сохраняет все теги согласованными и значительно снижает избыточность.

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

0 голосов
/ 14 июня 2009

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

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