【问题标题】:Should I normalize this table?我应该规范化这张表吗?
【发布时间】:2011-08-26 17:11:03
【问题描述】:

我有一个表 Items 存储从亚马逊获取的图书数据。当用户浏览网站时,此亚马逊数据会插入到商品中,因此发生的任何 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 ;

规范化此表可能意味着为 Titles、Authors 和 Publishers 创建表。这样做我担心的是插入会变得过于复杂。要插入单个项目,我必须:

  1. 在 Publishers 中检查 Publisher to SELECT Publisher_ID,否则插入并使用 mysql_insert_id() 获取 Publisher_ID。
  2. 在 Authors 中检查 Authors to SELECT Authors_ID,否则插入并使用 mysql_insert_id() 获取 Authors_ID。
  3. 检查 Titles 中的 Title 以 SELECT Title_ID,否则插入并使用 mysql_insert_id() 获取 Title_ID。
  4. 使用这些 ID 最终插入项目(实际上可能是重复的,所以整个过程将是浪费......)

这是否反对该表的规范化?

注意:Items 的目标不是创建一个全面的图书数据库,以便用户会说“给我看 Publisher X 的所有图书”。 Items 表仅用于缓存我的用户搜索结果的 Items。

【问题讨论】:

  • 哦,别忘了在下面打勾:]
  • 我不会,只是等待所有反馈进来

标签: mysql sql database normalization


【解决方案1】:

考虑到您的目标,我绝对不会对此进行规范化。

【讨论】:

    【解决方案2】:

    您已经回答了自己的问题 - 不要将其标准化!

    【讨论】:

      【解决方案3】:

      是的,如果您认为它还没有标准化,您应该对其进行标准化。但是,据我所知,它已经处于第 5 范式 - 至少它似乎基于对这些列名的“明显”解释,并且如果您忽略可为空的列。你为什么怀疑它?不知道为什么要允许其中一些列使用空值。

      1.在Publishers中检查Publisher to SELECT Publisher_ID, 否则插入并使用 mysql_insert_id() 获取Publisher_ID

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

      【讨论】:

        【解决方案4】:

        我可以看到规范化对您的情况有用的唯一地方是您是否要存储有关每个作者的信息。

        然而—— 标准化可以帮助您的地方 - 节省空间!特别是如果在出版商、作者方面有很多重复(也就是说,如果你对单个作者表进行规范化)。

        因此,如果您要处理数以千万计的行,规范化将在空间(甚至性能)方面产生影响。如果您没有遇到这种情况(我认为应该是这种情况),您不需要正常化。

        ps - 还要想想未来……会有需要吗?数据库是一种长期的基础设施......永远不要在设计它们时考虑到现在。

        【讨论】:

          猜你喜欢
          • 2011-07-17
          • 1970-01-01
          • 2020-05-08
          • 2011-03-04
          • 2011-02-06
          • 1970-01-01
          • 2016-11-12
          • 2018-07-08
          • 1970-01-01
          相关资源
          最近更新 更多