Введение в рекурсивные структуры
Рассмотрим создание таблицы, реализующей рекурсивную иерархию, на примере данных, описывающих отношения подчиненности между сотрудниками. В таблице emp_mgr необходимо задать как имя сотрудника (emp), так и имя его начальника (mgr). Для рекурсивной связи одна и та же сущность является и родительской, и дочерней. При задании рекурсивной связи атрибут первичного ключа мигрирует в качестве внешнего ключа в состав неключевых атрибутов той же сущности (атрибуты emp – сотрудник и mgr – начальник таблицы emp_mgr). Информация о руководителе содержится в той же сущности, поскольку руководитель – сотрудник той же организации. Связь руководит/подчиняется (fk_emp) позволяет хранить древовидную иерархию подчиненности. Такой вид рекурсивной связи называется иерархической рекурсией и задает связь, когда руководитель (экземпляр родительской сущности) может иметь множество подчиненных (экземпляров дочерней сущности), но подчиненный – только одного руководителя. В среде MS SQL Server создадим таблицу emp_mgr:
CREATE TABLE emp_mgr (emp CHAR(2) PRIMARY KEY, mgr CHAR(2) NULL, NoOfReports INT DEFAULT 0, CONSTRAINT fk_emp FOREIGN KEY (mgr) REFERENCES emp_mgr (emp) )В таблицу введено поле NoOfReports, в котором для каждого сотрудника определено количество его подчиненных.
Для удобства иллюстрации в качестве имени сотрудника и его начальника будут использоваться латинские буквы. Например, ввод данных в таблицу осуществляется операторами:
INSERT INTO emp_mgr(emp,mgr) VALUES('a',NULL)INSERT INTO emp_mgr(emp,mgr) VALUES('b','a')INSERT INTO emp_mgr(emp,mgr) VALUES('c','a')INSERT INTO emp_mgr(emp,mgr) VALUES('d','a')INSERT INTO emp_mgr(emp,mgr) VALUES('e','b')INSERT INTO emp_mgr(emp,mgr) VALUES('f','b')INSERT INTO emp_mgr(emp,mgr) VALUES('g','b')INSERT INTO emp_mgr(emp,mgr) VALUES('i','c')INSERT INTO emp_mgr(emp,mgr) VALUES('k','d')После ввода данных в таблицу emp_mgr оператор SELECT * FROM emp_mgr возвращает следующий результат:
emp mgr NoOfReports------------------------- a NULL 3 b a 3 c a 1 d a 1 e b 0 f b 0 g b 0 i c 0 k d 0Дата добавления: 2015-08-26; просмотров: 796;