2011-05-16 42 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肯定不会使它比以前更规范。

相关问题