2010-08-05 30 views
42

Gibt es eine Möglichkeit, ein Array in mysql Feld zu speichern? Ich erstelle ein Kommentar-Bewertungssystem, also möchte ich die Arrays von Benutzer-IDs speichern, um mehrere Bewertungen zu verhindern. Ich werde eine neue Tabelle erstellen, die die Kommentar-ID und das Array von 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 Benutzerkennung im Wähler-Array oder in der Notiz existiert. Wenn dies der Fall wäre, wären die Abstimmungssymbole deaktiviert. Ich denke, ich werde verhindern, auf diese Weise mysql-Abfrage in Schleife zu verwenden.Wie speichert man ein Array in mysql?

Wissen Sie zufällig bessere Wege?

+0

Ich weiß, es ist eine einfache Aufgabe, mehrere Votings von einem Benutzer zu verhindern, aber ich brauche für den Benutzer deaktiviert Symbole anzuzeigen, die auf dem speziellen Kommentar bereits abgestimmt hat und so wenig mysql Abfragen wie möglich. Wie ich sehe, wird die Serialize-Funktion dieses Problem behandeln ... –

+0

Gibt es einen Grund, warum Sie denken, dass es schwierig sein wird, wenn Sie den normalisierten Ansatz verwenden würden? –

+0

@Daniel Vassallo Was meinst du mit normalisierten Ansatz? –

Antwort

42

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

Sie können das Array dann bei Bedarf deserialisieren.

+33

Dies bricht das relationale Modell. – outis

+4

Das war perfekt für meine Situation. Ich versuche nur, ein variables Array für Benutzereinstellungen zu speichern. Dankeschön. – CA3LE

+3

Dies kann sinnvoller sein, je nachdem, wie Sie später auf diese Daten zugreifen möchten. Wenn Sie nicht immer ein bestimmtes Element aus dem Array benötigen, sondern nur das gesamte Array (was ich wollte), ist diese Lösung in Ordnung. –

4

sollten Sie drei Tabellen haben: Benutzer, Kommentare und comment_users.

comment_users hat nur zwei Felder: fk_user_id und fk_comment_id

diese Weise können Sie Ihre Leistung bis zu einem Maximum halten :)

13

Betrachten Sie die Tabellenstruktur in eine Kommentare und eine gesonderte Abstimmung Tabelle zu normalisieren.

Table "Kommentare":

id 
comment 
user 
... 

Table "Stimmen":

user_id 
comment_id 
vote (downvote/upvote) 

dies würde eine unbegrenzte Anzahl von Stimmen ermöglichen, ohne mit den Grenzen eines Datenbankfeldes zu beschäftigen.

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

+4

Der springende Punkt der OP-Frage ist wahrscheinlich, mehrere Tabellen zu vermeiden. – user18490

4

Ich würde es vorziehen, Ihre Tabellenstruktur mehr zu normalisieren, etwas 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 pflegen! Und MySQL akzeptiert nur eine Stimme pro Benutzer und Kommentar.

1

erstellen Tabelle wie folgt,

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

Auf diese Weise können Sie überprüfen, ob der Benutzer geschrieben Kommentare sind nicht .. Abgesehen davon sollte es Tabellen für Comments und Users mit entsprechenden ids

53

Sie können dies angehen wollen, wie folgt:

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

Verbund primary key(comment_id, user_id) auf dem intersection tablecomments_votes wird verhindern, dass Benutzer mehrfach über dieselben Kommentare abstimmen.

Lassen Sie uns einige Daten in dem obigen Schema einfügen:

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

Die oben bedeutet, dass Benutzer 1 eine Stimme vom Typ 1 auf Kommentare gab:

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

der einige Stimmen für Benutzer 1 Lassen Sie uns jetzt hinzufügen 1 und 2.

Wenn der gleiche Benutzer wieder zu stimmen versucht, auf einem dieser Kommentare, wird die Datenbank ablehnen:

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

Wenn Sie das InnoDB Speicher-Engine verwendet werden, wird es auch ratsam sein foreign key Einschränkungen für die comment_id und user_id Felder der Verknüpfungstabelle zu verwenden. Beachten Sie jedoch, dass MyISAM, Motor der Standard-Speicher in MySQL, keine Fremdschlüssel-Constraints erzwingen:

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 nie einen comment_id oder user_id Wert hat, der nicht in der nicht existiert comments und users Tabellen jeweils. Fremdschlüssel müssen keine funktionierende relationale Datenbank haben, aber sie sind unbedingt erforderlich, um gebrochene Beziehungen und verwaiste Zeilen zu vermeiden (z. B. referential integrity).

In der Tat, referenzielle Integrität ist etwas, das sehr schwer zu erzwingen gewesen wäre, wenn Sie serialisierte Arrays in einem einzigen Datenbankfeld speichern würden.

+2

Dies sollte die eine validierte Antwort sein. – tomsihap

1

Wenn Sie speichern nur die Daten in einer Datenbank als würden Sie, wenn Sie es manuell in ein Array Putting wurden

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

Dann, wenn Sie 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!

0

Speichern mit json oder serialized Array ist die beste Lösung für jetzt. Bei einigen Situationen (Trimmen " 'Zeichen) json Probleme werden könnten bekommen aber serialize sollte große Auswahl

. Hinweis:. Wenn Sie manuell serialisierten Daten zu ändern, müssen Sie Zeichenzahl vorsichtig sein

1

können Sie . mit der pHP-Funktion Serialize Array in MySQL speichern

<?php 

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

$string_array = serialize($array); 

echo $string_array; 

?> 

Es ist Ausgang wird sein:

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 Funktion php unserialize verwenden, um die Daten zu dekodieren.

Ich denke, Sie sollten this page on storing array in mysql besuchen.

Verwandte Themen