2010-11-19 27 views
1

J'ai donc une table des comptes utilisateurs (Utilisateurs). Il doit y avoir une fonctionnalité en place pour les sous-comptes. Par exemple, une société nommée Dunder Mifflin pourrait avoir un compte. Par exemple, une société nommée Dunder Mifflin pourrait avoir un compte. La société aura sous-comptes, comptabilité et ventes. Le compte de comptabilité aurait sous-comptes pour Kevin, Angela et Oscar. Et il n'y a pas de limite sur le nombre de niveaux.Aide à la conception de base de données - données hiérarchiques

Mon idée initiale était de créer une table comme ceci:

CREATE TABLE Users 
(
    UserID INTEGER, 
    ParentUserID INTEGER, 
    ... 
) 

Lorsqu'un ParentUserID de compte principal serait tout simplement nul, mais un sous-compte contiendrait le UserID de son parent.

Est-ce un bon design pour cela? Je ne connais pas d'autre moyen.

+0

Semble juste pour moi. – rwilliams

+0

C'est une bonne approche. Le design s'appelle Adjacency List. Les expressions de table communes dans SQL Server en font une approche relativement simple pour le problème que vous tentez de résoudre. Pour en savoir plus sur la représentation des hiérarchies dans les bases de données, consultez cette question: http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-in-a-relational-database – orangepips

Répondre

2

C'est un bon design et vous n'avez vraiment pas d'autre choix. Lisez sur le sujet CTEs (Common Table Expressions) qui vous aidera à interroger cette relation hiérarchique (récursive.)

récursif des structures interrogation hiérarchiques était possible dans Sql Server 2000 mais est beaucoup plus simplifié avec CTEs depuis 2005.

Une table qui se joint à lui-même ressemblera à quelque chose comme ceci dans votre concepteur: Self Join Cap

+0

CTE <==> Expression de table commune? – John

+0

@John: Oui, merci. Réponse mise à jour –

+0

Merci pour ça! – John

4

c'est un bon design pour cela. Une alternative consiste à utiliser le type de données HIERARCHID pour mapper la hiérarchie, mais la prise en charge est limitée (reporting, outils ORM, etc.).

En fait, j'utilise EXACTEMENT ceci dans un certain nombre de configurations. Il n'y a tout simplement pas trop d'alternatives qui ne sont pas évidemment dump (comme avoir des champs X pour la hiérarchie). Je ne connais pas d'alternative unique.

+0

ID de hiérarchie avoir un support d'outil limité, mais une fois que vous avez appris la syntaxe, il fournit des options de requête très utiles, en particulier dans le contexte d'une hiérarchie avec des niveaux illimités. –

2

Cela s'appelle une auto-jointure et, oui, c'est la manière standard de représenter des données hiérarchiques. Vous aurez probablement besoin de faire une requête comme this pour obtenir quelque chose comme tous les utilisateurs associés à Dunder Mifflin.

0

À quoi servent les sous-comptes? La conception de base de données est une affaire sérieuse. Les réponses précédentes affirment que la conception que vous démontrez est bonne par définition. Lorsque vous avez des données hiérarchiques, oui, vous avez toujours un ID parent. Cependant, très souvent, vous avez une sorte de compte de groupe auquel appartiennent les comptes. Ce serait un endroit plus approprié pour établir une hiérarchie.

+0

Donc, vous auriez une table de compte hiérarchique et vous auriez une table des utilisateurs qui aurait une clé étrangère se référant à la table des comptes. – Nickolodeon