2011-06-08 18 views
0

我有一個項目表,在確定的時間段架,正好一個星期,我需要做的要求一週的排名表,例如:表無PK

Items 
----- 
id 
name 

和:

Item_in_rank 
------------ 
item_id -> Items.id 
year 
week 
rank 

,如果我這樣做:

SELECT 
    r.rank, 
    i.* 
FROM 
    Item_in_rank AS r 
INNER JOIN 
    Items AS i 
     ON r.item_id = i.id 
WHERE 
    week = 4 AND year = 1986 
ORDER BY 
    r.rank ASC 

我得到一個排名:

rank id name 
1- 4 jhon 
2- 76 jorge 
3- 21 myriam 
4- 92 bety 

比較,我可以有一個項目在不同的周/年,我有一個清單。在這個模型中我不需要pk,但是,它是正確的嗎?

如果我定義爲PK(周,年),我不能夠有:

week year item rank 
    1 1980 41 1 
    1 1980 32 2 
etc.. 

如果我定義爲PK(周,年,項目),我需要創造周指數(,年),而PK將是無用的。

這正確嗎?或者我錯了?

回答

1

你總是需要一個PK,尤其是當你認爲你不需要的時候。 PK的目的是確保您可以隨時唯一識別一條記錄。這對數據庫無法正確執行是可選的(當你沒有PK時試着刪除dups,如果你沒有,那麼你有100%的機會會有dups)並不意味着你可能不需要其他指標也是如此。

+0

正確的是(周,年,項目)作爲PK,是一個真理獨特的idetificator。 – Exos 2011-06-08 20:57:59

0

在許多數據庫(我不確定mysql)PK更像是表上的約束。換句話說,表格就是PK。數據以PK順序存儲,但由於PK而不會顯着增大。

嘗試添加PK並查看數據存儲大小是否增加。添加二級索引(可能首先需要PK)以幫助您的查詢正常運行。

不要過多地創建一個無用的PK。自己測試一下,看看它是否值得創建。

1

如果我定義爲PK(周,年,項目)我 將需要爲 (周,年)創建索引,並且PK是 沒用。

將列添加到索引會使索引變大(壞東西),但不會減少它的用處。 MySQL可以使用(col1, col2)上的索引來搜索col1。所以通過一切手段,將您的主鍵更改爲(week, year, item)

作爲不起作用的索引示例:如果您的主鍵是(col1, col2),那麼MySQL無法使用它來搜索col2。這就像使用按lastname, firstname排序的電話簿搜索名字一樣。

這是否正確?或者我錯了?

你錯了!:)