2011-01-20 7 views
0

Excusez-moi pour le long sujet, je n'avais pas l'intention que ce soit aussi long, mais c'est un problème assez simple que j'ai eu. :)Comment stocker ces descriptions de champs dans mysql?

Disons que vous avez une table simple appelée tags qui a les colonnes tag_id et tag. Le tag_id est simplement une colonne d'incrémentation automatique et la balise est le titre de la balise. Si j'ai besoin d'ajouter un champ de description, ce serait environ 1-2 paragraphes en moyenne (max 3-4 paragraphes probablement), devrais-je simplement ajouter un champ de description à la table ou devrais-je créer une nouvelle table appelée tag_descriptions et stocker les descriptions avec le tag_id? Je me souviens avoir lu qu'il est préférable de faire cela parce que si vous faites une requête qui ne sélectionne pas la description, ce champ de description ralentira encore mysql. Est-ce vrai? Je ne me rappelle même pas d'où j'ai lu ça, mais je suis en quelque sorte en train de le suivre depuis quelques années ... Enfin, je me demande si j'ai besoin de faire ça, j'ai le sentiment de ne pas le faire. Vous devez également effectuer une jointure interne chaque fois que vous avez besoin du champ de description.

Une autre question que j'ai, est-il généralement mauvais de créer de nouvelles tables qui ne contiendront que très peu de lignes au maximum? Et si ces données ne correspondent pas ailleurs?

J'ai un cas simple ci-dessous qui se rapporte à ces deux questions.

J'ai trois tables de contenu, les balises et content_tags qui composent une relation plusieurs à plusieurs:

contenu

  • content_id
  • région (colonne ENUM avec environ 6-7 valeurs différentes et la plupart ne se développera probablement pas plus tard)

balises

  • tag_id
  • tag

content_tags

  • content_id
  • tag_id

Je veux stocker une description autour de 1-2 paragraphes pour chaque étiquette, mais aussi pour chaque région. Je me demande quelle serait la meilleure façon de faire cela?

Option A:

  • Il suffit d'ajouter une colonne de description à la table tags
  • Créer une nouvelle table pour region_descriptions

Option B:

  • Créer une nouvelle table appelée descriptions des champs: id, la description et tapez
  • L'id serait id du contenu ou id du champ ENUM
  • Le type serait que ce soit une étiquette description, ou la description de la région (utiliserait la colonne enum pour cela)

Peut-être avoir une clé primaire sur l'ID et le type?

Option C:

  • Créer une nouvelle table pour tag_descriptions
  • Créer une nouvelle table pour region_descriptions

Option A semble être un bon choix si vous ajoutez la colonne de description doesn Ne ralentissez pas mysql select requêtes qui n'ont pas besoin de la description.

En supposant que la colonne de description ralentirait mysql, l'option B pourrait être un bon choix. Il supprime également le besoin d'une petite table avec seulement 6-7 lignes qui contiendraient les descriptions de la région. Bien que maintenant je pense à cela, serait-il lent de se connecter à cette table si à l'origine pour obtenir une description de la région, vous auriez seulement besoin de passer par de très petites lignes.

L'option C serait idéale si les colonnes de description ralentissaient mysql et si une petite table comme les descriptions de régions ne comptait pas.

Peut-être qu'aucune de ces options ne sont les meilleures, n'hésitez pas à proposer une autre option. Merci.

P.S. Quel serait un type de colonne idéal à utiliser pour contenir des données qui habituellement 1-2 paragraphes, mais pourrait être un peu plus parfois?

Répondre

0

Je ne pense pas que ce soit vraiment important si vous ne gérez pas des milliers de requêtes par minute. Si vous allez avoir un zillion de requêtes par minute, alors je voudrais implémenter les différentes options et effectuer des benchmarks pour toutes ces options. Basé sur les résultats, vous pouvez prendre une décision.

0

Dans mon opinion (certes un peu mal informé), cela dépend de combien vous utiliserez les deux.

Si correctement indexé, ce JOIN ne devrait pas être très cher. En outre, une plus grande table sera plus lente. Il inhibe la mise en cache et prend plus de temps pour accéder aux données, bien que l'indexation atténue sérieusement ce problème.

Si vous joignez des noms de balises pour étiqueter BEAUCOUP d'ID et que vous utiliserez rarement les descriptions, je dirais que vous devez utiliser des tables distinctes. Si vous utilisez les descriptions plus souvent, utilisez une table.

0

Pour la première partie de votre question: si vous avez une étiquette avec un identifiant, un nom et une description, vous devez l'enregistrer dans 1 tableau.

Maintenant, cette requête

SELECT name FROM tags WHERE id = 1; 

ne ralentira pas si vous avez 1, 2 ou 20 champs supplémentaires là-dedans.

Questions connexes