¿Debería normalizar esta tabla?

Tengo una tabla de artículos que almacena datos de libros obtenidos de Amazon. Estos datos de Amazon se insertan en Elementos a medida que los usuarios navegan por el sitio, por lo que cualquier INSERT que se produzca debe ser eficiente.

Aquí está la mesa:

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 ;

La normalización de esta tabla supuestamente significaría la creación de tablas para títulos, autores y editores. Mi preocupación al hacer esto es que la inserción se volvería demasiado compleja. Para insertar un solo elemento, tendría que:

  1. Busque el editor en Publishers para SELECT Publisher_ID; de lo contrario, insértelo y use mysql_insert_id () para obtener Publisher_ID.
  2. Verifique los Autores en Autores para SELECCIONAR Authors_ID, de lo contrario insértelo y use mysql_insert_id () para obtener Authors_ID.
  3. Verifique el título en títulos para SELECT Title_ID, de lo contrario insértelo y use mysql_insert_id () para obtener Title_ID.
  4. Use esos ID para finalmente insertar el elemento (que de hecho puede ser un duplicado, por lo que todo este proceso habría sido un desperdicio)

¿Eso argumenta en contra de la normalización de esta tabla?

Nota: el objetivo de los elementos es no es para crear una base de datos completa de libros, de modo que un usuario diga "Muéstrame todos los libros de Publisher X". La tabla Elementos solo se usa para almacenar elementos en caché para los resultados de búsqueda de mis usuarios.

preguntado el 16 de mayo de 11 a las 19:05

Oh, no olvides poner una marca de verificación allí:] -

No lo haré, solo espero a que lleguen todos los comentarios.

4 Respuestas

Considerando tu objetivo, definitivamente no quisiera normaliza esto.

contestado el 16 de mayo de 11 a las 23:05

Has respondido tu propia pregunta, ¡no la normalices!

contestado el 16 de mayo de 11 a las 23:05

SÍ, debería normalizarlo si no cree que ya lo esté. Sin embargo, por lo que puedo decir, ya está en la quinta forma normal de todos modos, al menos parece estar basado en la interpretación "obvia" de esos nombres de columna y si ignora las columnas que aceptan valores NULL. ¿Por qué lo dudas? Sin embargo, no estoy seguro de por qué desea permitir valores nulos para algunas de esas columnas.

1.Compruebe el editor en Publishers para SELECT Publisher_ID, de lo contrario insértelo y use mysql_insert_id () para obtener Publisher_ID

No hay "Publisher_ID" en su tabla. La normalización no tiene nada que ver con la invención de un nuevo atributo "Publisher_ID". Sustituir un "Publisher_ID" en lugar de Publisher ciertamente no lo normalizaría más de lo que ya está.

contestado el 17 de mayo de 11 a las 00:05

El único lugar donde puedo ver la normalización útil en su caso es si desea almacenar información sobre cada autor.

Sin embargo - Donde la normalización podría ayudarlo - ¡Ahorrando espacio! Especialmente si hay mucha repetición en términos de editores, autores (es decir, si normaliza la tabla de autores individuales).

Entonces, si está tratando con decenas de millones de filas, la normalización mostrará un impacto en términos de espacio (incluso rendimiento). Si no te enfrentas a esa situación (que creo que debería ser el caso), no necesitas normalizarte.

PD - Piensa también en el futuro ... ¿alguna vez habrá una necesidad? Las bases de datos son una infraestructura a largo plazo ... nunca las diseñe teniendo en cuenta el ahora.

contestado el 16 de mayo de 11 a las 23:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.