Php 我需要一些关于在mysql中存储数据的建议,在mysql中需要存储多个数据,比如说一篇文章的用户ID?

Php 我需要一些关于在mysql中存储数据的建议,在mysql中需要存储多个数据,比如说一篇文章的用户ID?,php,sql,database,arrays,Php,Sql,Database,Arrays,如果有人需要在一个单元格中存储多个值,那么哪种方法更可取和可取,例如,使用分隔符或胶水将其存储,然后将其分解为一个数组,以便稍后使用所选的服务器端语言进行处理 $returnedFromDB=“159 | 160 | 161 | 162 | 163 | 164 | 165”; $myIdArray=explode(“|”,$returnedFromDB) 或者作为JSON或PHP序列化数组,如下所示 :6:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;

如果有人需要在一个单元格中存储多个值,那么哪种方法更可取和可取,例如,使用分隔符或胶水将其存储,然后将其分解为一个数组,以便稍后使用所选的服务器端语言进行处理

$returnedFromDB=“159 | 160 | 161 | 162 | 163 | 164 | 165”; $myIdArray=explode(“|”,$returnedFromDB)

或者作为JSON或PHP序列化数组,如下所示

:6:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;}

然后将其反序列化为数组并使用它

像这样的每个新条目都有一个新行

postid 12| showto 2
张贴12 | showto 3
张贴12 | showto 5
张贴12 |显示到6
张贴12 | showto 8

而不是将12 | showto贴到“2 | 3 | 4 | 6 | 8 | 5 |”
或张贴12 | showto:6:{i:0;i:2;i:3;i:2;i:3;i:3;i:4;i:4;i:5;i:5;i:6;}”


谢谢,期待您的意见:D

大多数情况下,建议多对多关系(如向用户发布的帖子)应该有一个映射表,每个帖子用户组合对应一行(换句话说,您的“每个新条目对应一行”版本)

它更适合于
join
查询,并且只允许您检索所需的数据

如果有人需要在一个单元格中存储多个值,那么哪种方法更可取和可取,例如,使用分隔符或胶水将其存储,然后将其分解为一个数组,以便稍后使用所选的服务器端语言进行处理

都不是。哦,天哪,都不是!正在他的坟墓里翻滚

将分隔数据存储在文本字段中并不比将其存储在平面文件中更好。数据变得不可查询。在文本字段中存储PHP序列化数据更糟糕,因为只有PHP才能解析数据

你想要的

你想描述的是一种多对多的关系。每个用户可以维护一个或多个帖子。同样,每个帖子可以由一个或多个用户维护。正当这样的事情就行了

CREATE TABLE users (
    user_id INTEGER PRIMARY KEY,
    ...
);

CREATE TABLE posts (
    post_id INTEGER PRIMARY KEY,
    ...
);
CREATE TABLE user_posts (
    user_id INTEGER REFERENCES users(user_id),
    post_id INTEGER REFERENCES posts(post_id),
    UNIQUE KEY(user_id, post_id)
);

-- All posts made by user 22.
SELECT posts.*
  FROM posts, user_posts
 WHERE user_posts.user_id = 22
   AND posts.post_id = user_posts.post_id

-- All users that worked on post 47
SELECT users.*
  FROM users, user_posts
 WHERE user_posts.post_id = 47
   AND users.user_id = user_posts.user_id

如果数据库不需要处理数据,则只应序列化数据库中的数据。例如,如果您不需要使用user\u ID字段进行查询,则可以序列化user\u ID字段中的用户ID;e、 g.从不根据用户选择任何内容

如果这些是帖子(博客/新闻/等等帖子?),那么我很有信心您需要能够按用户查询它们。将用户规范化为另一个表将为您提供:

CREATE TABLE posts (post_id, ....);
CREATE TABLE post_users (post_id, user_id, ...);

然后,您可以在另一个查询中获取用户,或者使用
group_concat
选择post_id,group_concat(用户id)FROM posts加入post_用户使用(post_id)group BY post_id
。当您需要显示用户名时,只需连接到users表以在组concat中获取其名称。

从RDBMS的角度来看,我会“为每个新条目创建一个新行” 这就是所谓的m:n关系表。 然后,您可以随意查询数据

如果您需要
postid12 | showto:6:{i:0;i:2;i:1;i:3;i:3;i:4;i:5;i:5;i:6;},
您可以这样做

SELECT postid, CONCAT(':',count(showto),':{i:',GROUP_CONCAT(showto SEPARATOR ';i:'),';}') AS showto 
FROM tablename
GROUP BY postid

但是,如果您只需要1形式的数据,而不需要对该数据执行任何其他类型的查询,那么您也可以存储字符串

创建表user_posts(user_id整数引用user(user_id),post_id整数引用post(post_id),唯一键(user_id,post_id));这部分,你能帮我澄清一下吗,整数引用和唯一键,这像forign键约束还是什么?。或者它是某种将post id与userid关联的表,我想我确信我不应该将数据存储为分隔的stings和serializations@Akay
引用
子句创建外键,是。这确保您不能在链接表中插入无意义的标识符<代码>唯一键(col1,col2)建立了一个称为“复合键”的东西——两列粘在一起。在这种情况下,两列的组合是唯一的。例如,无法插入
值(1,2)、(1,2)
。这个限制是适当的,因为它对于我上面描述的数据模型是有意义的。如果需要在链接表中存储有关关系性质的其他数据,则可能没有意义。此处不应使用左外部联接。如果用户没有帖子,它也不会出现在n:m表中,内部连接允许更好的优化。@对不起,这是一个坏习惯,因为使用了一个不懂“内部”这个词的坏数据库引擎。我正在编辑以使用更差/更好的语法。@Charles,非常感谢,我相信这将对我规范化数据库有很大帮助:D,它的悲哀之处在于,MySQL文档有点难以理解,事情需要如此多的澄清:(.Wow,从来没有想过这种语法,:D“CONCAT(':',count(showto),':{I:',GROUP_CONCAT(showto SEPARATOR';I:'),';')”也许能帮我很多忙。谢谢。