如何将数组存储到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 不是.. 除此之外,CommentsUsers 应该有各自的 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 对 cme​​ts 1 和 2 投了类型 1 的投票。

如果同一用户再次尝试对其中一个 cmets 投票,数据库将拒绝它:

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

如果您将使用InnoDB 存储引擎,在交集表的comment_iduser_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_iduser_id 值分别在commentsusers 表中不存在。外键不需要有一个工作的关系数据库,但它们绝对是避免破坏关系和孤立行的必要条件(即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中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将mysql数据的行/列存储在数组中

mysql中怎么存储数组

如何使用java在mySql的表列中存储数组值

如何通过匹配(字符串到数组和数组到数组)从mysql存储和检索数组数据我在从mysql获取数据时遇到问题

Laravel 存储/插入数组值到数据库 Mysql

将数据库记录存储到数组中