2010-08-05 9 views
42

Y at-il un moyen de stocker un tableau dans le champ mysql? Je suis en train de créer un système d'évaluation des commentaires, donc je veux stocker les tableaux d'identifiants des utilisateurs pour éviter les votes multiples. Je vais créer une nouvelle table qui contient l'identifiant du commentaire et le tableau des ID utilisateur qui ont voté sur ce commentaire. Que je vais rejoindre la table des commentaires et cette table et vérifier si l'ID de l'utilisateur actuel existe dans le tableau ou la note des électeurs. Si c'est le cas, les icônes de vote seraient désactivées. Je pense que je vais empêcher d'utiliser mysql query en boucle de cette façon.Comment stocker un tableau dans mysql?

Connaissez-vous de meilleurs moyens?

+0

Je sais qu'il est une tâche facile à éviter que plusieurs votations d'un utilisateur, mais je dois afficher les icônes désactivées pour les utilisateurs qui ont déjà voté sur le commentaire particulier et utiliser aussi peu mysql requêtes que possible. Comme je vois la fonction sérialiser traitera ce problème ... –

+0

Y at-il une raison pour laquelle vous pensez que ce sera difficile si vous utilisiez l'approche normalisée? –

+0

@Daniel Vassallo Que voulez-vous dire par approche normalisée? –

Répondre

42

Vous pouvez toujours sérialiser la baie et la stocker dans la base de données.
PHP Serialize

Vous pouvez ensuite désérialiser la baie si nécessaire.

+33

Cela casse le modèle relationnel. – outis

+4

C'était parfait pour ma situation. Juste essayer de stocker un tableau variable pour les paramètres de l'utilisateur. Merci subvention. – CA3LE

+3

Cela peut avoir plus de sens selon la façon dont vous allez accéder à ces données plus tard. Si vous n'avez pas besoin d'un élément particulier de la matrice à la fois, mais seulement de l'ensemble du tableau (ce que je voulais), cette solution est très bien. –

4

Vous devriez avoir trois tables: users, comments et comment_users.

comment_users a seulement deux champs: fk_user_id et fk_comment_id

De cette façon, vous pouvez garder vos performances jusqu'à un maximum :)

13

Tenir compte normalisant la structure de la table dans un commentaire, et une table de votes séparés.

Tableau "Commentaires":

id 
comment 
user 
... 

Table "votes":

user_id 
comment_id 
vote (downvote/upvote) 

Cela permettrait à un nombre illimité de voix, sans avoir à traiter avec les limites d'un champ de base de données. De plus, vous pourriez avoir des besoins futurs pour des opérations telles que «afficher tous les votes d'un utilisateur», supprimer des votes spécifiques ou limiter le nombre maximum de votes par jour. Ces opérations sont faciles et rapides à implémenter avec une structure normalisée, et horriblement lente et complexe dans un tableau sérialisé.

+4

Tout le point de la question de l'OP, est probablement d'éviter d'utiliser plusieurs tables. – user18490

4

Je préférerais normaliser votre structure de table plus, quelque chose comme;

COMMENTS 
------- 
id (pk) 
title 
comment 
userId 


USERS 
----- 
id (pk) 
name 
email 


COMMENT_VOTE 
------------ 
commentId (pk) 
userId (pk) 
rating (float) 

Maintenant, c'est plus facile à entretenir! Et MySQL n'accepte qu'un vote par utilisateur et commente.

1

create table comme celui-ci,

CommentId UserId 
--------------------- 
    1   usr1 
    1   usr2 

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 et Users avec identifiant de

53
respectifs

Vous pouvez aborder cela comme suit:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id) 
); 

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id) 
); 

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id) 
); 

Le composite primary key(comment_id, user_id) sur le intersection tablecomments_votes empêche les utilisateurs de voter plusieurs fois sur les mêmes commentaires.

Insérons des données dans le schéma ci-dessus:

INSERT INTO comments VALUES (1, 'first comment'); 
INSERT INTO comments VALUES (2, 'second comment'); 
INSERT INTO comments VALUES (3, 'third comment'); 

