2010-10-21 4 views
0

Je construis une application web et je viens de recevoir des données de base du client dans une feuille de calcul. J'ai besoin d'obtenir les données dans une base de données MySQL d'une manière significative afin que je puisse effectivement interroger plus tard. Qu'est-ce qui a le plus de sens? Voici les détails:Conseils sur la structuration ou la normalisation de mes données MySQL nécessaires

Il existe des départements, des classes * éditer (les classes sont des types de produits comme les t-shirts pour hommes, les jeans féminins etc ...) et les vendeurs (et les produits par la suite ...). 25 départements, 300 classes et 3300 vendeurs. Les départements partagent des Classes ainsi que des Vendors dans certains cas.

Mon application Web comportera des pages de service qui afficheront une liste de fournisseurs dont les produits apparaissent dans le service choisi avec un lien vers une page spécifique au fournisseur. La page du vendeur va lister leurs produits triés par classe.

Je pourrais mettre en place 3 ou 4 tables je suppose mais cela résultera-t-il en une requête bien formée et efficace lorsque je construirai mon application? Aussi, cela fera-t-il une base de données normalisée qui évite la mise à jour, supprime les anomalies? Cela pourrait être plus une question de comment sélectionner mes données plutôt que comment structurer ma base de données, mais j'ai pensé que je commencerais par la structure et passerait à l'optimisation de la requête.

+0

Donc les classes sont des catégories de produits? – Stephen

+0

@Stephen, désolé. Oui, les classes sont des types de produits tels que les bottes pour hommes, les bottes de travail pour hommes, les bottes de mode pour dames etc ... – Ofeargall

Répondre

1

Si je suppose bien que les classes sont des catégories de produits, et un produit peut appartenir à une seule classe:

+================================+ +================================+ 
| departments     | | vendors      | 
+----+------+--------------------+ +----+------+--------------------+ 
| id | name | others    | | id | name | others    | 
+====+======+====================+ +====+======+====================+ 

+================================+ +================================+ 
| classes      | | products      | 
+----+------+--------------------+ +----+----------+----------------+ 
| id | name | others    | | id | class_id | name | others | 
+====+======+====================+ +====+==========+================+ 

+================================+ +================================+ 
| departments_vendors   | | classes_departments   | 
+----+----------+----------------+ +----+---------------+-----------+ 
| id | department_id | vendor_id | | id | department_id | class_id | 
+====+==========+================+ +====+===============+===========+ 

+================================+ 
| products_vendors    | 
+----+------------+--------------+ 
| id | product_id | vendor_id | 
+====+============+==============+ 

Si les produits peuvent appartenir à plusieurs classes, déposer la colonne class_id et de faire une nouvelle table appelée classes_products. En supposant la structure ci-dessus, voici un exemple de requête.

Obtenir un département, que les classes de service et des produits pour ces classes:

SELECT departments.id AS DepartmentId, 
      departments.name AS DepartmentName, 
      classes.id  AS ClassId, 
      classes.name  AS ClassName, 
      products.id  AS ProductId, 
      products.name AS ProductName 
FROM  departments 
LEFT JOIN classes_departments 
     ON classes_departments.department_id = departments.id 
LEFT JOIN classes 
     ON classes.id = classes_departments.class_id 
LEFT JOIN products 
     ON products.class_id = classes.id 
WHERE  departments.id = ## 

La meilleure façon d'obtenir une liste de fournisseurs qui vendent des produits d'une classe pour un ministère serait de faire une autre table appelée

+0

Cela vous propose de créer 7 tables, correct? Est-ce le meilleur choix pour l'évolutivité et la normalisation des données? Je suis assez nouveau pour les données relationnelles que je ne sais pas vraiment à coup sûr. Je veux juste le garder aussi simple que possible afin de ne pas avoir de problèmes plus tard ... – Ofeargall

+0

D'après mon expérience, la normalisation la plus simple devrait se concentrer sur les objets et les relations. Vous avez 'Departments',' Vendors' et 'Products'. Les Classes ne sont pas aussi tangibles, mais puisque vous en avez 300, elles devraient être dans leur propre table. C'est quatre. Ensuite, vous devez regarder les relations. pour une relation One-> HasMany, mais une clé étrangère du parent dans les tables des enfants ('class_id' dans' Products'). Pour les relations spéciales qui peuvent être partagées dans les deux sens (connue sous le nom de HABTM ou "A et appartient à beaucoup"), comme les départements et les classes, une table de jointure est la meilleure/la plus simple pour la stocker. – Stephen

+0

Il est possible que mes relations ne correspondent pas exactement à ce que vous avez en tête. Vous aurez besoin de formuler comment chaque objet sera lié (Peut-être que les produits peuvent avoir plus d'une classe, et si c'est le cas, il devrait y avoir une nouvelle table pour définir cette relation HABTM). Une fois que vous savez comment chaque pièce se rapporte, vous pouvez déterminer les tables dont vous avez besoin. – Stephen

Questions connexes