2011-03-19 106 views
0

我是數據庫的新手,但我已經瀏覽了一些教程並學習了大部分基本知識(我是一個很長時間的程序員)。但是,我需要一些幫助來解決關係數據庫的侷限性。如果我有一個畫面,我可以爲它創建一個簡單的表作爲這樣整個表的mysql外鍵

"CREATE TABLE picture(
file VARCHAR(150), 
rating INT 
)"; 

如果我想跟蹤誰在圖片的價格,我既可以硬編碼的預設號碼,像這樣的選民(在此例如3次匿名投票)

"CREATE TABLE picture(
file VARCHAR(150), 
rating INT, 
vote1 INT, 
vote2 INT, 
vote3 INT 
)"; 

或者無限數量的,我可以創建新表這樣

"CREATE TABLE ratingTemplate 
(
rater INT, 
rating INT 
)"; 

但針對畫面中的表中的每個畫面進入我希望有這整個的引用[R atingTemplate表。有沒有適當的方式來使用外鍵來實現這一點?目前,我通過創建新的評分模板表並確保將其名稱存儲在相應的圖片表條目中對其進行微操作。

回答

2

是的,你將不得不有一個表,保持引用圖片表以及用戶表。

CREATE TABLE IF NOT EXISTS PICTURE (
    PICTURE_ID BIGINT NOT NULL AUTO_INCREMENT, 
    FILE   VARCHAR(250), 
    PRIMARY KEY (PICTURE_ID) 
); 

CREATE TABLE IF NOT EXISTS USER (
    USER_ID  BIGINT NOT NULL AUTO_INCREMENT, 
    --....REST OF COLUMNS HERE... 

    PRIMARY KEY(USER_ID) 
); 

CREATE TABLE IF NOT EXISTS PICTURE_RATING (
    RATING_ID  BIGINT NOT NULL AUTO_INCREMENT, 
    PICTURE_ID BIGINT NOT NULL, 
    USER_ID  BIGINT NOT NULL, 
    RATING  DOUBLE, 

    PRIMARY KEY (RATING_ID), 
    FOREIGN KEY (PICTURE_ID) REFERENCES PICTURE(PICTURE_ID), 
    FOREIGN KEY (USER_ID) REFERENCES USER(USER_ID) 
); 
+0

我看你做了什麼沒有。出於某種原因,我從來沒有想過它。您將所有評級放入RATING表中,並使用主要(外國)密鑰爲圖片和用戶查詢正確的評級子集。這對搜索速度有什麼影響?對於專用(但是微管理)的表格,搜索時間爲零,而對於所有N個條目都必須進行搜索,是正確的?更重要的是,SQL的搜索速度有多快,例如1,000,000行?謝謝 – puk 2011-03-19 15:10:51

+0

外鍵需要picture_rating表中的索引,因此執行搜索實際上相對較快,對於1,000,000行,您可以在查找所需的行之前進行5或6次查找。 – 2011-03-19 15:34:17

+0

太棒了,這就像一個魅力。但是我注意到你應該添加PICTUR_RATING或其他任何其他的引擎,否則你不包括'ENGINE = InnoDB'?謝謝。 – puk 2011-03-19 15:42:00

0

您尚未確定'圖片'表的主鍵,但是如所介紹的那樣,主鍵將顯示爲'文件'列。您需要將一列添加到名爲'file'的'ratingTemplate'表中,該表也將是varchar(150。'ratingTemplate'中的主鍵將是'file'和'rater'的組合。'file ratingTemplate'列'表將是一個foriegn關鍵‘圖片‘表文件’詮釋他列’

示例查詢:

SELECT picture.file, rater, rating 
FROM picture INNER JOIN ratingTemplate ON picture.file = ratingTemplate.file 
WHERE picture.file = 'filenameiwant' 

另一種方法是添加一個代理主鍵到'圖片'表 也許命名爲'FileId'爲整數,在這種情況下,您可以使用'ratingTemplate'中的'FileId'列作爲foriegn鍵而不是'file'。執行速度更快,佔用空間更小

樣品查詢:

FROM picture INNER JOIN ratingTemplate ON picture.FileId = ratingTemplate.FileId 
WHERE picture.FileId = 257