Comment stocker un tableau dans mysql?

Est-il un moyen pour stocker un tableau dans le champ mysql? Je crée un système de notation des commentaires donc je veux stocker les tableaux d'ID d'utilisateur pour empêcher les votes multiples. Je vais créer une nouvelle table qui contient l'id de commentaire et le tableau d'ID d'utilisateur qui ont voté sur ce commentaire. Puis je vais rejoindre la table des commentaires et cette table et vérifier si le nom d'utilisateur courant existe dans le tableau ou la note des électeurs. Si c'est le cas, les icônes de vote seront désactivées. Je pense que je vais éviter d'utiliser de requête mysql en boucle de cette façon.

connaissez-vous d'autres moyens?

44
demandé sur April 2010-08-05 13:16:23

10 réponses

vous pouvez toujours sérialiser le tableau et le stocker dans la base de données.

PHP Serialize

vous pouvez alors désérialiser le tableau si nécessaire.

47
répondu Grant Collins 2010-08-05 09:19:45

Vous pouvez lutter contre ce, 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 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.

insérons quelques 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, ajoutons quelques votes pour l'utilisateur 1:

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

ce 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 de voter à nouveau 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 utilisez le InnoDB moteur de stockage, il sera également judicieux de les utiliser clé étrangère contraintes sur l' comment_id et user_id champs de la table d'intersection. Notez cependant que MyISAM, le moteur de stockage par défaut dans MySQL, n'impose pas la clé étrangère contraintes:

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 rangée dans comments_votes n'en aura jamais comment_id ou user_id valeur qui n'existe pas dans le comments et users tableaux, respectivement. Les clés étrangères ne sont pas nécessaires pour avoir une base de données relationnelle de travail, mais ils sont certainement essentiels pour éviter les relations rompues et les lignes orphelines (c.-à-d. 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 deviez stocker des tableaux sérialisés dans un seul champ de base de données.

58
répondu Daniel Vassallo 2010-08-05 09:39:39

envisager de normaliser la structure des tableaux en un tableau de commentaires et un tableau de votes séparé.

Table "commentaires":

id
comment
user
...
user_id  
comment_id
vote (downvote/upvote)

cela permettrait un nombre illimité de votes sans avoir à traiter des limites d'un champ de base de données.

13
répondu Pekka 웃 2010-08-05 09:26:16

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

comment_users n'a que deux champs: fk_user_id et fk_comment_id

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

4
répondu Dennis Haarbrink 2010-08-05 09:19:55

je préférerais normaliser davantage votre structure de table, 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 à maintenir! Et MySQL n'accepte qu'un vote par utilisateur et un commentaire.

4
répondu Björn 2010-08-05 09:21:54

créer un tableau comme celui-ci,

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

de cette façon, vous pouvez vérifier si l'Utilisateur a posté les commentaires ne sont pas.. En dehors de cela il devrait y avoir des tables pour Comments et Users avec les identifications respectives

1
répondu Srinivas Reddy Thatiparthy 2010-08-05 09:22:07

si vous stockez simplement les données dans une base de données comme vous le feriez si vous les 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!

1
répondu Hardline_98 2014-02-19 00:03:40

Stockage json ou sérialisé array est la meilleure solution pour l'instant. Avec certaines situations (rognage des caractères"') json pourrait avoir des problèmes mais serialize devrait être un grand choix.

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

0
répondu Bŭnyãmin Akçãy 2015-08-06 00:15:31

vous pouvez utiliser la fonction serialize de php pour stocker le tableau dans MySQL.

<?php

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

$string_array = serialize($array);

echo $string_array;

?>

C'est la sortie sera :

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

et ensuite vous pouvez utiliser la fonction php unserialize pour décoder les données.

je pense que vous devriez visiter cette page sur le stockage des tableaux dans mysql.

0
répondu Shubham Kumar 2015-12-07 14:51:57

Vous pouvez enregistrer votre tableau json.

il y a de la documentation pour le type de données json:https://dev.mysql.com/doc/refman/5.7/en/json.html

0
répondu Roberto Murguia 2016-06-04 20:46:11