2011-05-16 75 views
1

我有一個表存儲從亞馬遜提取的書籍數據的項目。當用戶瀏覽網站時,這個亞馬遜數據被插入到項目中,所以任何發生的INSERT都需要高效。我應該使這張桌子正常嗎?

這裏的表:

CREATE TABLE IF NOT EXISTS `items` (
    `Item_ID` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `Item_ISBN` char(13) DEFAULT NULL, 
    `Title` varchar(255) NOT NULL, 
    `Edition` varchar(20) DEFAULT NULL, 
    `Authors` varchar(255) DEFAULT NULL, 
    `Year` char(4) DEFAULT NULL, 
    `Publisher` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`Item_ID`), 
    UNIQUE KEY `Item_Data` (`Item_ISBN`,`Title`,`Edition`,`Authors`,`Year`,`Publisher`), 
    KEY `ISBN` (`Item_ISBN`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT AUTO_INCREMENT=1 ; 

規範化此表大概意味着標題,作者和出版商創建表。我有這樣擔心的是,刀片會變得過於複雜。要插入一個單一的項目,我必須:

  1. 您在出版商發佈到選擇PUBLISHER_ID,否則將其插入並使用mysql_insert_id( )獲取Publisher_ID。
  2. 檢查作者的SELECT作者ID,否則插入它並使用mysql_insert_id()獲得Authors_ID。
  3. 檢查標題中的標題以選擇Title_ID,否則插入它並使用mysql_insert_id()來獲得Title_ID。
  4. 使用這些標識的最終插入項目(這實際上可能是一個重複的,所以這整個過程將是一種浪費。)

這是否反對正常化此表?

注意:項目的目標是而不是來創建書籍的綜合數據庫,以便用戶可以說「通過發佈商X向我展示所有圖書」。 Items表僅用於爲用戶的搜索結果緩存Items。

+0

哦,不要忘記在那裏放一個複選標記:] – pixelbobby 2011-05-16 20:07:29

+1

我不會,只是等待所有的反饋進來 – babonk 2011-05-16 20:32:25

回答

5

考慮到你的目標,我肯定不會正常化這個。

1

您已回答了您自己的問題 - 請勿正常化!

0

我可以在你的情況下看到標準化的唯一地方是如果你想存儲每個作者的信息。

但是 - 哪裏正常化可以幫助你 - 節省空間!特別是如果出版商和作者有很多重複的話(也就是說,如果你將個別作者的表格歸一化)。

因此,如果您處理的是數以百萬計的行,標準化將顯示空間(即使是性能)方面的影響。如果你不面對這種情況(我相信應該是這種情況),你不需要正常化。

ps - 也想到未來...會不會有需要?數據庫是一個長期的基礎設施......從來沒有設計它們來保持現在的想法。

1

是的,你應該正常化它,如果你不認爲它已經。然而,據我所知,無論如何它已經在第五範式 - 至少它似乎是基於這些列名稱的「明顯」解釋,並且如果你忽略可爲空的列。你爲什麼懷疑它?不知道爲什麼你想允許某些列的空值。

1。檢查在出版商發佈到選擇PUBLISHER_ID, 否則將其插入並使用 mysql_insert_id()來獲取PUBLISHER_ID

沒有「PUBLISHER_ID」在表格中。規範化與發明新的「Publisher_ID」屬性無關。用「Publisher_ID」代替Publisher肯定不會使它比以前更規範。