【问题标题】:Content-by-user: two tables with columns of the same name or join?Content-by-user:两个具有相同名称或连接列的表?
【发布时间】:2011-12-12 08:31:01
【问题描述】:

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

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

【问题讨论】:

    标签: php mysql database-design join


    【解决方案1】:

    在这种情况下,一个非常常用的概念是拥有一个 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.
    

    YMMV 在 MySQL 中,但我认为上面的结构可以直接工作。

    (编辑:为澄清添加了插入)

    【讨论】:

    • 哇。这真的是行话。为什么在 SELECT 之前使用 #,为什么 U.id AS user_id,为什么使用 U 而不是 users 是可以接受的?我认为必须在使用表之前为其分配昵称?
    • 您可以根据需要跳过表别名,这只是编写查询的一种更短的方式。如果“posts.content”比“P.content”更容易阅读,请随意跳过别名。 SELECT 之前的“#”是 Postgres 的 shell 提示符。
    【解决方案2】:

    最常见的方法是在 post 表中添加一个用户 ID。插入每个帖子的用户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 posts (content) VALUES ('In the old days, everybody wore hakama in Japan. These days, only girls wear them, and typically only during graduation ceremonies.'); 时,post.postID 会自动递增。会不会像会话 cookie 一样处理 post.userID
    • @Wolfpack'08 这完全取决于你。您可以将用户 ID 存储在像 $_SESSION['userid']=$userid 这样的会话中,然后将此会话存储在您的查询中 where post.userid=$_SESSION['userid'];
    【解决方案3】:

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

    【讨论】:

    • 好东西,neokio。感谢您的链接。
    猜你喜欢
    • 1970-01-01
    • 2021-11-25
    • 2016-10-02
    • 1970-01-01
    • 2015-10-29
    • 2011-04-07
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多