2011-10-21 52 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'嗎? –

相關問題