如何将数组存储到mysql中?
Posted
技术标签:
【中文标题】如何将数组存储到mysql中?【英文标题】:How to store an array into mysql? 【发布时间】:2011-03-25 16:56:32 【问题描述】:有没有办法将数组存储到 mysql 字段中?我正在创建一个评论评级系统,所以我想存储用户 ID 数组以防止多次投票。我将创建一个新表,其中包含评论 ID 和对该评论投票的用户 ID 数组。然后我将连接 cmets 表和此表并检查当前用户 id 是否存在于 voters 数组或注释中。如果确实如此,则投票图标将被禁用。我想我会阻止以这种方式在循环中使用mysql查询。
你碰巧知道更好的方法吗?
【问题讨论】:
我知道防止一个用户多次投票是一项简单的任务,但我需要为已经对特定评论投票的用户显示禁用的图标,并尽可能少地使用 mysql 查询。正如我看到的序列化函数将处理这个问题...... 您有什么理由认为如果使用标准化方法会很困难? @Daniel Vassallo 标准化方法是什么意思? 这是@Pekka、@Björn、@Dennis 和我自己在答案中建议的方法。我们基本上建议不要将数组序列化为单个数据库字段,而是使用另一个表(称为交集表)来存储您的关系。答案中的更多详细信息:) array in MySQL 的可能重复项 【参考方案1】:您始终可以序列化数组并将其存储在数据库中。php Serialize
然后,您可以在需要时对数组进行反序列化。
【讨论】:
这破坏了关系模型。 这非常适合我的情况。只是试图为用户设置存储一个变量数组。感谢授予。 这可能更有意义,具体取决于您稍后将如何访问这些数据。如果您一次不需要数组中的一个特定项目,而只需要整个数组(这就是我想要的),那么这个解决方案就可以了。 序列化是不好的做法...依赖第三方读取或写入 DB 使得它的可移植性降低了很多。如前所述,它击败了数据库的模型。如果需要,json_encode 可能是更好的解决方案,因为它似乎更快。它还使搜索和查询更加繁重和困难。如果数组很小,则内爆和爆炸会很好地工作。【参考方案2】:您应该有三个表:users、cmets 和 comment_users。
comment_users 只有两个字段:fk_user_id 和 fk_comment_id
这样你就可以将你的表现保持在最高水平:)
【讨论】:
【参考方案3】:考虑将表结构规范化为 cmets 和单独的投票表。
表“cmets”:
id
comment
user
...
表“投票”:
user_id
comment_id
vote (downvote/upvote)
这将允许无限数量的投票,而不必处理数据库字段的限制。
此外,您将来可能需要“显示用户已投的所有投票”、删除特定投票或限制每天的最大投票数等操作。这些操作在标准化结构中实现起来非常容易和快速,而在序列化数组中则非常缓慢和复杂。
【讨论】:
OP 问题的重点可能是避免使用多个表。【参考方案4】:我更喜欢规范化您的表结构,例如;
COMMENTS
-------
id (pk)
title
comment
userId
USERS
-----
id (pk)
name
email
COMMENT_VOTE
------------
commentId (pk)
userId (pk)
rating (float)
现在更容易维护! MySQL 只接受每个用户和评论一票。
【讨论】:
【参考方案5】:像这样创建表,
CommentId UserId
---------------------
1 usr1
1 usr2
通过这种方式你可以检查用户是否发布了 cmets 不是..
除此之外,Comments
和 Users
应该有各自的 id 表
【讨论】:
【参考方案6】:您可能希望按以下方式解决此问题:
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)
);
intersection tablecomments_votes
上的复合 primary key(comment_id, user_id)
将阻止用户在同一个 cmets 上多次投票。
让我们在上面的模式中插入一些数据:
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 对 cmets 1 和 2 投了类型 1 的投票。
如果同一用户再次尝试对其中一个 cmets 投票,数据库将拒绝它:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
如果您将使用InnoDB 存储引擎,在交集表的comment_id
和user_id
字段上使用foreign key 约束也是明智之举。但是请注意,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
表中不存在。外键不需要有一个工作的关系数据库,但它们绝对是避免破坏关系和孤立行的必要条件(即referential integrity)。
事实上,如果您要将序列化的数组存储到单个数据库字段中,那么参照完整性将很难实施。
【讨论】:
这应该是唯一经过验证的答案。【参考方案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】:使用json 或serialized 数组存储是目前最好的解决方案。 在某些情况下(修剪 " ' 字符)json 可能会遇到问题,但序列化应该是不错的选择。
注意:如果手动更改序列化数据,需要注意字符数。
【讨论】:
【参考方案9】:您可以使用 php 序列化函数将数组存储在 MySQL 中。
<?php
$array = array("Name"=>"Shubham","Age"=>"17","website"=>"http://mycodingtricks.com");
$string_array = serialize($array);
echo $string_array;
?>
它的输出将是:
a:3s:4:"Name";s:7:"Shubham";s:3:"Age";s:2:"17";s:7:"website";s:25:"http://mycodingtricks.com";
然后就可以使用php的反序列化函数来解码数据了。
我认为你应该访问this page on storing array in mysql。
【讨论】:
链接失效 链接似乎已修复并指向该页面的存档。【参考方案10】:您可以将数组保存为 json。 有 json 数据类型的文档:https://dev.mysql.com/doc/refman/5.7/en/json.html
【讨论】:
以上是关于如何将数组存储到mysql中?的主要内容,如果未能解决你的问题,请参考以下文章