我有一个表项,用于存储从亚马逊获取的图书数据。当用户浏览网站时,此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 ;
规范化此表可能意味着为标题,作者和发布者创建表。我担心这样做会导致插入过于复杂。要插入单个项目,我必须:
这是否反对此表的规范化?
注意:Items的目标是不来创建一个综合的书籍数据库,以便用户说“通过Publisher X向我显示所有书籍”。 Items表仅用于为用户的搜索结果缓存Items。
答案 0 :(得分:5)
考虑到你的目标,我绝对不会规范化。
答案 1 :(得分:1)
你已经回答了自己的问题 - 不要将其正常化!
答案 2 :(得分:1)
是的,如果您认为它已经存在,您应该将其标准化。但是,据我所知,它已经处于第5范式中 - 至少它似乎是基于对这些列名称的“明显”解释,如果忽略可空列。你为什么怀疑它?不确定为什么要为这些列中的某些列允许空值。
1.检查发布者中的发布者以选择Publisher_ID, 否则插入并使用 mysql_insert_id()获取Publisher_ID
表格中没有“Publisher_ID”。规范化与发明新的“Publisher_ID”属性无关。用“Publisher_ID”代替发布者肯定不会使它比现在更加规范化。
答案 3 :(得分:0)
在我的案例中,我唯一可以看到规范化的地方是你想要存储关于每个作者的信息。
然而 - 规范化可以帮助你 - 节省空间!特别是如果出版商,作者有很多重复(即,如果你将个别作者表格规范化)。
因此,如果您要处理数百万行,则规范化将在空间(甚至性能)方面产生影响。如果你不面对那种情况(我认为应该是这种情况),你不需要规范化。
ps - 也想到未来......会不会有需要?数据库是一个长期的基础设施......永远不要设计它们保持现在的想法。