逐个用户:两个具有相同名称或连接列的表?

时间:2011-10-21 06:52:24

标签: php mysql database-design join

标题几乎说明了一切。我有用户发布内容,我想将users表中的用户ID附加到帖子。我应该在posts表中添加userid列,我应该通过DB语言加入,还是应该使用脚本语言来轮询每个表?如果我应该加入,我应该做什么样的加入?

示例内容如下:“我商店的泰迪熊比泰迪山羊软,但泰迪山羊更可爱。” - James Teddyman在下午3:36发表。

3 个答案:

答案 0 :(得分:5)

在这种情况下经常使用的概念是通过使用users表和post表,将它们与唯一标识符链接在一起。这个标识符可以是任何东西 - 序列化的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
);

然后使用连接合并表格。这可以通过多种方式完成,但是在插入一些值后,这是一个交叉连接:

@> 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.

MySQL中的YMMV,但我认为上面的结构会直接起作用。

(编辑:添加INSERT以澄清)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

Database Normalization会建议最好的方法是“带有列的两个表”,通过user_id将用户内容与用户相关联。众所周知,从长远来看,这种方法可以更有效地管理熊和山羊。