标题几乎说明了一切。我有用户发布内容,我想将users表中的用户ID附加到帖子中。我应该在posts表中添加一个userid列吗?是否应该通过数据库语言连接,还是应该使用脚本语言来轮询每个表格?如果我应该加入,我应该做什么样的加入?逐个用户内容:两个具有相同名称或连接列的表?
示例内容如下所示:“我店里的玩具熊比泰迪熊山羊更柔软,但玩具山羊更可爱。” - 由詹姆斯泰迪曼在下午3:36发布。
标题几乎说明了一切。我有用户发布内容,我想将users表中的用户ID附加到帖子中。我应该在posts表中添加一个userid列吗?是否应该通过数据库语言连接,还是应该使用脚本语言来轮询每个表格?如果我应该加入,我应该做什么样的加入?逐个用户内容:两个具有相同名称或连接列的表?
示例内容如下所示:“我店里的玩具熊比泰迪熊山羊更柔软,但玩具山羊更可爱。” - 由詹姆斯泰迪曼在下午3:36发布。
在这样的情况非常常用的概念是由具有用户表和表后,有一个唯一的标识符他们连接起来。这个标识符可以是任何东西 - 一个序列化的ID,一个用户名,邮件地址等 - 只要它是唯一的。链接使用外键约束完成。究竟如何在MySQL中实现,我不知道,但在Postgres的是这样的做:那么
CREATE TABLE users (
id serial PRIMARY KEY,
name text
);
CREATE TABLE posts (
content text,
user_id integer REFERENCES users(id) NOT NULL
);
的表使用联接合并。这可以通过多种方式来实现,但这里是一些值插入后交叉联接一起玩:在MySQL
@> INSERT INTO users (name) VALUES ('James');
@> INSERT INTO users (name) VALUES ('Jones');
@> INSERT INTO posts (content, user_id) VALUES ('Hello from James.', 1);
@> INSERT INTO posts (content, user_id) VALUES ('Greetings from Jones.', 2);
@> SELECT U.id AS user_id, U.name, P.content \
FROM users U, posts P \
WHERE U.id = P.user_id;
user_id | name | content
---------+-------+-----------------------
1 | James | Hello from James.
2 | Jones | Greetings from Jones.
情况因人而异,但我觉得上面的结构将工作直客。
(编辑:添加INSERTs澄清)
Database Normalization会提示最好的方法是“两列有列”,通过user_id将用户内容与用户相关联。已知这种方法可以长期更有效地管理熊和山羊。
好东西,neokio。感谢您的链接。 –
很多方法是在帖子表中添加一个用户ID。插入每个帖子的用户标识。然后通过提取信息使用简单连接来获得完整的信息。您选择的查询应该看起来像
select post.content,post.date,users.firstname,user.lastname from post,users where post.userid=users.id
Awais Qarni,感谢您的代码。我需要使用脚本语言来处理Posts表中的用户ID分配,还是MySQL会这样做? –
@ Wolfpack'08欢迎亲爱的。但我不明白你想说什么? –
'SELECT post.content,post.date,users.username FROM post,users WHERE post.userid = post.id ORDER BY post.date ASC'好像是我想要做的。当我输入'INSERT INTO帖子(内容)VALUES('在过去,每个人都在日本穿hakama,这些日子里,只有女孩穿着它们,一般只在毕业典礼上。');'','post.postID'是自动递增。会像cookie会处理'post.userID'吗? –
哇。它真的很棒。为什么在SELECT之前使用#号,为什么使用U.id AS user_id,为什么使用U而不是用户可以接受?我认为表格的昵称必须在使用之前进行分配? –
如果你愿意,你可以跳过表别名,这只是一个更短的写查询方式。如果“posts.content”比“P.content”更容易阅读,请随意忽略别名。 SELECT之前的“#”是Postgres shell的提示符。 – bos