2011-10-21 53 views
2

标题几乎说明了一切。我有用户发布内容,我想将users表中的用户ID附加到帖子中。我应该在posts表中添加一个userid列吗?是否应该通过数据库语言连接,还是应该使用脚本语言来轮询每个表格?如果我应该加入,我应该做什么样的加入?逐个用户内容:两个具有相同名称或连接列的表?

示例内容如下所示:“我店里的玩具熊比泰迪熊山羊更柔软,但玩具山羊更可爱。” - 由詹姆斯泰迪曼在下午3:36发布。

回答

5

在这样的情况非常常用的概念是由具有用户表和表后,有一个唯一的标识符他们连接起来。这个标识符可以是任何东西 - 一个序列化的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澄清)

+1

哇。它真的很棒。为什么在SELECT之前使用#号,为什么使用U.id AS user_id,为什么使用U而不是用户可以接受?我认为表格的昵称必须在使用之前进行分配? –

+1

如果你愿意,你可以跳过表别名,这只是一个更短的写查询方式。如果“posts.content”比“P.content”更容易阅读,请随意忽略别名。 SELECT之前的“#”是Postgres shell的提示符。 – bos

1

Database Normalization会提示最好的方法是“两列有列”,通过user_id将用户内容与用户相关联。已知这种方法可以长期更有效地管理熊和山羊。

+0

好东西,neokio。感谢您的链接。 –

2

很多方法是在帖子表中添加一个用户ID。插入每个帖子的用户标识。然后通过提取信息使用简单连接来获得完整的信息。您选择的查询应该看起来像

select post.content,post.date,users.firstname,user.lastname from post,users where post.userid=users.id 
+0

Awais Qarni,感谢您的代码。我需要使用脚本语言来处理Posts表中的用户ID分配,还是MySQL会这样做? –

+0

@ Wolfpack'08欢迎亲爱的。但我不明白你想说什么? –

+0

'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'吗? –

相关问题