wake-up-neo.net

Wie speichert man ein Array in MySQL?

Gibt es eine Möglichkeit, ein Array in ein Mysql-Feld zu speichern? Ich erstelle ein Bewertungssystem für Kommentare, um die Arrays der Benutzer-IDs zu speichern, um Mehrfachnennungen zu verhindern. Ich werde eine neue Tabelle erstellen, die die Kommentar-ID und das Array der Benutzer-IDs enthält, die über diesen Kommentar abgestimmt haben. Dann werde ich der Kommentartabelle und dieser Tabelle beitreten und prüfen, ob die aktuelle Benutzer-ID im Wählerfeld oder in der Notiz vorhanden ist. Wenn dies der Fall ist, werden die Abstimmungssymbole deaktiviert. Ich denke, ich werde verhindern, dass mysql query in loop auf diese Weise verwendet wird.

Wissen Sie zufällig bessere Möglichkeiten?

45
King Julien

Sie können das Array immer serialisieren und in der Datenbank speichern.
PHP Serialize

Sie können das Array dann bei Bedarf desialisieren.

48
Grant Collins

Sie können dies wie folgt angehen:

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)
);

Der zusammengesetzte Primärschlüssel(comment_id, user_id) in der intersection-Tabellecomments_votes hindert Benutzer daran, mehrmals für dieselben Kommentare zu stimmen.

Fügen wir einige Daten in das obige Schema ein:

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');

Fügen wir nun einige Stimmen für Benutzer 1 hinzu:

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

Dies bedeutet, dass Benutzer 1 zu den Kommentaren 1 und 2 eine Stimme vom Typ 1 abgegeben hat.

Wenn derselbe Benutzer erneut versucht, für einen dieser Kommentare abzustimmen, lehnt die Datenbank diesen ab:

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

Wenn Sie die InnoDB - Speicher-Engine verwenden, ist es auch ratsam, Fremdschlüssel Einschränkungen in den Feldern comment_id und user_id der Kreuzungstabelle zu verwenden. Beachten Sie jedoch, dass MyISAM , die Standard-Speicher-Engine in MySQL, keine Fremdschlüsseleinschränkungen erzwingt:

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;

Diese Fremdschlüssel garantieren, dass eine Zeile in comments_votes niemals einen comment_id- oder user_id-Wert hat, der in den comments- bzw. users-Tabellen nicht vorhanden ist. Es ist nicht erforderlich, dass Fremdschlüssel über eine funktionsfähige relationale Datenbank verfügen, sie sind jedoch unbedingt erforderlich, um unterbrochene Beziehungen und verwaiste Zeilen zu vermeiden (dh. referentielle Integrität ).

Die referenzielle Integrität ist in der Tat sehr schwer durchzusetzen, wenn Sie serialisierte Arrays in einem einzigen Datenbankfeld speichern.

60
Daniel Vassallo

Erwägen Sie, die Tabellenstruktur in Kommentare und eine separate Abstimmungstabelle zu normalisieren.

Tabelle "Kommentare":

id
comment
user
...

Tabelle "Stimmen":

user_id  
comment_id
vote (downvote/upvote)

dies würde eine unbegrenzte Anzahl von Stimmen zulassen, ohne sich mit den Grenzen eines Datenbankfelds befassen zu müssen. 

Möglicherweise haben Sie auch zukünftige Anforderungen für Vorgänge wie "Alle von einem Benutzer abgegebenen Stimmen anzeigen", bestimmte Stimmen entfernen oder die maximale Anzahl von Stimmen pro Tag begrenzen. Diese Operationen sind mit einer normalisierten Struktur einfach und schnell zu implementieren und in einem serialisierten Array äußerst langsam und komplex.

13
Pekka 웃

sie sollten drei Tabellen haben: Benutzer, Kommentare und Kommentarbenutzer.

comment_users hat nur zwei Felder: fk_user_id und fk_comment_id

Auf diese Weise kannst du deine Leistung maximal halten :)

4

Ich würde es vorziehen, Ihre Tabellenstruktur mehr zu normalisieren, etwa wie;

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


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


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

Jetzt ist es einfacher zu warten! MySQL akzeptiert nur eine Stimme pro Benutzer und Kommentar.

4
Björn

erstellen sie die tabelle so,

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

Auf diese Weise können Sie überprüfen, ob der Benutzer die Kommentare geschrieben hat, nicht .. Außerdem sollten Tabellen für Comments und Users mit den entsprechenden IDs vorhanden sein

Wenn Sie die Daten einfach in einer Datenbank speichern, als würden Sie sie manuell in ein Array einfügen

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

Wenn Sie dann aus der Datenbank ziehen, verwenden Sie die Funktion 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/>";
}

Wie so!

1
Hardline_98

Sie können Ihr Array als Json speichern.
Es gibt eine Dokumentation zum json-Datentyp: https://dev.mysql.com/doc/refman/5.7/de/json.html

0
Roberto Murguia

Sie können die PHP-Serialisierungsfunktion verwenden, um ein Array in MySQL zu speichern.

<?php

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

$string_array = serialize($array);

echo $string_array;

?>

Es wird ausgegeben: 

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

Und dann können Sie die PHP-Funktion verwenden, um die Daten zu decodieren.

Ich denke, Sie sollten diese Seite besuchen, um ein Array in mysql zu speichern.

0
Shubham Kumar

Das Speichern mit json oder serialized array ist die beste Lösung für jetzt ..__ In einigen Situationen (Beschneidungszeichen) kann Json Probleme bekommen, aber serialisieren sollte eine gute Wahl sein.

Hinweis: Wenn Sie serialisierte Daten manuell ändern, müssen Sie auf die Anzahl der Zeichen achten.

0