Я бы предложил использовать иерархию , что в 2008 году. Вы бы по существу установили свою иерархию следующим образом
/ 1 / - Root Node / 1/1 / - Мотоциклы / 1/ 1/1 / - Япония / 1/1/1/1 / - Kawasaki / 1/1/1/2 / - Honda / 1/1/2 / - US / 1/1/2/1 / - Harley.
Затем вы можете использовать иерархию, чтобы получить все дерево от вашего кавасаки 600 куб. См 1984 года вплоть до мотоциклов.
Вот пример кода из программирования Microsoft SQL Server 2008
CREATE FUNCTION dbo.fnGetFullDisplayPath(@EntityNodeId hierarchyid) RETURNS varchar(max) AS
BEGIN
DECLARE @EntityLevelDepth smallint
DECLARE @LevelCounter smallint
DECLARE @DisplayPath varchar(max)
DECLARE @ParentEmployeeName varchar(max)
-- Start with the specified node
SELECT @EntityLevelDepth = NodeId.GetLevel(),
@DisplayPath = EmployeeName
FROM Employee
WHERE NodeId = @EntityNodeId
-- Loop through all its ancestors
SET @LevelCounter = 0
WHILE @LevelCounter < @EntityLevelDepth
BEGIN
SET @LevelCounter = @LevelCounter + 1
SELECT @ParentEmployeeName = EmployeeName
FROM Employee WHERE NodeId = (SELECT NodeId.GetAncestor(@LevelCounter)
FROM Employee
WHERE NodeId = @EntityNodeId)
-- Prepend the ancestor name to the display path
SET @DisplayPath = @ParentEmployeeName + ' > ' + @DisplayPath
END
RETURN(@DisplayPath)
END
My / 1/1/2 представление является строковым представлением.В базе данных вы фактически увидите шестнадцатеричное представление (например, 0x79).
В иерархии есть несколько ключевых функций.
declare @motorcycleAncestor hieararchyid
select @motorcycleAncestor = nodeId.GetAncestor(1)
from parts
where Label = 'motorcycle'
select * from Parts
where Node.GetAncestor(1) = @motorcyleAncestor;
Этот запрос делает несколько вещей.Во-первых, он получает идентификатор иерархии для узла, который содержит «Мотоцикл» в качестве метки.(Я предполагаю, что поле hiearchy называется 'nodeid', но вы, очевидно, можете называть его как угодно.)
Далее, оно принимает значение этого узла и находит всех непосредственных потомков мотоциклов (чей предок, 1 уровень вверх, естьузел мотоцикла. На самом деле вы можете указать любое значение, например, GetAncestor (3) будет на 3 уровня выше предка).Таким образом, в этом случае он найдет Японию, США, Германию и т. Д.
Существует еще один метод, называемый IsDescendantOf ( node ).Вы можете использовать его так:
declare @motorcycleAncestor hieararchyid
select @motorcycleAncestor = nodeId.GetAncestor(1)
from parts
where Label = 'motorcycle'
select * from Parts
where Node.IsDescendantOf(@motorcycleAncestor) = 1
Это вернет все предметы, которые являются детьми (любого уровня) под мотоциклами.На самом деле это также включает мотоциклы.
Вы можете комбинировать их по-разному.Например, мы используем их в своего рода оргструктуре.У нас есть возможность показать результаты для одного пользователя или для пользователя и его братьев и сестер (все на одном уровне), а также для пользователя и всех его потомков.
Чтобы я мог показать вашу информацию, или ямог бы показать всех в вашем отделе, или я мог бы показать всех в вашей компании.