Есть ли способ сохранить массив в поле mysql? Я создаю систему оценки комментариев, поэтому я хочу хранить массивы идентификаторов пользователей для предотвращения множественных голосований. Я собираюсь создать новую таблицу, содержащую идентификатор комментария и массив идентификаторов пользователей, которые проголосовали за этот комментарий. Затем я присоединяюсь к таблице комментариев и этой таблице и проверяю, существует ли текущий идентификатор пользователя в массиве избирателей или заметке. Если это произойдет, то значки голосования будут отключены. Я думаю, что я буду препятствовать использованию запроса mysql в цикле таким образом.
Знаете ли вы, что знаете лучше?
Вы всегда можете сериализовать массив и сохранить его в базе данных.
Сериализация PHP
После этого вы можете безриализовать массив.
Вы можете решить эту проблему следующим образом:
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)
первичный ключ (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 , будет также разумно использовать ограничения внешнего ключа user_id
полей 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
, соответственно. Внешним ключам не требуется иметь рабочую реляционную базу данных, но они, безусловно, необходимы, чтобы избежать нарушенных связей и сиротских строк (т. Е. Ссылочной целостности ).
На самом деле, ссылочная целостность – это то, что было бы очень сложно обеспечить, если бы вы хранили сериализованные массивы в одно поле базы данных.
Рассмотрим нормализацию структуры таблицы в комментариях и отдельную таблицу голосов.
Таблица «комментарии»:
id comment user ...
Таблица «голосов»:
user_id comment_id vote (downvote/upvote)
это позволило бы неограниченное количество голосов без необходимости иметь дело с пределами поля базы данных.
Кроме того, у вас могут быть будущие потребности в таких операциях, как «показать все голоса, которые пользователь произнес», удаление конкретных голосов или ограничение максимального количества голосов в день. Эти операции мертвы легко и быстро реализуются с нормализованной структурой и ужасно медленны и сложны в сериализованном массиве.
у вас должно быть три таблицы: пользователи, комментарии и комментаторы.
comment_users имеет только два поля: fk_user_id и fk_comment_id
Таким образом, вы можете максимально увеличить свою производительность 🙂
Я бы предпочел более нормализовать структуру вашей таблицы, что-то вроде;
COMMENTS ------- id (pk) title comment userId USERS ----- id (pk) name email COMMENT_VOTE ------------ commentId (pk) userId (pk) rating (float)
Теперь его легче поддерживать! И MySQL принимает только один голос за пользователя и комментарий.
создайте таблицу, как это,
CommentId UserId --------------------- 1 usr1 1 usr2
Таким образом, вы можете проверить, не размещены ли пользователи комментариев. Кроме этого, должны быть таблицы для Comments
и Users
с соответствующими идентификаторами
Если вы просто храните данные в базе данных так же, как если бы вы вручную помещали ее в массив
"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/>"; }
Вот так!
Вы можете использовать функцию сериализации 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 .
Хранение с помощью json или сериализованного массива – лучшее решение на данный момент. В некоторых ситуациях (обрезка «символов») json может получить проблемы, но сериализация должна быть отличным выбором.
Примечание. Если вы изменяете сериализованные данные вручную, вам нужно быть осторожным в отношении количества символов.
Вы можете сохранить свой массив как json.
есть документация для типа данных json: https://dev.mysql.com/doc/refman/5.7/en/json.html