INSERT INTO users VALUES (1, 'user_a'); 
INSERT INTO users VALUES (2, 'user_b'); 
INSERT INTO users VALUES (3, 'user_c'); 

Maintenant, nous allons ajouter quelques votes pour l'utilisateur 1:

INSERT INTO comments_votes VALUES (1, 1, 1); 
INSERT INTO comments_votes VALUES (2, 1, 1); 

qui précède signifie que l'utilisateur 1 a donné un vote de type 1 sur les commentaires 1 et 2.

Si le même utilisateur essaie à nouveau de voter sur l'un de ces commentaires, la base de données le rejettera:

INSERT INTO comments_votes VALUES (1, 1, 1); 
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY' 

Si vous allez utiliser le moteur de stockage InnoDB, il sera également sage d'utiliser foreign key contraintes sur les champs comment_id et user_id de la table d'intersection. A noter toutefois que MyISAM, le moteur de stockage par défaut de MySQL, n'impose pas la clé étrangère:

CREATE TABLE comments (
    comment_id int, 
    body varchar(100), 
    PRIMARY KEY (comment_id) 
) ENGINE=INNODB; 

CREATE TABLE users (
    user_id int, 
    username varchar(20), 
    PRIMARY KEY (user_id) 
) ENGINE=INNODB; 

CREATE TABLE comments_votes (
    comment_id int, 
    user_id int, 
    vote_type int, 
    PRIMARY KEY (comment_id, user_id), 
    FOREIGN KEY (comment_id) REFERENCES comments (comment_id), 
    FOREIGN KEY (user_id) REFERENCES users (user_id) 
) ENGINE=INNODB; 

Ces clés étrangères garantissent qu'une ligne de comments_votes aura jamais une valeur comment_id ou user_id qui n'existe pas dans la comments et users, respectivement. Les clés étrangères n'ont pas besoin d'une base de données relationnelle fonctionnelle, mais elles sont absolument essentielles pour éviter les relations rompues et les lignes orphelines (par exemple, referential integrity). En fait, l'intégrité référentielle est quelque chose qui aurait été très difficile à appliquer si vous deviez stocker des tableaux sérialisés dans un seul champ de base de données.

+2

Cela devrait être la réponse validée. – tomsihap

1

Si vous stockez simplement les données dans une base de données comme vous le feriez si vous ne mettiez manuellement dans un tableau

"INSERT INTO database_name.database_table (`array`) 
    VALUES 
    ('One,Two,Three,Four')"; 

Puis, quand vous tirez de la base de données, utilisez la fonction explode()

$sql = mysql_query("SELECT * FROM database_name.database_table"); 
$numrows = mysql_num_rows($sql); 
if($numrows != 0){ 
    while($rows = mysql_fetch_assoc($sql)){ 
     $array_from_db = $rows['array']; 
    } 
}else{ 
    echo "No rows found!".mysql_error(); 
} 
$array = explode(",",$array_from_db); 
foreach($array as $varchar){ 
    echo $varchar."<br/>"; 
} 

Comme si!

0

Le stockage avec json ou serialized est la meilleure solution pour le moment. Avec certaines situations (coupe «caractères) JSON pourrait obtenir du mal, mais serialize devrait être excellent choix

Note:.. Si vous modifiez les données sérialisés manuellement, vous devez faire attention à nombre de caractères

1

Vous pouvez . utiliser la fonction php serialize pour stocker tableau dans MySQL

<?php 

$array = array("Name"=>"Shubham","Age"=>"17","website"=>"http://mycodingtricks.com"); 

$string_array = serialize($array); 

echo $string_array; 

?> 

sortie de Il sera:

a:3{s:4:"Name";s:7:"Shubham";s:3:"Age";s:2:"17";s:7:"website";s:25:"http://mycodingtricks.com";} 

Et alors vous pouvez utiliser la fonction php unserialize pour décoder les données.

Je pense que vous devriez visiter this page on storing array in mysql.

Questions connexes