2010-07-02 4 views
1

Je suis simplement curieux de savoir comment créer des tables pour maintenir l'intégrité?Comment maintenir l'intégrité?

tblUserProfile 

UserId 
EyeColorId 
HairColorId 
RelationShipStatusId 

etc.

Chacune de ces valeurs comme EyeColorId a un ensemble de valeurs telles que Brown, Noir, Jaune, Vert. Similaire HairColorId a noir, blond, cramoisi etc et RelationShipStatusId a divorcé, marié, célibataire etc. Devrais-je créer des tables différentes pour chacun d'eux? comme

tblEyeColor 

EyeColorId 
EyeColorCode 

alors: -

tblHairColor 

HairColorId 
HairColorCode 

et aussi continuer à créer des tables? Il y a beaucoup de telles tables (environ 20-25). Si je continue à créer ces tables et à faire des jointures, cela ralentira terriblement mes performances. Comment maintenez-vous tous ce genre de valeurs enum? Devrais-je garder une contrainte de vérification ou dois-je continuer à faire des tableaux?

+0

pas besoin de tables, tous les systèmes RDBMS modernes valant la peine d'utiliser ont la possibilité de mettre des «contraintes de vérification» sur une colonne –

+0

Salut lolli, Vérifiez la contrainte est une bonne idée. Mais imaginez ce qui se passerait si, par exemple, je gardais la contrainte de vérification sur la colonne pour avoir une valeur de {Brown, Black, Hazel}.Disons, maintenant je veux changer la contrainte et en faire {Brown, Black, Yellow}. Cela conduirait à un problème. N'est-ce pas? Par exemple, si la table contient la couleur des yeux avec la valeur Hazel, elle ne me permettra pas de créer de nouvelles contraintes disant que "quelques rangées contiennent du Hazel comme valeur" et cela conduirait à un sérieux problème de maintenance. C'est un cas simple mais je devrai toujours lancer des requêtes de mise à jour. – TCM

Répondre

4

Je dirais que la couleur ressemble à une table unique que les deux les cheveux et les yeux peuvent utiliser. A quel point est-il important pour votre intégrité de faire respecter le fait que personne ne devrait avoir les yeux blonds ou les cheveux bleus?

Certaines personnes vont avec l'idée d'une seule table de recherche, qui aurait un ID, un groupe, et une valeur et peut-être une description pour chaque ligne. L'id et le groupe seraient la clé primaire, donc vous auriez id = 1 et group = 1 pour les cheveux comme la couleur de cheveux BLONDE, id = 1 et group = 2 pour les yeux comme la couleur des yeux HAZEL, etc.

D'autres se moqueraient de cela comme un pauvre design dénormalisé.

Les jointures ne vous ralentiront que lorsque le nombre d'une requête particulière deviendra important. Mon conseil serait de faire une conception normalisée jusqu'à ce que vous ayez quelques données pour suggérer qu'il fonctionne mal. Lorsque cela se produit, établissez le profil de votre application pour savoir où se situe le problème et refactorisez-le ou dénormalisez-le de manière appropriée. Je dirais que l'indexation aura un plus grand impact sur vos performances que ces JOINs. Vous pourriez être coupable d'optimisation prématurée sans données pour le soutenir.

2

Il n'est pas nécessaire de créer des tables si le nombre d'options est fixed Vous pouvez utiliser Enum Type dans votre tableau. par exemple. La colonne EyeColor sera Enum de Black, Brown, Blue

Cependant, je n'ai jamais vu quelqu'un avec Green Eyes. LOL

+0

Qu'est-ce qu'un type enum? Il n'y a pas un tel type de données au moins dans Sql Server ou MySql? – TCM

+0

I donno SqlServer Cependant, dans MySQL, il y a aussi Enum See http://dev.mysql.com/doc/refman/4.1/en/enum.html dans PostgreSQL aussi. Vous pouvez utiliser Enum Functionality http://www.postgresql.org/ docs/8.3/static/functions-enum.html Les énumérations peuvent être traitées de différentes manières dans les Internals de base de données. Mais ce n'est pas une question à cet égard –

+0

"Cependant, je n'ai jamais vu quelqu'un avec des yeux verts LOL" Vraiment? Ce n'est pas rare dans certains endroits. – duffymo

1

C'est la méthode traditionnelle, oui.

La plupart des SGBDR modernes mettent en cache de petites tables telles que ces recherches pendant des périodes prolongées, ce qui atténue les problèmes potentiels de jointure multiple.

De même, vous pouvez précharger toutes les tables de recherche de votre application et les convertir en ID dans le code avant d'accéder à la base de données. De cette façon, vous n'aurez pas besoin de jointures dans vos requêtes.