2009-12-18 5 views
0

Je restructure une base de données MySQL MySQL où les différentes sections principales sont séparées en tables séparées. Par exemple, les articles en vente ont leur propre table avec des ID uniques, les emplois ont leur propre table avec des ID uniques, les rencontres ont aussi leur propre table.Annonces efficientes Mysql Structure

Ces sections partagent quelques caractéristiques communes:

-id
-title
-Corps
état -listing
-Poster
email -Répondez
Date -posting

Mais ils ont chacun des informations distinctes requises:

-Chaque ont différents ensembles et des arbres de catégories au choix (qui affectent la structure nécessaire pour les stocker)
-jobs doivent stocker des choses comme le salaire, la date de début, etc.
articles -Vente besoin de stocker des choses comme Par conséquent, est-ce une meilleure pratique pour refactoriser la DB alors que je peux à une table universelle pour stocker TOUTES les informations générales d'inscription indépendamment de la section, et ensuite confier le stockage de données personnalisé aux petites tables, ou est-il préférable de laisser la structure actuelle seule et de laisser les sections séparées?

Répondre

0

N'utilisez pas une seule table. Aller relationnel. Ce que je recommanderais de mettre en place est une relation dite polymorphe entre votre table "principale" (celle avec les caractéristiques communes), et trois tables contenant des informations spécifiques. La structure ressemblerait à quelque chose comme ceci:

Table principale

  • id
  • titre
  • ...
  • nom_catégorie (VARCHAR ou CHAR)
  • category_id (ENTIER)

Catégorie Table

  • id
  • (colonnes spécifiques)

Le champ category_name doit contenir le nom de la table de la table de catégorie spécifique, par exemple.'job_category', tandis que category_id doit pointer sur ID dans la table des catégories. Un exemple ressemblerait à ceci:

# MAIN TABLE 
id | title   | ... | category_name | category_id 
------------------------------------------------------- 
123 | Some title | ... | job_category | 345 
321 | Another title | ... | sale_category | 543 

# SPECIFIC TABLE (job_category) 
id | ... 
--------- 
345 | ... 

# SPECIFIC TABLE (sale_category) 
id | ... 
--------- 
543 | ... 

Maintenant, chaque fois que vous interrogez la table principale, vous saurez immédiatement quelle table pour récupérer les données supplémentaires de, et vous saurez l'ID dans ce tableau. Le seul inconvénient de cette approche est que vous devez effectuer deux requêtes distinctes pour récupérer des informations pour un seul élément. Il serait probablement possible de le faire dans une transaction, cependant.

Pour récupérer des données dans l'autre sens (par exemple, vous recherchez la catégorie jobs_category pour quelque chose), d'autre part, vous pouvez récupérer les données associées à partir de la table principale avec un JOIN. N'oubliez pas de joindre non seulement main.category_id = jobs_category.id, mais aussi d'utiliser la colonne category_name comme condition de jointure. Sinon, vous pouvez récupérer des données appartenant à l'une des autres catégories.

Pour des performances optimales, vous pouvez indexer les colonnes category_name et category_id. Cela accélérerait généralement toutes les requêtes qui rejoindraient les deux tables, comme décrit dans le paragraphe précédent.

Espérons que cela aide!

2

On dirait que ce sont des entités distinctes qui n'ont rien à voir l'une avec l'autre (ecxept pour partager certaines définitions de colonnes), n'est-ce pas?

Voulez-vous jamais faire un SELECT comme

SELECT * 
FROM main_entity 
WHERE entity_type IN ('SALE_ITEM', 'JOB', 'PERSONAL')? 

Sinon, je ne pense pas que je les fusionner en une seule table.