Comment stocker un tableau en mysql?
Est-il un moyen pour stocker un tableau dans le champ mysql? Je suis de la création d'un commentaire système de notation si je veux stocker les tableaux de codes d'utilisateur pour éviter que plusieurs votes. Je vais créer une table qui contient le commentaire de l'id et le tableau des codes d'utilisateurs qui ont voté sur ce commentaire. Que je vais rejoindre les commentaires de la table et de ce tableau et de vérifier si l'id de l'utilisateur courant existe dans les électeurs tableau ou une note. Si il n'a que le droit de vote des icônes serait désactivé. Je pense que je vais éviter d'utiliser mysql requête dans la boucle de cette façon.
Savez-vous les meilleures façons?
- Je sais que c'est une tâche facile à éviter que plusieurs votes à partir d'un seul utilisateur, mais j'ai besoin d'afficher désactivé icônes pour les utilisateurs qui ont déjà voté sur le commentaire et l'utiliser comme quelques requêtes mysql que possible. Comme je vois que la fonction serialize gérer ce problème...
- Est-il une raison pourquoi tu crois que ça va être difficile si vous utilisez l'approche normalisée?
- Vassallo Que voulez-vous dire en approche normalisée?
- C'est l'approche que @Pekka, @Björn, @Dennis, et moi-même avons suggéré dans les réponses. Nous sommes fondamentalement en suggérant à l'encontre de la sérialisation d'un tableau en une seule base de données de terrain, en faveur de l'utilisation d'une autre table (appelée table d'intersection) pour stocker vos relations. Plus de détails dans les réponses 🙂
- double possible de array dans MySQL
Vous devez vous connecter pour publier un commentaire.
Vous pouvez toujours vous arranger le tableau et la stocker dans la base de données.
PHP Serialize
Vous pouvez ensuite unserialize le tableau en cas de besoin.
Vous pouvez résoudre ce comme suit:
Le composite clé primaire
(comment_id, user_id)
sur le table d'intersectioncomments_votes
permet d'empêcher les utilisateurs de voter plusieurs fois sur les mêmes commentaires.Nous allons insérer des données dans le schéma ci-dessus:
Maintenant, nous allons ajouter un peu de voix pour l'utilisateur 1:
Ci-dessus signifie que l'utilisateur 1 a donné un vote de type 1 sur les commentaires 1 et 2.
Si le même utilisateur tente de voter à nouveau sur l'un de ces observations, la base de données de la rejeter:
Si vous utilisez le InnoDB moteur de stockage, il sera également judicieux de les utiliser clé étrangère contraintes sur la
comment_id
etuser_id
champs de la table d'intersection. A noter toutefois que MyISAM, le moteur de stockage par défaut de MySQL, de ne pas appliquer les contraintes de clé étrangère:Ces clés étrangères garantir qu'une ligne dans
comments_votes
n'auront jamais decomment_id
ouuser_id
valeur qui n'existe pas dans lecomments
etusers
tables, respectivement. Les clés étrangères ne sont pas tenus d'avoir un travail relationnel de la base de données, mais ils sont certainement indispensable pour éviter les liens brisés et de l'orphelin lignes (ie. l'intégrité référentielle).En fait, l'intégrité référentielle est quelque chose qui aurait été très difficile à appliquer si vous devez stocker sérialisé des tableaux dans un seul champ de base de données.
Envisager la normalisation de la structure de la table dans un des commentaires, et un vote séparé de la table.
De la Table "commentaires":
Tableau de "votes":
cela permettrait à un nombre illimité de voix sans avoir à traiter avec les limites d'un champ de base de données.
Aussi, vous pouvez avoir des besoins futurs pour des opérations comme "afficher tous les votes, un utilisateur a coulé", en supprimant spécifique de la voix ou de limiter le nombre maximum de votes par jour. Ces opérations sont morts, facile et rapide à mettre en œuvre avec une structure normalisée, et horriblement lent et complexe dans un tableau sérialisé.
vous devriez avoir trois tables: les utilisateurs, les commentaires et les comment_users.
comment_users a tout juste deux champs: fk_user_id et fk_comment_id
De cette façon, vous pouvez garder vos performances jusqu'à un maximum 🙂
Je préfère de normaliser votre structure de la table de plus, quelque chose comme;
Maintenant, c'est plus facile à maintenir! Et MySQL accepter que seulement un vote par utilisateur et de les commenter.
créer une table comme ça,
De cette façon, vous pouvez vérifier si l'utilisateur a affiché les commentaires ne sont pas..
En dehors de cela il devrait y avoir des tables pour
Comments
etUsers
avec idSi vous venez de stocker les données dans une base de données comme vous le feriez si vous étiez manuellement placer dans un tableau
Puis, quand vous êtes en tirant à partir de la base de données, utilisez l'explode() la fonction
Comme!
Stockage avec json ou sérialisé tableau est la meilleure solution pour l'instant.
Avec certaines situations (coupe "" caractères) json peut-être des problèmes mais sérialiser doit être excellent choix.
Remarque: Si vous modifiez les données sérialisées manuellement, vous devez être prudent sur le nombre de caractères.
Vous pouvez enregistrer votre tableau json.
il existe des documents json type de données: https://dev.mysql.com/doc/refman/5.7/en/json.html
Vous pouvez utiliser le php fonction serialize pour stocker un tableau dans MySQL.
C'est la sortie sera :
Et puis vous pouvez utiliser le php unserialize fonction de décoder les données.
Je pense que vous devriez visiter cette page sur le stockage de la matrice de dans mysql.