2016-11-09 47 views
0

我是新來的關係型數據庫,並且對如何查詢和連接表有一個很好的理解。我今天的問題有一部分是由兩部分組成的問題,因爲我真的不知道該怎麼說。使用外鍵時,你總是必須加入?

  1. 通常,將具有大量列的表拆分成多個「分組數據」表是一個好主意。從查詢點來看,當不需要某些數據時它應該節省時間,並且它還使其更具可讀性。

例如,通常我會將以下所有列組合到一個表中,然後查詢所有數據,即使只使用幾列。我目前正在試驗以下數據庫結構,這些表格都將通過uid列進行鏈接。 :

上傳

  • ID
  • 標題
  • 描述
  • 電子郵件
  • 日期
  • UID

uploads_exif(一切,但UID是可選的)

  • ID
  • 孔徑
  • shutter_speed
  • 相機
  • UID

uploads_social(一切,但UID是可選的)

  • ID
  • Facebook的
  • 嘰嘰喳喳
  • 的Instagram
  • Flickr的
  • 網址
  • UID

  • 如果遵循上面列出的結構,爲了查詢我使用SQL JOINS所需的所有數據,或者有一種方法可以簡單地查詢所有表。例如,如果我需要上傳uploads_exif和uploads_social,則可以使用另一個函數在不使用JOIN的情況下簡單查詢所有這些數據,或者使用JOIN以正確方式執行此操作。

任何幫助將大大appriciated,謝謝!

+0

首先,如果表格是一個整體,並且您在那裏存儲的所有數據都是一致的,那麼將表格拆分爲多個表格並不是一個好主意。只需查詢一個好的選擇命名你想查詢的列。其次,你應該閱讀關於正常形式,這將幫助你很多。第三,有很多方法可以在沒有連接的情況下進行查詢,只是發生在連接更好的性能。 – Nambu14

+0

你是什麼意思是「是連貫的,它不是一個好主意將表格拆分成多個表格」 –

+0

如果數據是關於同一事物,並且它強烈相關,它應該在同一張表上 – Nambu14

回答

1

有很多答案到「分欄」。你的問題指出兩個案例;我認爲他們是有益的:

uploads_exif -

  • 1:1與主表(uploads)。所以,第一個傾向是說「不要分裂」,但是...
  • 許多圖片沒有exif,而且exif體積龐大,並非所有查詢都需要,所以它確實感覺將其分解成單獨的表格。
  • 擺脫id,因爲uid是獨一無二的,它可以是PRIMARY KEY。 (這將使JOIN更有效。)

uploads_social -

  • 1:1與主表(uploads)。所以,第一個傾向是說「不要分裂」,但...
  • 這真是一個「數組」的事情。不要在列上展開陣列。
  • 如果列僅爲真/假標誌,則考慮使用SET。 (並把它在主表。)
  • 如果列網址(或類似的東西),然後做一個1:多(排序):

更改爲

CREATE TABLE uploads_social (
    uid ..., 
    which ENUM('facebook', 'twitter', ...), 
    url ..., 
    PRIMARY KEY(uid, which) 
) ENGINE=InnoDB; 

(一邊)當正常化時,不要過度歸一化。不要標準化日期,浮點數或其他「連續」值。

爲什麼iduiduploads也許你應該擺脫id和促銷uidPRIMARY KEY

+0

非常感謝你,這實際上比其他答案更有幫助。 –

2

首先,你應該試着學習Third Normal Form

列心不是主要因素的數量,重要的是儘量避免重複,所以維護變得更加容易。

例如,如果你有一個表

employee: [id, first_name, last_name] 

你不會需要分割認爲成兩個表,確定這是極端,但你的想法。

employee_first: [id, first_name] 
employee_last: [id, last_name] 

另一種情況是避免重複數據。

,如果你有一個字段favorite_fruit而不是使用文本字段創建FK表並保存整數。

favorite_fruit  favorite_fruit  id fruit 
    orange     1     1 orange     
    orange     1     2 apple 
    apple   ==>  2     3 pineapple 
    pineapple    3 

節省空間,易於編輯,例如,如果你想改變orageorange juice只需要更換一次。

不知道什麼是你的情況,但例如,如果您有不同類型的upload你可以有一個主表uploadtype_id每個類型可以有細節上的分離表。

UPLOAD    |  table: [UPLOAD TYPE1]      
upload_id type_id  | upload_id [fields unique for type1] 
    xxxx  1  ==> | xxxxx ooooooo     
    yyyy  2   |===================================== 
         |  table: [UPLOAD TYPE2] 
         | upload_id [fields unique for type2] 
         | yyyyy  oooooooo 

另一個例子是員工地址。

istead添加多個領域爲building, street, zip code您創建的三個表

employee: employee_id 
    adress: address_id, building, street, zip code 
    employee_adress: employee_id, adress_id. 

這樣一個員工可以有多個地址只是增加一個分離的實體address並分配給employee使用employee_adress

+0

所以真的在我的應用程序中,似乎沒有什麼會改變,這都是用戶生成的內容。總體思路是在內容可以更新爲多行時使用規範化,而不是用於加速性能? –

+0

似乎你不需要它,但再次研究第三範式。我添加其他例子。 –

+0

因爲我只是在學習規範化和連接,所以這是個好時機來測試它嗎?會不會對我的申請造成負面影響? –

相關問題