2010-11-17 6 views
1

J'ai une table MySQL, chaque ligne représentant une personne. Pour chaque personne que je voudrais montrer une liste de liens connexes (lors de la génération de sa page sur mon site), donc je créé une colonne appelée « RelatedLinks » qui là j'enregistrer le contenu HTML brut tels que:Enregistrement de plusieurs attributs dans une seule ligne MySQL

<a href="domain1.com">Related Link 1</a> <a href="domain2.com">Related Link2</a> 

Ensuite, Je viens d'utiliser PHP pour echo $row["RelatedLinks"]; dans le HTML lui-même.

Le problème avec cette implémentation est que j'ai peu de contrôle sur les liens, par exemple en changeant leur ordre d'apparition sur le site, en supprimant/éditant un lien spécifique et ainsi de suite.

La deuxième idée que je pensais était de créer une colonne dans la table pour chaque lien associé, tels que « RelatedLink1 », « RelatedLink2 », puis utiliser PHP pour faire écho $row["RelatedLink1"] . "<br />" . $row["RelatedLink2"].

Bien que je n'ai beaucoup plus de contrôle avec cette mise en œuvre, je pense que je crée un gros frais généraux dans la table.

Qu'est-ce qu'un moyen efficace pour réaliser cette fonctionnalité?


EDIT

Se référant à la réponse de Gabriel, la question est maintenant de la complexité:

Avec l'implémentation actuelle, une fois que je choisis la personne que j'ai tous les liens dans ma main - complexité de O (1). Quelle sera la complexité d'exécuter une requête pour sélectionner toutes les clés étrangères de la personne actuelle, comme suggéré par Gabriel (et Haim) ci-dessous?

Merci,

Joel

+2

vous devez enregistrer tous ces liens dans une nouvelle table avec référence à personID –

+0

Haim est droit. S'il vous plaît ne commencez pas à ajouter plus de colonnes. Normaliser la configuration de votre base de données, il suffit d'enregistrer le nom du lien et le lien lui-même et lui donner une référence à l'entrée de l'utilisateur. – aefxx

+0

Question éditée – Joel

Répondre

1

Si vous voulez seulement stocker et afficher les liens et les actions d'édition sont très peu, la première option est la meilleure. Dans ce cas, vous devrez sauvegarder les nouvelles valeurs lors de l'édition.

Si vous pensez que vous aurez plus d'opérations d'édition, vous pouvez essayer de créer une deuxième Tabel, pour contenir id_pearson, lien, texte, ordre. Et vous pouvez utiliser ce tabel pour éditer les liens pour un pearson spécifique.

De même, si vous avez besoin du même lien pour deux personnes ou plus, il est préférable d'utiliser 3 tables.

personnes Table: id_person, nom (et toutes autres informations)

Tableau des liens: id_link, texte, lien

person_links: id_person, id_link, ordreEn utilisant cette configuration, vous pouvez éditer les liens en un seul endroit, et toutes les personnes auront accès à la même version.

PLUS TARD EN RÉPONSE À MODIFIER COMMENTAIRE

Okey, en ce qui concerne la complexité des opérations, rien ne pouvait battre la première solution. Mais vous devez prendre en compte plusieurs choses concernant ce dont vous avez besoin:

  • à quelle fréquence vous attendez-vous à changer les liens?
  • qui est parti changer les liens (l'administrateur du site, ou l'utilisateur final)?
  • combien de cas du même lien apparaisse pour différentes personnes (en utilisant la première solution, vous devrez modifier toutes les personnes qui contiennent ce lien)

Pour répondre à votre question de la complexité, les solutions proposées par moi O (n) si je ne me trompe pas. En utilisant des clés étrangères et une indexation correcte dans MySQL, vous ne devriez pas avoir de problème avec cela. Résumé: Si les performances sont très importantes pour vous et les liens ne seront modifiés que par l'administrateur, utilisez la première solution. Sinon, j'utiliserais le troisième.

Hope this helps, Gabriel

+0

Merci Gabriel! Dans ce contexte, vous pouvez me référer à mon suivi des commentaires de Haim sur mon post. C'est aussi pertinent pour votre solution :) – Joel

+0

Bonjour, la complexité sera O (n) je crois. Plus de détails dans ma réponse. –

1

Vous avez besoin d'une table secondaire qui contient un PersonID (foreign Key), RelatedLink(ID) et peut-être un OrderID.

Quelque chose comme

Table PersonRelatedLinks 
PersonID 
RelatedLink or RelatedLinkID 
OrderID 
SpecialFormat maybe 
Questions connexes