Эффективное хранение и поиск данных категории в теги

У меня есть следующая ситуация в моем проекте. Некоторые значения тегов связаны с одной категорией.

Пример:

Fruits : Apple, Banana, Grape
Vegetables: Tomato, Cabbage, Brinjal

Теперь для этого я использую простую таблицу в базе данных с двумя столбцами, Category, Tag, и я храню «Фрукты» в столбце Category и «Яблоко, банан, виноград» в столбце Tag (каждый тег разделен запятой). И когда я запрашиваю одну категорию, используя простой оператор SQL, такой как select tag from TagsCollection where category='Fruits';, я получаю строку со всеми тегами, принадлежащими категории «Фрукты». Обратите внимание, что таблица будет иметь только один экземпляр любой конкретной категории в качестве записи. И чем мне нужно, чтобы все теги были разделены для дальнейшей обработки, поэтому я разбиваю строку на запятые в моем языке программирования (Java, здесь).

Теперь, что может быть идеальным способом реализовать что-то подобное? следует ли мне использовать RDBMS-способ хранения (точнее, MySQL) или есть какой-либо другой более быстрый способ хранения и извлечения данных такого типа.


person Kushal    schedule 03.04.2012    source источник


Ответы (2)


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

В нормализованном дизайне столбцы «Категория» и «Тег» останутся, но для каждой комбинации «Категория» и «Тег» будет отдельная строка, например:

Category  Tag
Fruits    Apple
Fruits    Banana
Fruits    Grape
...
person Community    schedule 03.04.2012
comment
Я намеренно использовал атрибут с несколькими значениями, игнорируя любые нормальные формы, в надежде получить лучшее решение. Таким образом, сохранив его таким образом, я могу использовать что-то вроде HashTable для каждой категории на фронте программирования для эффективного сопоставления. Однако есть ли какой-либо способ хранения такой информации без базы данных? какой-то XML? (не знает о хранилищах на основе XML) - person Kushal; 03.04.2012

Это зависит от ожидаемого размера вашей базы данных и, в частности, от таблицы TagsCollection.

Вы можете выбрать любой дизайн СУБД, если вы не ожидаете огромного количества записей (под огромным я имею в виду миллиарды записей и десятки или сотни запросов в секунду), или выбрать систему NoSQL, одну из:

person vyegorov    schedule 03.04.2012