我应该规范化这张桌子吗?

时间:2011-05-16 19:35:48

标签: mysql sql database normalization

我有一个表项,用于存储从亚马逊获取的图书数据。当用户浏览网站时,此Amazon数据会插入到项目中,因此任何发生的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. 检查Publishers中的Publisher是否为SELECT Publisher_ID,否则插入它并使用mysql_insert_id()获取Publisher_ID。
  2. 检查作者中的作者选择Authors_ID,否则插入并使用mysql_insert_id()获取Authors_ID。
  3. 检查标题中的标题是否选择Title_ID,否则插入它并使用mysql_insert_id()获取Title_ID。
  4. 使用这些ID最终插入项目(实际上可能是重复项,因此整个过程本来就是浪费..)
  5. 这是否反对此表的规范化?

    注意:Items的目标是来创建一个综合的书籍数据库,以便用户说“通过Publisher X向我显示所有书籍”。 Items表仅用于为用户的搜索结果缓存Items。

4 个答案:

答案 0 :(得分:5)

考虑到你的目标,我绝对不会规范化。

答案 1 :(得分:1)

你已经回答了自己的问题 - 不要将其正常化!

答案 2 :(得分:1)

是的,如果您认为它已经存在,您应该将其标准化。但是,据我所知,它已经处于第5范式中 - 至少它似乎是基于对这些列名称的“明显”解释,如果忽略可空列。你为什么怀疑它?不确定为什么要为这些列中的某些列允许空值。

  

1.检查发布者中的发布者以选择Publisher_ID,   否则插入并使用   mysql_insert_id()获取Publisher_ID

表格中没有“Publisher_ID”。规范化与发明新的“Publisher_ID”属性无关。用“Publisher_ID”代替发布者肯定不会使它比现在更加规范化。

答案 3 :(得分:0)

在我的案例中,我唯一可以看到规范化的地方是你想要存储关于每个作者的信息。

然而 - 规范化可以帮助你 - 节省空间!特别是如果出版商,作者有很多重复(即,如果你将个别作者表格规范化)。

因此,如果您要处理数百万行,则规范化将在空间(甚至性能)方面产生影响。如果你不面对那种情况(我认为应该是这种情况),你不需要规范化。

ps - 也想到未来......会不会有需要?数据库是一个长期的基础设施......永远不要设计它们保持现在的想法。