#mysql #sql #database #normalization
#mysql #sql #База данных #нормализация
Вопрос:
У меня есть таблица 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 ;
Нормализация этой таблицы предположительно означала бы создание таблиц для названий, авторов и издателей. Меня беспокоит, что при этом вставка станет слишком сложной.. Чтобы вставить один элемент, мне пришлось бы:
- Проверьте, чтобы издатель в Publishers выбрал Publisher_ID, в противном случае вставьте его и используйте mysql_insert_id() для получения Publisher_ID.
- Проверьте, есть ли авторы в Authors, чтобы ВЫБРАТЬ Authors_ID, в противном случае вставьте его и используйте mysql_insert_id() для получения Authors_ID.
- Проверьте наличие заголовка в Titles, чтобы ВЫБРАТЬ Title_ID, в противном случае вставьте его и используйте mysql_insert_id(), чтобы получить Title_ID.
- Используйте эти идентификаторы, чтобы окончательно вставить элемент (который на самом деле может быть дубликатом, так что весь этот процесс был бы пустой тратой времени ..)
Является ли это аргументом против нормализации для этой таблицы?
Примечание: Целью Items является не создание всеобъемлющей базы данных книг, чтобы пользователь мог сказать «Покажите мне все книги издателя X». Таблица Items просто используется для кэширования элементов для результатов поиска моих пользователей.
Комментарии:
1. О, не забудьте поставить там галочку :]
2. я не буду, просто жду, когда поступят все отзывы
Ответ №1:
Учитывая вашу цель, я определенно не стал бы это нормализовать.
Ответ №2:
Вы сами ответили на свой вопрос — не нормализуйте его!
Ответ №3:
ДА, вы должны нормализовать ее, если вы не думаете, что это уже сделано. Однако, насколько я могу судить, она в любом случае уже находится в 5-й нормальной форме — по крайней мере, кажется, что она основана на «очевидной» интерпретации имен этих столбцов, и если вы игнорируете столбцы с нулевым значением. Почему вы сомневаетесь в этом? Не уверен, почему вы хотите разрешить нули для некоторых из этих столбцов.
1. Проверьте, чтобы издатель в Publishers выбрал Publisher_ID, в противном случае вставьте его и используйте mysql_insert_id() для получения Publisher_ID
В вашей таблице нет «Publisher_ID». Нормализация не имеет ничего общего с изобретением нового атрибута «Publisher_ID». Замена «Publisher_ID» вместо Publisher, безусловно, не сделает ее более нормализованной, чем она уже есть.
Ответ №4:
Единственное место, где я вижу, что нормализация полезна в вашем случае, — это если вы хотите сохранить информацию о каждом авторе.
Однако — Где нормализация могла бы вам помочь — Экономия места! Особенно, если есть много повторений с точки зрения издателей, авторов (то есть, если вы нормализуете таблицу отдельных авторов).
Итак, если вы имеете дело с 10 миллионами строк, нормализация окажет влияние с точки зрения пространства (даже производительности). Если вы не сталкиваетесь с такой ситуацией (что, я полагаю, должно быть так), вам не нужно нормализовать.
ps — Также подумайте о будущем… будет ли когда-нибудь необходимость? Базы данных — это долгосрочная инфраструктура… никогда не создавайте их, имея в виду «сейчас».