Должен ли я нормализовать эту таблицу? - PullRequest
1 голос
/ 16 мая 2011

У меня есть таблица Items, в которой хранятся данные выбранных книг из Amazon. Эти данные Amazon вставляются в элементы по мере того, как пользователи просматривают сайт, поэтому любая ВСТАВКА, которая происходит, должна быть эффективной.

Вот таблица:

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. Проверьте, чтобы Авторы в Авторах ВЫБИРАЛИ Authors_ID, в противном случае вставьте его и используйте mysql_insert_id (), чтобы получить Authors_ID.
  3. Проверьте заголовок в заголовках, чтобы ВЫБЕРИТЬ Title_ID, в противном случае вставьте его и используйте mysql_insert_id (), чтобы получить Title_ID.
  4. Используйте эти идентификаторы для окончательной вставки предмета (который на самом деле может быть дубликатом, поэтому весь этот процесс был бы бесполезным).

Это противоречит нормализации для этой таблицы?

Примечание: цель Предметов - , а не , чтобы создать всеобъемлющую базу данных книг, чтобы пользователь сказал: «Покажите мне все книги Издателя X». Таблица «Предметы» просто используется для кэширования «Предметов» для результатов поиска моих пользователей.

Ответы [ 4 ]

5 голосов
/ 16 мая 2011

Учитывая вашу цель, я определенно не нормализую это.

1 голос
/ 17 мая 2011

ДА, вы должны нормализовать это, если вы не думаете, что это уже.Однако, насколько я могу судить, он все равно уже находится в 5-й нормальной форме - по крайней мере, кажется, что он основан на «очевидной» интерпретации названий этих столбцов и если вы игнорируете пустые столбцы.Почему вы сомневаетесь в этом?Не уверен, почему вы хотите разрешить пустые значения для некоторых из этих столбцов.

1.Проверьте для Publisher в Publishers значение SELECT Publisher_ID, в противном случае вставьте его и используйте mysql_insert_id () для получения Publisher_ID

В вашей таблице нет "Publisher_ID".Нормализация не имеет ничего общего с изобретением нового атрибута «Publisher_ID».Подстановка «Publisher_ID» вместо «Publisher» определенно не сделает его более нормализованным, чем он есть.

1 голос
/ 16 мая 2011

Вы ответили на свой вопрос - не нормализуйте его!

0 голосов
/ 16 мая 2011

Единственное место, где я могу увидеть нормализацию, полезную в вашем случае, это если вы хотите хранить информацию о каждом авторе.

Однако - Где нормализация может помочь вам - Экономия места! Особенно если много повторений с точки зрения издателей, авторов (то есть, если вы нормализуете таблицу отдельных авторов).

Так что, если вы имеете дело с десятками миллионов строк, нормализация покажет влияние с точки зрения пространства (даже производительности). Если вы не сталкиваетесь с такой ситуацией (что, я считаю, должно иметь место), вам не нужно нормализоваться.

ps. Также подумайте о будущем ... будет ли когда-нибудь необходимость? БД - это долгосрочная инфраструктура ... никогда не проектируйте их, помня о текущем.

...