Ответ 1
Вы всегда можете сериализовать массив и сохранить его в базе данных.
Сериализация PHP
Затем вы можете безриализовать массив, если это необходимо.
Есть ли способ сохранить массив в поле 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)
в таблице переходов 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
, соответственно. Внешним ключам не требуется иметь рабочую реляционную базу данных, но они, безусловно, необходимы для предотвращения нарушения связей и сиротских строк (т.е. ссылочной целостности).
Фактически, ссылочная целостность - это то, что было бы очень сложно обеспечить, если бы вы хранили многосерийные массивы в одно поле базы данных.
Рассмотрим нормализацию структуры таблицы в комментариях и отдельную таблицу голосов.
Таблица "comments":
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
с соответствующими id
Если вы просто храните данные в базе данных так же, как если бы вы вручную помещали ее в массив
"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