Ответ 1
Во-первых, пользовательский интерфейс: как пользователь я ненависть для поиска продукта в каталоге, организованном строго иерархическим способом. Я никогда не помню, в какой суб-суб-sub-sub... категории есть "экзотический" продукт, и это заставляет меня тратить время на изучение "перспективных" категорий, чтобы обнаружить, что оно классифицировано в (для меня, по крайней мере ) странный путь.
Что Кевин Пено предлагает хороший совет и известен как граненый просмотр. Как Марсия Бейтс написала в После Dot-Bomb: Получение информации в Интернете В настоящее время "Поиск прав" , "... классифицированная классификация относится к иерархической классификации, поскольку реляционные базы данных относятся к иерархическим базам данных...".
В сущности, фасетный поиск позволяет пользователям выполнять поиск в вашем каталоге, начиная с любого "фасета", который они предпочитают, и позволять им фильтровать информацию, выбирая другие грани вдоль поиска. Обратите внимание: вопреки тому, как обычно задумываются системы тегов, ничто не мешает вам организовать некоторые из этих граней иерархически.
Чтобы быстро понять, что такое грандиозный поиск, есть некоторые демо, чтобы исследовать Проект интерфейса поиска фламенко - интерфейсы поиска, которые передаются.
Во-вторых, логика приложения:, которую предлагает Manitra, также является хорошим советом (как я понимаю), т.е. разделяя nodes
и links
дерева/графика в разных отношениях. Однако он называет "таблицу предков" (которая является гораздо более понятным именем) транзитивное закрытие ориентированного ациклического графа (DAG) (отношение достижимости). Помимо производительности, он значительно упрощает запросы, как сказал Манитра.
Но Я предлагаю view для такой "таблицы предков" (транзитивное закрытие), так что обновления выполняются в режиме реального времени и инкрементно, а не периодические с помощью пакетного задания. Существует код SQL (но я думаю, что он должен немного адаптироваться к конкретным СУБД) в документах, которые я упомянул в ответе на язык запросов для наборов графиков: вопрос моделирования данных, В частности, посмотрите Поддержание транзитивного закрытия графиков в SQL (.ps - postscript).
Соотношения продуктов и категорий
Первой точкой Манитра также стоит подчеркнуть.
То, что он говорит, заключается в том, что между продуктами и категориями существует отношение "многие ко многим". I.e.: каждый продукт может быть в одной или нескольких категориях и в каждой категории может быть ноль или более продуктов.
Указанные переменные отношения (relvars) Продукты и категории, такие отношения могут быть представлены, например, как рекурр-ПК с, по меньшей мере, атрибутами P # и С#, то есть номера продуктов и категорий (идентификаторы) в отношениях внешнего ключа с соответствующими Номера продуктов и категорий.
Это дополняет управление иерархиями категорий. Конечно, это всего лишь эскиз дизайна.
На гранжевом просмотре в SQL
Полезной концепцией реализации "граненного просмотра" является реляционное разделение или даже реляционные сравнения (см. нижнюю часть связанной страницы). То есть разделяя ПК (Продукты-Категории) на (растущий) список категорий, выбранных пользователем (фасетная навигация), то получается только продукты в таких категориях (конечно, категории считаются не все взаимоисключающими, в противном случае выбирая две категории, получим нулевые произведения).
СУБД на базе SQL обычно не хватает этих операторов (разделение и сравнение), поэтому я приводил ниже некоторые интересные статьи, которые реализуют/обсуждают их:
- ВКЛЮЧИТЬ ОТНОШЕНИЕ ОТНОШЕНИЙ ОТНОШЕНИЙ ОТНОШЕНИЙ ОТНОШЕНИЙ ОТНОШЕНИЙ (.pdf от FIE 2003 Индекс сеанса);
- Более простой (и лучший) подход SQL к реляционному подразделению (.pdf из журнала "Образование информационных систем" - Содержание Том 13, Номер 2 (2002));
- Обработка запросов об обнаружении частых наборов элементов с помощью деления и установки операторов объединения в контейнеры;
- Законы для переписывания запросов, содержащих операторов отдела;
- Алгоритмы и приложения для универсальной квантификации в реляционных базах данных;
- Оптимизация запросов с универсальной квантификацией в объектно-ориентированных и объектно-реляционных базах данных;
- (требуется ACM-доступ) О сложности разделения и набора объединений в реляционной алгебре;
- (требуется ACM-доступ) Быстрые алгоритмы для универсальной квантификации в больших базах данных;
и т.д.
Здесь я не буду вдаваться в подробности, но взаимодействие между иерархиями категорий и просмотром фасетов требует особого внимания.
Отклонение от "плоскостности"
Я кратко рассмотрел статью, связанную с Pras, Управление иерархическими данными в MySQL, но я прекратил читать после этих нескольких строк во введении:
Введение
Большинство пользователей в тот или иной момент имеют рассмотрены иерархические данные в SQL базы данных и, без сомнения, управление иерархическими данными не какая реляционная база данных для. Таблицы реляционной база данных не является иерархической (например, XML), но это просто плоский список. Иерархические данные имеют родительский-родительский отношений, которые не являются естественными представленный в реляционной базе данных Таблица....
Чтобы понять, почему эта настойчивость в отношении плоскостности отношений просто бессмыслица, представьте себе куб в трехмерной декартовой системе координат: он будет идентифицирован по 8 координатам (триплетам), например P1 (x1, y1, z1), P2 (x2, y2, z2),..., P8 (x8, y8, z8) [здесь мы не связанные с ограничениями на эти координаты, так что они действительно представляют собой куб].
Теперь мы поместим этот набор координат (точек) в переменную отношения и назовем эту переменную Points
. Мы будем представлять значение отношения Points
в виде таблицы ниже:
Points| x | y | z | =======+====+====+====+ | x1 | y1 | z1 | +----+----+----+ | x2 | y2 | z2 | +----+----+----+ | .. | .. | .. | | .. | .. | .. | +----+----+----+ | x8 | y8 | z8 | +----+----+----+
Этот куб "сплющивается" простым актом представления его в виде таблиц? Является ли отношение (значение) тем же, что и его табличное представление?
Переменная отношения принимает значения в виде наборов значений точек в n-мерном дискретном пространстве, где n - число атрибутов отношения ( "столбцы" ). Что означает, что для n-мерного дискретного пространства должно быть "плоским"? Просто абсурд, как я писал выше.
Не поймите меня неправильно. Конечно, SQL - это плохо спроектированный язык и что SQL-базирующиеся СУБД полны особенностей и недостатков (NULL, избыточность,...), особенно плохих, СУБД -s-dumb-store (без ссылочных ограничений, ограничений целостности,...). Но это не имеет ничего общего с реляционными данными, фантазированными ограничениями, наоборот: больше они отворачиваются от него и хуже - результат.
В частности, реляционная модель данных, как только вы ее понимаете, не представляет проблемы в представлении любой структуры, даже иерархии и графиков, как я подробно описал со ссылками на опубликованные работы, упомянутые выше. Даже SQL может, если вы замаскируете свои недостатки, пропадает что-то лучше.
В разделе "Вложенная модель набора"
Я просмотрел оставшуюся часть в этой статье, и я не особенно впечатлен таким логическим дизайном: он предлагает путать два разных объекта, узлы и ссылки, в одно отношение, и это, вероятно, вызовет неловкость. Но я не склонен анализировать этот дизайн более тщательно, извините.
EDIT: Стефан Эггермонт возразил в комментариях ниже: "Плоская модель списка - это проблема. Это абстракция реализации, которая затрудняет достижение производительности...".
Теперь я хочу сказать, что:
- эта "модель плоского списка" - это фэнтези: только потому, что одно изложение (представляет) отношения как таблицы ( "плоские списки" ) не означает, что отношения являются "плоскими списками" ( "объект" и его представления не одно и то же);
- логическое представление (отношение) и физические данные хранения (горизонтальные или вертикальные разложения, сжатие, индексы (хеши, b + дерево, r-дерево,...), кластеризация, разбиение на разделы и т.д.) различны; одна из точек реляционной модели данных (RDM) состоит в том, чтобы отделить логику от "физической" модели (с преимуществами как для пользователей, так и для разработчиков СУБД);
- производительность является прямым следствием физических данных хранения (реализации) и не логического представления (комментарий Eggermont является классическим примером логико-физическая путаница).
Модель RDM не ограничивает реализацию каким-либо образом; один может свободно вводить кортежи и отношения, как можно видеть. Отношения не обязательно. Файлы и кортежи - это не обязательно записи файла. Такое соответствие является немой реализацией прямого изображения.
К сожалению, реализация СУБД на основе SQL , слишком часто, нечеткие реализации прямого образа и они страдают низкой производительностью во множестве сценариев - OLAP/Продукты ETL существуют для устранения этих недостатков.
Это медленно меняется. Существуют коммерческие и бесплатные программы/версии с открытым исходным кодом, которые, наконец, избегают этой фундаментальной ловушки:
- Vertica, который является коммерческим преемником..
- C-Store: ориентированная на столбцы СУБД;
- MonetDB;
- LucidDB;
- Kdb в некотором роде;
- и так далее...
Конечно, точка не, что должен существовать "оптимальный" физический дизайн хранилища, но что любой дизайн физической памяти может быть абстрагирован красивым декларативным языком, основанным на реляционной алгебре/исчислениях (а SQL - пример плохой) или более непосредственно на языке логического программирования (например, Prolog, см. мой ответ на пролог в SQL-конвертер "). Хорошей СУБД должно быть изменение дизайна физической памяти" на лету" на основе статистики доступа к данным (и/или подсказок пользователя).
Наконец, в Eggermont комментирует утверждение: "Реляционная модель сжимается между облаком и предиэлером". Это еще одна бессмыслица, но я не могу дать опровержения здесь, этот комментарий уже слишком длинный.