2010-10-05 13 views
3

J'ai repris une application qui a un backend SQL. Il y a plusieurs tables, mais les deux que je suis préoccupé sont les suivants:Aide de la conception de table SQL

QAProfile 
--------- 
ProfileID <pk> -int 
ProfileName 
SecurityGroups -varchar(max) 


SecurityGroups 
-------------- 
GroupID <pk> -int 
GroupName 

Mon problème est que le champ de SecurityGroups est une liste délimitée par des virgules des valeurs GROUPID.

Ainsi, la table de profil ressemble à ceci:

-------------------------------------------- 
| ProfileID | ProfileName | SecurityGroups | 
-------------------------------------------- 
| 1  |  foo  | ,1,13,34,56, | 
-------------------------------------------- 
| 2  |  bar  | ,4,13,29,56, | 
-------------------------------------------- 

Un profil peut avoir des groupes de sécurité Muliple et un groupe de sécurité peut être sur les profils Muliple

Toutes les suggestions sur la façon de réorganiser cela?

Répondre

10

Il est bon que vous êtes Nous cherchons à le réorganiser car, en général, les listes séparées par des virgules n'appartiennent pas aux bases de données SQL.

Il ressemble à un simple, junction table peut remplacer la colonne SecurityGroups de la table QAProfile:

CREATE TABLE SecurityGroups_Profiles (
    GroupID  int NOT NULL, 
    ProfileID int NOT NULL, 
    PRIMARY KEY (GroupID, ProfileID), 
    FOREIGN KEY (GroupID) REFERENCES SecurityGroups (GroupID), 
    FOREIGN KEY (ProfileID) REFERENCES QAProfile (ProfileID) 
); 
+0

vôtre est plus agréable, vous avez même ajouté les FK! Je pensais qu'ils pourraient le faire eux-mêmes. – Sage

+0

Je ne suis pas d'accord avec l'affirmation: "les listes séparées par des virgules n'appartiennent pas à la base de données SQL" semble un peu dogmatique - il existe certainement des circonstances où une telle stratégie est grandement bénéfique pour des raisons de performance. – James

+0

@James: Vous avez un point. Ajouté "en général" à cette phrase pour être plus précis. –

1

Oui morceau de gâteau, vous pouvez simplement créer une table de jonction comme ceci:

ProfileSecurityGroups 
--------------------- 
Id, <pk> -int 
ProfileId <fk>, 
SecurityGroupId <fk> 
4

Si elle était moi, je le ferais comme ceci:

QAProfile 
--------- 
ProfileID <pk> -int 
ProfileName 

SecurityGroups 
-------------- 
GroupID <pk> -int 
GroupName 

QASecurityGroups 
---------------- 
ProfileID<pk> 
GroupID <pk> 
2
Create Table QAProfileSecurityGroup (
ProfileID int, 
GroupID int, 
PRIMARY KEY (ProfileID, GroupID) 
) 
1
  • Une nouvelle table ProfileToGroup devrait être ajouté:

    ProfileID GroupID

  • Vous devra écrire un script SQL pour analyser la liste des groupes et insérer des enregistrements dans la nouvelle table pour chaque combinaison de profil/groupe.
  • Enfin, la SecurityGroups colonne dans la table QAProfile doit être retiré
2
  • ajouter la table ProfileSecurityGroups
  • analyser cette chaîne pour chaque profil et ajouter des paires à la table
  • changer la couche d'application à utiliser nouvelle structure
  • tomber la colonne SecurityGroups de la table profil

alt text

+0

Le chemin par-dessus doit vous donner +1 pour fouetter un diagramme! – James