Я работаю над дизайном базы данных для иерархии групп, используемой в качестве основы для большей системы Каждая группа может содержать другие группы, а также «устройства» в качестве конечных объектов (ничто не идет ниже устройства).
Используемой базой данных является MS SQL 2005. (Хотя работа в MS SQL 2000 была бы плюсом; решение, требующее MS SQL 2008, к сожалению, пока неосуществимо).
Существуют различные типы групп, и они должны быть динамическими и определяемыми пользователями во время выполнения. Например, типами групп могут быть «customer», «account», «city» или «building», «floor», и каждый тип будет иметь свой набор атрибутов, определяемый пользователем. Также будут применяться бизнес-правила - например, «этаж» может содержаться только под «строительной» группой, и, опять же, они могут быть определены во время выполнения.
Большая часть функциональности приложения обеспечивается за счет запуска отчетов на основе этих групп, поэтому необходим относительно быстрый способ получения списка всех устройств, входящих в определенную группу (и все подгруппы).
Хранение групп с использованием модифицированного метода обхода дерева предварительных заказов имеет преимущество в том, что оно быстрое, но недостатком в том, что оно довольно сложное и хрупкое - если внешние пользователи / приложения изменяют базу данных, существует потенциал для полной поломки. Мы также реализуем слой ORM, и этот метод, кажется, усложняет использование отношений в большинстве библиотек ORM.
Использование общих табличных выражений и «стандартное» отношение id / parentid groups, кажется, является мощным способом избежать запуска нескольких рекурсивных запросов. Есть ли недостатки этого метода?
Что касается атрибутов, каков наилучший способ их хранения? Длинный, узкий стол, относящийся к группе? Должен ли общий атрибут, такой как «имя», храниться в таблице групп вместо таблицы атрибутов (в большинстве случаев имя будет единственным, что требуется для отображения)?
Будут ли проблемы с производительностью при использовании этого метода (предположим, что в среднем 2000 групп по 6 атрибутов в каждой и в среднем 10 одновременно работающих пользователей) на разумном оборудовании, например четырехъядерном Xeon 2 ГГц , 4ГБ оперативной памяти, дисконтирование любых других процессов)?
Не стесняйтесь предлагать совершенно другую схему, чем я изложил здесь. Я просто пытался проиллюстрировать проблемы, которые меня беспокоят.