Я работаю над дизайном базы данных для иерархии групп, используемой в качестве основы для более крупной системы. Каждая группа может содержать другие группы, а также «устройства» в виде листовых объектов (ничего не происходит ниже устройства).Схема базы данных для иерархических групп
Используемая база данных - MS SQL 2005. (Хотя работа в MS SQL 2000 была бы бонусом, решение, требующее MS SQL 2008, к сожалению, сейчас невозможно).
Существуют различные типы групп, и они должны быть динамическими и определяемыми во время выполнения пользователями. Например, типами групп могут быть «клиент», «учетная запись», «город» или «здание», «пол», и каждый тип будет иметь другой набор атрибутов, определяемый пользователем. Также будут применяться бизнес-правила - например, «пол» может содержаться только под группой «здание», и, опять же, они определяются во время выполнения.
Многие функциональные возможности приложений поступают от запуска отчетов на основе этих групп, поэтому должен быть относительно быстрый способ получить список всех устройств, содержащихся в определенной группе (и всех подгруппах).
Хранение групп с использованием метода modified pre-order tree traversal имеет тот потенциал, что он быстрый, но недостаток, что он довольно сложный и хрупкий - если внешние пользователи/приложения изменяют базу данных, есть потенциал для полного поломки. Мы также реализуем уровень ORM, и этот метод, похоже, усложняет использование отношений в большинстве библиотек ORM.
Использование common table expressions и «стандартное» отношение групп id/parentid представляют собой мощный способ избежать запуска нескольких рекурсивных запросов. Есть ли недостатки в этом методе?
Что касается атрибутов, что их лучше всего хранить? Длинный узкий стол, который относится к группе? Должен ли общий атрибут, например «имя», быть сохранен в таблице групп, вместо таблицы атрибутов (много времени, это будет все, что требуется для отображения)?
Будут ли возникать проблемы с производительностью с использованием этого метода (предположим, что среднее среднее из 2000 групп со средним значением по 6 атрибутов и средними 10 одновременными пользователями на разумном аппаратном уровне, например, четырехъядерный Xeon 2 Ghz, 4GB RAM, дисконтирование любых других процессов)?
Не стесняйтесь предлагать совершенно другую схему, чем то, что я здесь изложил. Я просто пытался проиллюстрировать проблемы, о которых я беспокоюсь.
изложив ожидаемую нагрузку, вы указали количество групп и атрибутов, но не количество ожидаемых элементов в каждой группе. – 2008-09-22 02:21:31