2011-05-14 16 views
6

Estoy construyendo esta herramienta para clasificar datos. Básicamente estaré recibiendo regularmente filas de datos en un archivo plano que se ven así:opiniones y consejos sobre la estructura de la base de datos

a:b:c:d:e 
a:b:c:d:e 
a:b:c:d:e 
a:b:c:d:e 

Y tengo una lista de categorías de romper estas filas arriba en, por ejemplo:

Original Cat1 Cat2 Cat3 Cat4 Cat5 
--------------------------------------- 
a:b:c:d:e a  b  c  d  e 

A partir de este momento, se conocen los nombres de las categorías, así como el número de categorías para desglosar los datos. Pero esto podría cambiar con el tiempo (por ejemplo, categorías añadidas/eliminadas ... el número total de categorías cambiadas).

Bien, así que realmente no estoy buscando ayuda sobre cómo analizar las filas o cómo obtener datos en una base de datos o algo ... Sé cómo hacer todo eso, y tengo el script central escrito en su mayoría, para manejar analizar filas de valores y separar en cantidad variable de categorías.

Principalmente estoy buscando consejos sobre cómo estructurar mi base de datos para almacenar esto. Así que he estado pensando en ello, y esto es lo que ocurrió:

Table: Generated 
generated_id  int   - unique id for each row generated 
generated_timestamp datetime  - timestamp of when row was generated 
last_updated  datetime  - timestamp of when row last updated 
generated_method varchar(6) - method in which row was generated (manual or auto) 
original_string  varchar (255) - the original string 

Table: Categories 
category_id   int   - unique id for category 
category_name  varchar(20) - name of category 

Table: Category_Values 
category_map_id  int   - unique id for each value (not sure if I actually need this) 
category_id   int   - id value to link to table Categories 
generated_id  int   - id value to link to table Generated 
category_value  varchar (255) - value for the category 

Básicamente, la idea es cuando analizar una fila, voy a insertar una nueva entrada en la tabla Generated, así como las entradas X en la tabla Category_Values, donde X es sin embargo muchas categorías que hay actualmente. Y los nombres de categoría se almacenan en otra tabla Categories.

Lo que mi script inmediatamente hará es procesar las filas de los valores sin procesar y generar los valores de la categoría generada en un nuevo archivo que se enviará a alguna parte. Pero luego tengo este DB. Estoy haciendo para almacenar los datos generados para que pueda hacer otro script, donde puedo buscar y enumerar valores generados previamente, o actualizar entradas generadas previamente con nuevos valores o lo que sea.

¿Esto parece una buena estructura de base de datos? ¿Algo obvio que me estoy perdiendo o que potencialmente me estoy engarzando? Por ejemplo, con esta estructura ... bueno ... yo no soy un experto en SQL, pero creo que debería ser capaz de hacer como

select * from Generated where original_string = '$string' 
// id is put into $id 

y luego

select * from Category_Values where generated_id = '$id' 

... y luego tendré mis datos para trabajar con los resultados de búsqueda o formulario para alterar los datos ... bueno, estoy bastante seguro de que incluso puedo combinar esto en una consulta con una combinación o algo, pero no soy tan bueno con sql así que no sé cómo hacer eso ... pero el punto es que sé que puede hacer lo que necesito de esta estructura db ... ¿pero estoy haciendo esto más difícil de lo necesario? ¿Haciendo algún obvio error novato?

+2

bienvenido a stackoverflow, pregunta muy agradable, buen diseño y un montón de fondo. – Johan

+2

FWIW: selecciona * de Category_Values ​​donde generated_id in (selecciona generated_id de Generated donde original_string = '$ string') – Jeremiah

+0

Gracias Jeremiah, lo escribiré :) – slinkhi

Respuesta

1

Mi sugerencia:

Table: Generated 
id     unsigned int autoincrement primary key 
generated_timestamp timestamp 
last_updated  timestamp default '0000-00-00' ON UPDATE CURRENT_TIMESTAMP 
generated_method ENUM('manual','auto') 
original_string  varchar (255) 

Table: Categories 
id     unsigned int autoincrement primary key 
category_name  varchar(20) 

Table: Category_Values 
id     unsigned int autoincrement primary key 
category_id   int   
generated_id  int   
category_value  varchar (255) - value for the category 
    FOREIGN KEY `fk_cat`(category_id) REFERENCES category.id 
    FOREIGN KEY `fk_gen`(generated_id) REFERENCES generated.id 

Enlaces
marcas de tiempo: http://dev.mysql.com/doc/refman/5.1/en/timestamp.html
Crear sintaxis de tablas: http://dev.mysql.com/doc/refman/5.1/en/create-table.html
enumeraciones: http://dev.mysql.com/doc/refman/5.1/en/enum.html

+0

¡Gracias! Sí, en realidad iba a hacer que los tipos de columna fueran similares, como incrementos automáticos para ID y demás. No estoy del todo seguro del propósito de algunas de esas cosas (como la clave foriegn/referencias) pero puedo investigar lo suficiente para averiguarlo. – slinkhi

1

Creo que esta solución es perfecto para lo que quieres hacer .La lista de categorías ahora es flexible, por lo que puede agregar nuevas categorías o retirar antiguas (recomendaría pensarlo detenidamente antes de aceptar eliminar una categoría; ¿podría grabar o eliminar también, etc.)

Básicamente, estoy diciendo que tienes razón en el objetivo. La estructura es simple pero funcionará bien para ti. Buen trabajo (y excelente trabajo dando exactamente la cantidad correcta de información en la pregunta).

+0

Gracias :) .. Realmente no tengo influencia sobre los nombres de categoría o cuántos habrá. El cliente básicamente ha estado creando manualmente archivos de salida en Excel a lo largo de los años y me ha contratado para automatizar el proceso. Así que sé, en base a su historial, que las categorías no cambiarán a menudo, pero a veces cambian, porque las necesidades comerciales cambian. Y en general, básicamente se trata de desglosar el valor original y crear clasificaciones, por lo que, básicamente, solo se observan los mismos datos de diferentes maneras, y la (re) clasificación es retroactiva, por lo que no es * una gran oferta cuando cambia. – slinkhi

Cuestiones relacionadas