2013-11-03 168 views
1

從我在線閱讀的內容來看,如果可能的話,由於訪問時間的原因,最好將數據拆分爲更多的表格。MySQL - 數據庫設計 - 用戶和配置文件的單獨表格

現在我有一個表,其中我存儲的用戶名,密碼和註冊日期 這是我的表的樣子:

'user' 
'user_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
user_username VARCHAR(80) NOT NULL, 
user_password VARCHAR(255) NOT NULL, 
user_join_date INTEGER UNSIGNED NOT NULL, 
PRIMARY KEY (user_id) '); 

我想創建一個新的表,即情景中,我想存儲名字,姓氏,電子郵件,年齡和性別。我認爲我需要一對一的關係,所以我應該使用user_id,但我不確定如何實現它。

我應該創建一個名爲型材另一個表 型材

profiles_id 
first_name 
last_name 
email 
age 
gender 

,另外一個應該是什麼關係?例如

user_profiles 
---------- 
user_id 
profiles_id 

這是正確的嗎? SQL如何查找user_profiles?

感謝

+0

。 。你的第一個陳述不正確。你可以參考你在網上閱讀的內容嗎?有時使用多個表格會更好,有時不會。 –

回答

2

通常情況下,你創建一個關聯表,像user_profiles你的描述,當一個用戶可以擁有多個配置文件,和/或一個配置文件可以屬於一個或多個用戶。

正如你所說,在這裏你有一個one-to-oneuserprofile之間的關係。因此,您可以簡單地將user_id列添加到profile表中,並將其定義爲user表的外鍵。

然後,一個簡單的JOIN將讓你在同一時間查詢兩個表:

SELECT u.*, p.* 
FROM user u 
JOIN profile p ON u.user_id = p.user_id 
+0

我對堆棧溢出的評論感到困惑。我創建了一個名爲profiles的新表,它具有:引用用戶表的profiles_id,user_id,first_name ...主鍵(profiles_id)和外鍵(user_id)。現在,如果我將數據添加到表單中,我應該在什麼時候運行該查詢?或者實際上,它在做什麼?它是否在表格之間設置某種關係?對不起,我很困惑 – mihai121

+0

它確實在創建表之間的關係,但插入和檢索數據應該考慮到這個模式。你應該首先'INSERT INTO用戶(...)VALUES(...)',然後檢索[最後插入的id](http://php.net/manual/pdo.lastinsertid.php)和'INSERT INTO profile (user_id,...)VALUES($ last_id,...)'引用用戶。 –

+0

好吧,我這樣做了,但我發現最後插入的ID只適用於插入後請求它。但我有一個文件插入到用戶,另一個文件插入配置文件。我能做些什麼來檢索last_id,以便我可以將它放入其他文件中,並將其插入配置文件中? (我真的不使用PDO,所以我用了mysql_insert_id) – mihai121

1

你可以在user_id一個user_id字段添加到您的個人資料表,並JOIN表。

SELECT user.user_username, ..., profiles.first_name, ... 
FROM user 
INNER JOIN profiles 
ON user.user_id = profiles.user_id 

這應該獲取數據從哪裏JOIN條件被滿足的那些行(即user.user_id = profiles.user_id)合成信息。

4

不要拆分表格。只需將新列添加到您現有的user表中即可。您稍後可能會發現,根據實際查詢和使用模式,拆分表是一個好主意,但在您擁有這類數據之前,請將事情簡單化。

如果您必須創建配置文件表,請不要創建user_profiles表。這將允許一個m-to-n關係,這可能不是你想要的。 profiles中的簡單user_id列更好。事實上,它可能是一個外鍵和主鍵,以確保每個user行只有一個並且只有一個profile行(儘管通過拆分表,您可能仍然有一個用戶沒有配置文件)。

+0

我喜歡這種方法,因爲它每次要查詢用戶信息時都會避免加入。但是,我想知道這在數據庫規範化規則方面有多好。對此有何評論? – user3308043

0

user

user_id |user_username |user_password |user_join_date |profile_id 

profile

profile_id |first name |last name |email |age |gender 

當選擇通過用戶ID的用戶:

SELECT u.*, p.* FROM user AS u INNER JOIN `profile` AS p ON u.profile_id = p.profile_id WHERE u.user_id = 1 

但用戶應該只有一種性別,一個年齡,一個名字和姓氏。也許電子郵件地址可能很多。我建議你不需要連接具有1對1關係的表格。相反,合併這些表。

0

這是事實,有一個以上的表是一個好主意。我不確定你的訪問時間是什麼意思,但還有其他的好處。 - 您的用戶數據庫包含密碼等是「神聖的」,您永遠不會改變其結構,並將其權限(讀,寫)限制在最低限度。 - 然後你可以有幾個「衛星」表,如配置文件,私人信息等,這些表更加靈活,不敏感,並且可以隨時更改。

關於你的問題本身,沒有必要與關係單獨的表。事實上,這是一個非常糟糕的主意,它會使您的查詢複雜化,並且沒有任何優勢。相反,在您的個人資料數據庫中,您將有一列引用回用戶標識。

users 
-------- 
id 
user_name 
email 
password 


users_profiles 
--------- 
id 
user_id 
favourite_animal 
1

在用戶表ProfileId中添加一個新字段,並將其設置爲外鍵(FK)。每次創建用戶時,都必須爲其分配一個配置文件(這將是配置文件表中的ProfileId PK)。 如果您還想查看用戶的個人資料信息,你必須做一個連接

Select username, first_name,second_name 
From user u, profile p 
Where u.profileId = p.profileId 

user_profiles 
---------- 
user_id 
profiles_id 

在許多一對多的關係時使用。舉例來說,你想要給管理員一些prililages,但這些privilages也可以被更多的管理員。比,你必須創建第三個表來解決這個問題。這裏是一個例子,但你不需要這樣做 。 enter image description here