2011-08-23 60 views
2

有一個父表,並與像外鍵子表時,我在想:SQL查詢加入建議

users 
id | username | password | 

users_blog 
id | id_user | blog_title 

是確定使用id作爲自動增量也連接表(users_blog),否則我將有查詢速度問題?

另外我想知道哪些字段添加爲PRIMARY,哪些作爲索引在users_blog表中?

希望的問題是明確的,對不起我的英文不好:P

+0

@guys什麼我忘了告訴大約是id_user爲1對多的關係(所以在需要時與用戶ID我將加盟),並且我還會指定user_blog表中的id auto_increment用於僅分頁user_blog表。 – sbaaaang

回答

2

我不認爲你實際上需要users_blog表中的id列。我會讓id_user成爲該表的主索引,除非您有另外的理由這樣做(也許users_blog表實際上有更多列,而您只是沒有向我們展示它)。

就性能而言,在users_blog表中具有id列不應該影響性能本身,但您的查詢永遠不會使用此索引,因爲您很可能不會選擇基於該列的數據。將id_user列作爲主索引實際上對您有利,並且會加速您的連接和選擇。

2

什麼是用戶和user_blog之間的基數?如果它是1:1,爲什麼在user_blog表中需要id字段?

+0

對不起,我忘記告訴基數是1到很多不是1:1。 – sbaaaang

1

我在users_blog上看不到有自動增量id列的問題。

主鍵可以是id_user, id。至於索引,這很大程度上取決於您的使用情況。

我懷疑你會與博客引擎有任何數據庫相關的性能問題,所以索引或不索引沒有太大的區別。

1

您不必在users_blog表中使用id列,您可以將id_user與users表一起加入。也自動增量是不是性能問題

-1
  • 這是一個好主意,有一個標識符列是自動增量 - 這保證了一種唯一標識行的方式(如果所有其他列是相同的兩行)
  • id是所有表鍵一個好聽的名字,它的標準
  • <table>_id適用於外鍵的標準名稱 - 在你的情況下使用user_id(不id_user你有)
  • MySQL的自動創建索引定義爲主鍵或外鍵的列 - 在那裏沒有必要做任何事情在這裏
  • 恕我直言,表名應該是單數 - 即userusers

你SQL應該是這個樣子:

create table user (
    id int not null auto_increment primary key, 
    ... 
); 

create table user_blog (
    id int not null auto_increment primary key, 
    id_user int not null references user, 
    ... 
); 
+0

「這是一個好主意,它有一個標識符列...保證一種唯一標識行的方式(如果所有其他列對於兩行都是相同的)」 - 因此兩個不同的用戶可以使用相同的「用戶名'和'密碼'組合,當他們中的一個登錄時,他們可以訪問其他人的賬戶?這並不意味着我是個好主意。 – onedaywhen

+0

如果您的要求是其他列集也是*唯一的,那麼在它們上定義一個唯一的索引。我在談論更多有關兩次發生的相同數據,這不是問題 - 例如,您只想選擇要刪除的數據。 – Bohemian

+0

正在討論的案例有列'username'和'password':什麼時候在這個表中複製'username'是一個好主意?我說永遠不會,因此建議在此表中使用'username'作爲唯一的關​​鍵。 – onedaywhen

2

是確定使用ID作爲自動遞增也在連接表(users_blog) 或我會有問題的查詢速度?

字段是否自動遞增不會影響您檢索數據庫中已有數據的速度。

也是我想知道哪些字段添加爲主要和其在users_blog表 INDEX?

PRIMARY KEY(和其他約束)的目的是強制數據的正確性。索引對於性能而言「僅僅」。

所以場將在PRIMARY KEY什麼取決於你希望與您的數據模型來表達:

  • 如果users_blog行標識單獨的id(即有一個「非身份」這兩個表之間的關係),將id單獨放在PRIMARY KEY中。
  • 如果通過id_userid(又名「識別」關係)的組合來識別它,那麼您將在PK中將這兩個字段放在一起。

作爲索引,這取決於您將如何訪問您的數據。例如,如果您執行多個JOIN,則可以使用考慮id_user上的索引。

索引性能產生很好的教程,可以發現:

http://use-the-index-luke.com