2016-02-02 4 views
1

У меня есть небольшая проблема, определяющая правильную структуру данных для одной из моих проблем на работе. Я должен создать «дерево структуры компании». Короче говоря, кто-то является боссом всех боссов (поэтому он является первым (или нулевым) уровнем дерева), а затем есть остальные рабочие, но, как вы знаете, кто-то может быть кем-то elses boss и т. Д. Дерево должно пройдите максимум 5 уровней. Я не знаю, как это создать, даже с точки зрения базы данных.Выбор правильной структуры данных для дерева компании

Я уже пробовал пользовательские ViewModels и некоторые словари, но я чувствую, что для этого есть рабочий путь, который не включает в себя 5-уровневый вложенный словарь или список.

Если кто-нибудь знал, как это сделать, любая помощь будет принята с благодарностью.

Cheers.

ответ

2

Я предлагаю вам использовать Foreign Key автореферентное на столе сотрудников

Employees 

| ID | Name | ManagerID | 
|-------|-------|-----------| 
| 1  | Tom | NULL  | 
| 2  | Andy | 1   | 
| 3  | Heidi | 2   | 

Где ManagerID внешний ключ на ID.

Преимущества:

  • Вы не ограничены 5 уровней
  • Вы можете иметь несколько корневой записи
  • Этот принцип является appicable также других автореферентными структур, таких как меню деревьев и т.д.
  • Простота продления, если вам нужно n: n соединение, вы можете пойти ненормализованным (только с разделителями с точкой с запятой в поле 1, 2) или нормализовать с помощью собственного кросс-таблицы.
1

Что об этой структуре:

CREATE TABLE Employee (
    [Id] NOT NULL IDENTITY(1,1) PRIMARY KEY, 
    [Name] VARCHAR(250), 
    ... 
    [Supervisor] INT NULL FOREIGN KEY REFERENCES Employee([Id]) 

) 

Nullable супервизор означает, что это корень дерева. С точки зрения C# это может быть представлено Composite Pattern - объект содержит список объектов, разделенных одним и тем же интерфейсом (в нашем случае точный тип).

+0

Итак, в основном я могу использовать это в таблице «Мои пользователи» и ссылаться на супервизора на себя, не создавая другую таблицу? – drajvver

+0

Точно. Это также имеет преимущество наличия нескольких репортёров. – Fka

0

С нашей базы данных Common Table Expression (CTE) - это то, что вам нужно. Также посмотрите на this.

И на стороне интерфейса вы можете использовать D3 tree. Примечание D3 имеет кривую обучения, но ее ценность. Возьмите look at this.

+0

Я не думаю, что он просит конкретную структуру реализации, а скорее для правильного способа создания слоя данных. Кроме того, зачем предлагать библиотеку javascript, когда он, очевидно, только начинает с C#? – KarmaEDV

0

Это простая структура json. Я знаю, что вы имеете дело с C#, но делать это в mongodb или какой-нибудь другой nosql будет очень быстро.