Подтвердить что ты не робот

Как сохранить массив в mysql?

Есть ли способ сохранить массив в поле mysql? Я создаю систему оценки комментариев, поэтому я хочу хранить массивы идентификаторов пользователей для предотвращения множественных голосований. Я собираюсь создать новую таблицу, содержащую идентификатор комментария и массив идентификаторов пользователей, которые проголосовали за этот комментарий. Затем я присоединяюсь к таблице комментариев и этой таблице и проверяю, существует ли текущий идентификатор пользователя в массиве избирателей или заметке. Если это произойдет, то значки голосования будут отключены. Я думаю, что я не буду использовать mysql-запрос в цикле таким образом.

Знаете ли вы, что знаете какие-то лучшие способы?

4b9b3361

Ответ 1

Вы всегда можете сериализовать массив и сохранить его в базе данных.
Сериализация PHP

Затем вы можете безриализовать массив, если это необходимо.

Ответ 2

Вы можете решить эту проблему следующим образом:

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

Составной первичный ключ (comment_id, user_id) в таблице переходов comments_votes не позволит пользователям голосовать несколько раз за одни и те же комментарии.

Вставьте некоторые данные в приведенную выше схему:

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

Теперь добавьте несколько голосов для пользователя 1:

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

Вышеупомянутое означает, что пользователь 1 дал голосование типа 1 в комментариях 1 и 2.

Если один и тот же пользователь попытается снова проголосовать по одному из этих комментариев, база данных отклонит его:

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

Если вы будете использовать механизм хранения InnoDB, также будет полезно использовать external key в полях comment_id и user_id таблицы пересечений. Однако обратите внимание, что MyISAM, механизм хранения по умолчанию в MySQL, не применяет ограничения внешнего ключа:

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;

Эти внешние ключи гарантируют, что строка в comments_votes никогда не будет иметь значение comment_id или user_id, которое не существует в таблицах comments и users, соответственно. Внешним ключам не требуется иметь рабочую реляционную базу данных, но они, безусловно, необходимы для предотвращения нарушения связей и сиротских строк (т.е. ссылочной целостности).

Фактически, ссылочная целостность - это то, что было бы очень сложно обеспечить, если бы вы хранили многосерийные массивы в одно поле базы данных.

Ответ 3

Рассмотрим нормализацию структуры таблицы в комментариях и отдельную таблицу голосов.

Таблица "comments":

id
comment
user
...

Таблица "голосов":

user_id  
comment_id
vote (downvote/upvote)

это позволило бы неограниченное количество голосов без необходимости иметь дело с пределами поля базы данных.

Кроме того, у вас могут быть будущие потребности в таких операциях, как "показать все голоса, которые пользователь произнес", удаление конкретных голосов или ограничение максимального количества голосов в день. Эти операции мертвы легко и быстро реализуются с нормализованной структурой и ужасно медленны и сложны в сериализованном массиве.

Ответ 4

у вас должно быть три таблицы: пользователи, комментарии и комментаторы.

comment_users имеет только два поля: fk_user_id и fk_comment_id

Таким образом, вы можете максимально увеличить свою производительность:)

Ответ 5

Я бы предпочел более нормализовать структуру вашей таблицы, например:

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


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


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

Теперь это проще поддерживать! И MySQL принимает только один голос на пользователя и комментарий.

Ответ 6

создать таблицу, подобную этой,

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

Таким образом, вы можете проверить, не опубликовал ли пользователь комментарии. Помимо этого, должны быть таблицы для Comments и Users с соответствующими id

Ответ 7

Если вы просто храните данные в базе данных так же, как если бы вы вручную помещали ее в массив

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

Затем, когда вы вытаскиваете из базы данных, используйте функцию 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/>";
}

Так вот!

Ответ 8

Вы можете использовать функцию сериализации php для хранения массива в MySQL.

<?php

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

$string_array = serialize($array);

echo $string_array;

?>

Его вывод будет:

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

И затем вы можете использовать функцию unserialize php для декодирования данных.

Думаю, вам стоит посетить этой странице при хранении массива в mysql.

Ответ 9

Сохранение json или сериализованный массив лучшее решение на данный момент. В некоторых ситуациях (обрезка "символов" ) json может получить проблемы, но сериализация должна быть отличным выбором.

Примечание. Если вы изменяете сериализованные данные вручную, вам нужно быть осторожным в отношении количества символов.