Нормализация базы данных

Я пытаюсь создать небольшое веб-приложение. Приложение предназначено для хранения закладок и их тегов.

закладка: www.javaworld.com
теги: Java, программирование

закладка: www.jquery.com

Теги: Java, веб-приложения

теперь мои критерии поиска основаны на тегах. Если пользователь ищет java, он должен выдать все закладки, которые он сохранил с помощью java. здесь должны быть показаны как www.javaworld.com, так и www.jquery.com.

мои таблицы базы данных выглядят так

Пользователи (UID, Uname, Password)

Закладки (BID, UID, bookmark_url, tag1, tag2, tag3, tag4, tag5)

or

Закладки (BID, UID, закладка)

Теги (TID, BID, Tagname)

здесь BID и TID - суррогатные ключи.

пожалуйста, предложите лучший способ решить эту проблему, учитывая приведенный мной сценарий.


person sundeep    schedule 19.06.2012    source источник


Ответы (2)


Почему бы не сделать что-то похожее на Stackoverflow? Теги являются «глобальными» и не привязаны к одной закладке. Позволяет определять теги без предварительного определения закладок, что повышает гибкость. Также ограничение до 5 тегов, как в вашем первом решении, тоже не является хорошей идеей.

Разделение их, как показано ниже, позволяет вам лучше запускать агрегированные функции (создание облаков тегов), и вы можете использовать таблицу тегов для лучшего отображения тегов в поле флажка / множественного выбора для новых закладок. Было бы неудобно, если бы они уже были привязаны к другой закладке.

Table: User [UID, Uname, PW]

Table: Bookmark [BID, UID, url]

Table: Tag [TID, Tagname]

Table: Bookmark_Tag [BID, TID]
person Khôi    schedule 19.06.2012
comment
Один и тот же URL-адрес с закладкой может использоваться миллионами пользователей - у меня была бы 5-я таблица, в которой идентификатор пользователя сочетается с идентификатором закладки, в противном случае у вас может быть каждый пользователь, дублирующий www.ebay.com (что нарушает правила нормализации) - person JM4; 19.07.2012

Ваше первое решение связано со следующими проблемами:
- у вас есть фиксированное количество тегов: как пользователь может определить шестой тег для своей закладки?
- у вас, вероятно, будет много значений NULL: если в закладке меньше чем 5 тегов, остальные столбцы не будут содержать значений. В таком случае вы, вероятно, потратите память на неиспользуемые столбцы.
- чтобы ускорить механизм поиска, вы должны проиндексировать столбцы, по которым вы хотите выполнить поиск (в вашем случае tag1, .. .tag5): вы должны проиндексировать все 5 столбцов тегов.

По этой причине я предлагаю вам выбрать второе решение, определяя индекс по атрибуту «Tagname» в таблице «Теги». Или, в качестве альтернативы, вы можете включить таблицу тегов, в которой вы определяете каждый тег. В таком случае ваша таблица тегов будет ссылаться на таблицу тегов с использованием числового идентификатора (int) тега.

person Emanuele    schedule 19.06.2012