Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Base de datos enormes con firebird. ¿Cómo la estructuro?

Saludos al foro.
Quisiera ver si podéis orientarme según vuestra experiencia.
Tengo que crear una base de datos para almacenar muchísimos datos.
Se trata de recoger los datos que toman sensores de humedad, temperatura, lluvia y encharcamiento.
Estos datos se toman cada minuto a lo largo de las 24 del día todos los días del año y hay 30 sensores de humedad, otros tantos de lluvia y 2 ó 3 de lluvia y otro par de encharcamiento.
Total unos 70 sensores. Los datos los recoge un datalogger en formato csv (separados por puntos y comas), de ahí con una aplicación delphi los paso a una BD de Firebird.
Me he decidido por Firebird gracias a los buenos comentarios que he leído en este foro.
Ahora bien, haciendo cálculos así rápidos me salen aprox. 37 millones de entradas al año (24 horas x 60 minutos x 365 días x 70 sensores).

Estoy en la duda de hacer una tabla por sensor (sea de temperatura, humedad, etc no importa) del tipo:
Tabla: SENSORH1 (Sensor 1, tipo humedad)
Campos:
ID IDUBICACION FECHA HORA DATO
------------------------------------------------------------
1 2 14/01/2008 14:30:05 52.36
2 2 14/01/2008 14:31:00 52.46
ETC....

idubicacion enlazaría con otra tabla donde pondría datos de ubicación, etc.

Tabla2: SENSORT1 (Sensor 1 de temperatura)
Mismos campos

Y así hasta 70 tablas, una para cada sensor. Estas tablas almacenarían 1440 datos diarios (24 horas x 60 minutos).

Otra opción sería una tabla para humedad con los datos de todos los sensores de humedad, otra para temperatura, etc. con estos campos:

ID IDSENSOR FECHA HORA DATO
------------------------------------------------------------------
1 1 14/01/2008 14:30 xxx
2 2 14/01/2008 14:30 xxx
3 3 14/01/2008 14:30 xxx
etc.

idsensor enlazaría con otra tabla donde indicaría tipo de sensor, ubicación etc.

Así tendría 4 tablas (humedad, temp, lluvia y encharcamiento) con 100800 entradas diarias (24 x 60 x 70 sensores).

¿Qué opción os parece mejor para optimizar la base de datos? ¿Alguna otra alternativa? Y otra cosa: ¿Firebird puede con tantos registros? Hay que tener en cuenta que se desea crear un banco de datos de varios años (5 ó más). Para 7 años por ejemplo saldrían: (100800 x 365 x 7) = casi 256 millones de datos.

Agradeceré mucho vuestros comentarios, ya que hasta ahora he hecho muchas cosas en access, y muy pocas en firebird y con sólo algunos cientos de datos.

Utilizo Delphi 7, Firebird 2.0 y componentes MDO.

Gracias de antemano.
Responder Con Cita
  #2  
Antiguo 22-02-2008
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Una preunta importante que te debes hacer antes de seguir:
Se vana a hacer comparaciones/sumas/totales entre los sensores?

Si tienes todos los sensores en una tabla entones un selecto podría ser algo asi:

Código SQL [-]
Promedio de temperaturas de enero:
select avg(temperatura) from sensor 
where 
tipo = 'T' and 
fecha between '01/01/2008' and '01/31/2008 23:59:59'
/*y podrás acotar más la búsqueda si quieres*/

Si los tienes en diferentes tablas tendrás que hacer muchos select y sumarlos luego dentro de un procedimiento, por ejemplo.

Creo que lo mejor sería una sola tabla de esta manera

Código:
ID IDSENSOR IDUBICACION TIPO FECHA_HORA       DATO
 1      1          1      T  01/01/2008 00:01 xxxx
 2      2          5      H  01/01/2008 00:01 xxxx
 3      1          1      T  01/01/2008 00:02 xxxx
 4      2          5      H  01/01/2008 00:02 xxxx
...
Nota: El campo tipo timestamp en Firebird puede tener la fecha y la hora juntas.

Con respecto a los límites, creo que ni siquiera con 100 años llegarías a tocarlos.

Mira este link

Saludos

Última edición por duilioisola fecha: 22-02-2008 a las 16:21:01.
Responder Con Cita
  #3  
Antiguo 22-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Gracias duiliosola por tu rápida respuesta. Justo después de colgar el mensaje estaba pensando justamente esto que tú me comentas. Si tengo que hacer consultas entre los sensores, y éstos los tengo desperdigados por 70 tablas, tendré que hacer otros tantos select y luego juntarlos. Creo que tu respuesta viene en la línea de lo que había empezado a pensar: quizá sea mejor una sola tabla como tú me comentas.
Es un buen comienzo. Será cuestión de darle alguna vuelta más pero por ahí van los tiros.
En cuanto a los límites, me tranquiliza leer que no hay problema.
Gracias de nuevo.
Responder Con Cita
  #4  
Antiguo 22-02-2008
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Yo te reciomiendo que hagas un diagrama ER y esto te dara las tablas y la estructura que necesite.

Ejemplo de diagram ER (Solo un parte)
Esto es un diagram muy granular
ya que lso datos extras pordrian ser direfente
o unos tener mas o menos datos qu otro se maneja
se crea una aespecificacion la cual se manejaria
por medios de vistas
Los campo comunes a cada sensor iria en Sensores
las otras cuatros solo tendri alos datos concenniente
a ellas.

Si no me explique bien puedes leer ER.


Los Sensores Estan en una ubicacion
los sensores pueden ser De
humedad
temperatura
lluvia
encharcamiento

/\
---------n / \ n-----------
|Senores|-----/esta\-----|Ubicacion|
--------- \ / -----------
| \ /
| \/
------
|------\ES/-----------------------
| \/------------------------|
| | | |
| | | |
| | | |
| | | |
---------- ------------- ------ ----------------
|humedad| |temperatura| |lluvia| |encharcamiento|
---------- ------------- ------ ----------------

Aqui tendrias 7 tablas
======================

Sensores
--------
Id
....


Ubicacion
---------
Id
...

(Donde esta ubicado cada sensor)
R Sensores Ubicacion
--------------------
Id
IdSensor
IdUbicacion
...

(Les agrego la se para saber qu eson sensores)
S_humedad
----------
Id
IdSensor
...

S_temperatura
----------
Id
IdSensor
...

S_lluvia
----------
Id
IdSensor
...

S_encharcamiento
----------
Id
IdSensor
...

La cantidad e tablas dependera de tu diagram y cuantas cosa quieras
manejar
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
  #5  
Antiguo 22-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Gracias rastafarey por tu participación. En efecto, algo así es lo que va tomando forma en mi cabeza. ¿Podrías darme alguna referencia de dónde aprender algo más del sistema ER que me comentas? Si busco en google "ER" al ser tan corta la cadena me salen demasiadas cosas.
Una cosa que es una tontería pero que me escama; al tener tantos datos la tabla de humedad, el campo id (autoincremento y clave primaria) debe ser del tipo biginteger ¿no? Si va a almacenar cientos de millones de datos, smallint se queda corto ¿Integer también serviría?

Un saludo.
Responder Con Cita
  #6  
Antiguo 22-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
En vista del volumen de información, te recomiendo:
  • Un servidor linux, en mi experiencia, el desempeño sobre exactamente el mismo hardware es bastante superior en linux que en windows, por no hablar de la estabilidad y la seguridad en general del sistema.
  • Podes realizar procesos periódicos: nocturnos, semanales, mensuales, que procesen la información y la "mastiquen" para dejar tablas con resumenes tipo promedio, máximos, mínimos, de manera que las consultas y reportes que resumen información puedan hacerse sobre esas tablas, con lo que conseguirás una mejora MUY importante en el rendimiento de tu aplicación.
  • Aprovecha los backups diferenciales que están disponibles ahora, dado el tamaño de la base de datos, eso también ayudará en el desempeño.

Justamente hace dos días alguien hablaba de bases de datos "enormes" en este hilo (en inglés). NO dudo que lo que allí se comente te sea de utilidad.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 22-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Cita:
Empezado por Angel Fernández Ver Mensaje
¿Podrías darme alguna referencia de dónde aprender algo más del sistema ER que me comentas? Si busco en google "ER" al ser tan corta la cadena me salen demasiadas cosas.
ERM => Entity Relationship Model o Modelo Entidad Relación

Cita:
Empezado por Angel Fernández Ver Mensaje
Una cosa que es una tontería pero que me escama; al tener tantos datos la tabla de humedad, el campo id (autoincremento y clave primaria) debe ser del tipo biginteger ¿no? Si va a almacenar cientos de millones de datos, smallint se queda corto ¿Integer también serviría?
Si tomamos la parte positiva del Integer, el límite teórico de la llave sería de 2,147,483,647 (dos mil ciento cuarenta y siete millones y pico de registros)

si hablamos de treinta y siete millones anuales que producirá tu aplicación, topará mas o menos en 58 años. Nunca se sabe cuánto tiempo estará corriendo un sistema, o si te aumenten el número de sensores. Yo usaría BigInt.

Con BigInt, podrías poner un sensor por kilometro cuadrado en el planeta, y aún así tendrías para una eternidad: 9,223,372,036,854,775,807 (nueve trillones doscientos veintitres mil trescientos setenta y dos billones, treinta y seis mil ochocientos cincuenta y cuatro millones setecientos setenta y cinco mil ochocientos siete registros) (quería escribir eso ) tomando en cuenta solamente los positivos del bigint.

Te aseguro que ningún sistema de archivos actual soportará eso..

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #8  
Antiguo 22-02-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.556
Poder: 25
egostar Va camino a la fama
Cita:
Empezado por jachguate Ver Mensaje
Con BigInt, podrías poner un sensor por kilometro cuadrado en el planeta, y aún así tendrías para una eternidad: 9,223,372,036,854,775,807 (nueve trillones doscientos veintitres mil trescientos setenta y dos billones, treinta y seis mil ochocientos cincuenta y cuatro millones setecientos setenta y cinco mil ochocientos siete registros) (quería escribir eso ) tomando en cuenta solamente los positivos del bigint.
Me pregunto porque terminará en 7, será que hay algo que ver con ese número cabalistico

7 maravillas
7 nuevas maravillas
7 dias de la semana
7 dias de la creación
......

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #9  
Antiguo 22-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Se que soy de la voz de la inexperiencia pero quería saber, si no le es molestia a Angel Fernández, ¿Que otra ventaja ven o consideran si se empleara una única tabla?

Yo soy, hasta el momento, de la idea de que la base de datos sea un reflejo del dominio. Y si me pongo a pensar, yo optaría por tener una tabla de cada cosa: una para humedad, etc. Al menos me suena más lógico asi.

No se como será la perfomance de Firebird para un nivel tan alto de registros si se mantiene una tabla, a mi todavia me cuesta caer en esa elección.

Si bien es como dicen, que tener más tablas hará más lenta las consultas, creo que las cosas mantendrán cierta coherencia y orden.

Por otro lado, me pregunto ¿Es necesario que sea cada minuto? ¿En épocas de pocas lluvias, aún seguirían manteniendo esa "velocidad"? A lo que voy es si bien se necesita de cierta precisión para hacer estos tipos de estudios , que sean cada 1 minuto es una exageración. Sobre todo si consideramos que en variadas época del año los niveles tienen a mantenerse en un rango y no variar en cuestiones de minutos, algo que a gran escala pierde sentido.

¡Y que decir si los niveles son constantes! Yo me pregunto... y que haces si llegas a tener algo como esto:
HORA DATO
00:00 xxx
00:01 xxx
00:02 xxx
...
00:40 xxy
00:41 xxy
...

¿Qué tan viable es tener minuto a minuto si las condiciones no cambian?
Ten en cuenta esto... puede ahorrarte muchos registros.

En fin no se dije algo tonto, pero a mi me resulta lógico.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #10  
Antiguo 22-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Gracias a todos por vuestras respuestas.
En cuanto a lo que dice el maestro jachguate de montarlo en linux no puedo menos que decir ¡uff! ¡Más quisiera tener conocimientos para ello! La aplicación que me recoge los datos la voy a hacer en delphi 7 porque en la universidad que participa de este proyecto tienen una licencia. Estuve barajando otras posibilidades open source o freeware como Lazarus pero francamente y con todos mis respetos para este tipo de proyectos, lo veo aún a mucha distancia de D7. Yo tengo ya cierta experiencia en D7 (aunque como veis por mis mensajes sigo siendo un aprendiz) ¿En qué lenguaje lo tendría que hacer para linux? ¿Phyton, PHP, Java? En todos ellos partiría de cero y tendría que recorrer un gran camino para llegar hasta los conocimientos que ahora tengo en delphi.
Sin embargo, estoy totalmente de acuerdo en que en las universidades deberían utilizar y enseñar más sistemas abiertos y no corporativos (más linux y no tanto Office y Microsoft) porque al final le hacen a uno ser esclavo de pagar enormes licencias o la opción mas usada: piratear. Te pirateas Windows, Office, Autocad ... que es lo que enseñan en estas universidades (al menos lo que yo conozco).
Pero me estoy yendo de varas. Volviendo a mi aplicación y contestando un poco a delphius (gracias también por tu valiosa aportación) sí podría hacer una tabla para humedad y temperatura porque los datos que recogen estos sensores son muy parecidos (rango de 0 a 100 en humedad, de 0 a 400 en temperatura en ºK. En cambio el dato de lluvia y encharcamiento es boleano sí/no por lo que también podría ponerlos en otra tabla juntos. Una sola tabla para todo, podría ser, pero sería un poco raro. Quizá dos tablas: una para temperatura y humedad y otra para lluvia y encharcamiento. Pero entonces se me plantea una cosa. ¿Es mejor una sola tabla con cientos de millones de datos o varias tablas con decenas de millones de datos? Me refiero mejor en cuanto a velocidad.
En cuanto a por qué guardar un dato cada minuto, en realidad es lo que están haciendo ahora mismo y lo están guardando en ¡ficheros de excel! Con 34000 datos el fichero va cojo y lento de narices. Evidentemente estos datos no se pueden manejar, simplemente guardar para tener un histórico. La idea es hacer consultas por hora y día, de los que extraer conclusiones y resultados más abordables.
Me interesa mucho lo que comentas, jachguate, de backups diferenciales, porque obviamente el tema de copias de seguridad me preocupa bastante pero que espero abordar más adelante. Os preguntaré más cosas sobre la marcha si os parece bien.
Saludos para todos y gracias otra vez. Me estáis ayudando mucho.
Responder Con Cita
  #11  
Antiguo 23-02-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Lo que te comenta jachguate sobre Linux, se refiere al servidor.
Haces el programa en Delphi y la base de datos, en lugar de ponerla en un Windows, lo pones en un Linux, sólo has de instalar Firebird.
La conexión es igual que en windows, ejemplo:
Cita:
En Windows: 192.168.1.100:c:\datos\mibasedatos.fdb
En Linux: 192.168.1.100:/mnt/datos/mibasedatos.fdb
Responder Con Cita
  #12  
Antiguo 23-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Gracias por la aclaración Casimiro. De todas formas, mi cliente será quien decida dónde colocar la base de datos y la aplicación. Pero así a ojo, dudo mucho que sepa nada de servidores ni linux. De hecho, la base de datos está pensada en principio para trabajar en local. Tú llegas con tu pendrive con los datos que has sacado del datalogger en formato CSV, lo conectas a tú pc donde tienes la base de datos en cuestión y la aplicación y ésta saca los datos y los pone en la BD de Firebird.

Sí que hemos pensado en un futuro, conectar el datalogger a un ordenador y éste a la red, para poder acceder a los datos a través de internet en vez de estar arriba y abajo con el pendrive. Pero ahora mismo nos faltan conocimientos para hacer esto. ¿Esto se hace por IP, como la cita que pones tú Casimiro? El tiempo dirá cómo lo hacemos, pero ahora mismo, una base de datos FB y una aplicación en delphi es un salto cualitativo importantísimo teniendo en cuenta que el sistema actual de guardar datos es Excel. Somos ingenieros (no informáticos ni de sistemas) y a mí me apasiona este mundo de la programación pero me quedo en aficionado. Espero que con tiempo y vuestra ayuda ir aprendiendo

Un saludo.
Responder Con Cita
  #13  
Antiguo 23-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Angel Fernández Ver Mensaje
Volviendo a mi aplicación y contestando un poco a delphius (gracias también por tu valiosa aportación) sí podría hacer una tabla para humedad y temperatura porque los datos que recogen estos sensores son muy parecidos (rango de 0 a 100 en humedad, de 0 a 400 en temperatura en ºK. En cambio el dato de lluvia y encharcamiento es boleano sí/no por lo que también podría ponerlos en otra tabla juntos. Una sola tabla para todo, podría ser, pero sería un poco raro. Quizá dos tablas: una para temperatura y humedad y otra para lluvia y encharcamiento. Pero entonces se me plantea una cosa. ¿Es mejor una sola tabla con cientos de millones de datos o varias tablas con decenas de millones de datos? Me refiero mejor en cuanto a velocidad.
En cuanto a por qué guardar un dato cada minuto, en realidad es lo que están haciendo ahora mismo y lo están guardando en ¡ficheros de excel! Con 34000 datos el fichero va cojo y lento de narices. Evidentemente estos datos no se pueden manejar, simplemente guardar para tener un histórico. La idea es hacer consultas por hora y día, de los que extraer conclusiones y resultados más abordables.
Angel Fernández, por el tema Linux no puedo opinar, hay mentes entrenadas y sabias en el tema... yo quisiera exponer un poco de mi punto de vista.

Disculpa que lo diga, pero me resulta un poco de desperdicio estar ingresando información que es redundante. A lo que voy es que puedes implementar una regla del tipo:

Código Delphi [-]
If Dato.Humedad <> DatoAnterior.Humedad
   then begin 
            grabar(Dato.Humedad);
            DatoAnterior.Humedad = Dato.Humedad;
          end;

La explicación es simple: se compara el dato leído con el anterior (puede estar en una variable) y si son distintos guardarlos. El truco está entonces en que tu tabla guardará siempre y cuando se ha detectado un cambio (que no sea la hora claro está). Con esto consigues algo por el estilo:

HORA DATO
00:00 xxx
00:40 xxy

¿Que significa esto? que durante 40 min no se han detectado cambios.

Podrías diseñar tu sistema de manera que al migrar chequee las fechas y haga un análisis de los repetidos y te evitas la redundancia.
Es lo mismo tener esto:

00:00 xxx
...
00:39 xxx
00:40 xxy

Que tener esto:
00:00 xxx
00:40 xxy

¿Donde está el truco? En que se debe hacer una simple resta entre las horas para dectar los tiempos en que los datos han variado. Si se necesita saber los tiempos, dejaselo que te lo calcule, si fácilmente esa información puede ser "recuperada" a partir de otra. No se si me entiende...

La matemática es muy simple, y exacta.

Veamos con un ejemplo: supongamos que deseamos obtener el promedio de la temperatura de los primeros 6 minutos del día:
00:00 10
00:01 15
00:02 15
00:03 20
00:04 17
00:05 18
00:06 15

Promedio: (10+15+15+20+17+18+15)/6 = 18,33

Con la versión simplificada:
HORA DATO DIF_MIN
00:00 10 1 // la diferencia de min con el día anterior...
00:01 15 1
00:03 20 2 // 3-1
00:04 17 1
00:05 18 1
00:06 15 1

Promedio: (10x1+15x2+...+15x1)/6 = 18,33

Puede que te resulte complicado entenderme, pero si te fijas bien, el modelo "extendido" puede convivir con la versión "simplificada" si llevas ese campo DIF_MIN,

00:00 10 1
00:01 15 1
00:02 15 1
...
00:06 15 1

Y la matemática sigue cumpliendose... En teoría, no habría problemas en hacer convivir tus datos viejos con los nuevos (si es eso lo que te puede asustar). Por lo que las estadísticas y las operaciones que hagas no se verían afectadas por los repetidos.

Ahora tal vez tu me dirás, que deberá chequearse en la base de datos siempre el último valor... pero eso no es cierto, si no entendí mal nada impide que nos quedemos en alguna variable con los últimos datos cargados y allí mismo compararlos y hacer la carga de ser necesario. Y es en esta etapa cuando podemos hacer el cálculo de las diferencias, ya que contamos con dicha información.

Con esto te evitas tener que consultar la base de datos minuto a minuto y no haces lento al servidor al pedir que te haga esos cálculos de diferencia de minutos.

Realmente espero que se entienda mi idea.

Cuando se desee armar una consulta, se pueden hacer los ajustes para que los muestre como si siguieran trabajando con excel (si deseas), el truco aquí es trabajr gracias a ese dichoso campo DIF_MIN. Independientemente si se trata de una o 5 tablas, este esquema funciona.

Igualmente sigue haciendo falta análisis en el tema, pero creo que la idea está.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]

Última edición por Delphius fecha: 23-02-2008 a las 01:42:22.
Responder Con Cita
  #14  
Antiguo 23-02-2008
Angel Fernández Angel Fernández is offline
Miembro
 
Registrado: may 2004
Ubicación: Valencia - España
Posts: 141
Poder: 20
Angel Fernández Va por buen camino
Muchas gracias Delphius por tu dedicación a mi problema. Lo que propones es... muy bueno. Eres un tío grande.
Déjame que lo piense. Me has pillado recién comido y la cabeza la tengo un poco espesita.
Un saludo.
Responder Con Cita
  #15  
Antiguo 23-02-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Delphius: te lo has currado de verdad.

Aunque personalmente no lo haría por varias razones:

- No son datos repetidos, de acuerdo, se repite la temperatura, pero es a horas distintas, en un primer análisis, se podría incluso considerar la hora y temperatura como clave primaria compuesta. Tampoco lo sería, ya que introducir datos relevantes como claves de la entidad relación pueden entorpecer la lógica del negocio. Si podría crearse un índice compuesto en la base de datos, ya que siempre accederemos a ambos campos, por lo que aceleramos las búsquedas.

- Dejando los datos como estaban inicialmente, podemos delegar en simples sqls la forma de hallar las medias (leasé funciones "avg" del SQL/Firebird, y otras muchas funciones estadísticas que ya están implementadas). Si optamos por tu uso extendido, tendremos que interpretar los datos (ponderar cada dato) antes de pasarlo a la función estadística.

- Si se necesitan listados, gráficas de barras que tanto gustan a los jefes [...], resulta muchísimo más fácil tirar de la Base de datos que tener que interpretar los datos.

- Saber la temperatura de una determinada fecha y hora, nos obligaría a interpretar los datos de nuevo (porque podría estar oculto en ese dif_min).

Firebird ya es un motor bastante eficiente y rápido, si hablásemos de paradox , quizás justificaría el uso de abreviaturas.

Yo por mi parte añadiría un campo calculado de tipo TimeStamp, que se forme a partir de la fecha y de la hora. La razón muy simple, esta sql:
Código SQL [-]
select * from temp where
  fecha_completa between '01/01/2004 23:59:59.999' and '01/01/2005 23:59:59.999'
es más fácil de entender y más legible que:
Código SQL [-]
select * from temp where
  (fecha > '01/01/2004' and hora > '23:59:59.999') and 
 (fecha < '01/01/2005' and hora  < '23:59:59.999')
sin contar con otra muchas variantes que intervengan en la búsqueda.

Por otro lado, podremos usar 2 parámetros en lugar de 4 para los sqls.

Además, siempre tendremos el campo fecha y campo hora por separado (para cuando sea necesario).

Saludos.
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 23-02-2008 a las 17:57:49.
Responder Con Cita
  #16  
Antiguo 23-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Lepe Ver Mensaje
Delphius: te lo has currado de verdad.

Aunque personalmente no lo haría por varias razones:

- No son datos repetidos, de acuerdo, se repite la temperatura, pero es a horas distintas, en un primer análisis, se podría incluso considerar la hora y temperatura como clave primaria compuesta. Tampoco lo sería, ya que introducir datos relevantes como claves de la entidad relación pueden entorpecer la lógica del negocio. Si podría crearse un índice compuesto en la base de datos, ya que siempre accederemos a ambos campos, por lo que aceleramos las búsquedas.

- Dejando los datos como estaban inicialmente, podemos delegar en simples sqls la forma de hallar las medias (leasé funciones "avg" del SQL/Firebird, y otras muchas funciones estadísticas que ya están implementadas). Si optamos por tu uso extendido, tendremos que interpretar los datos (ponderar cada dato) antes de pasarlo a la función estadística.

- Si se necesitan listados, gráficas de barras que tanto gustan a los jefes [...], resulta muchísimo más fácil tirar de la Base de datos que tener que interpretar los datos.

- Saber la temperatura de una determinada fecha y hora, nos obligaría a interpretar los datos de nuevo (porque podría estar oculto en ese dif_min).

Firebird ya es un motor bastante eficiente y rápido, si hablásemos de paradox , quizás justificaría el uso de abreviaturas.
Lepe, por algo dije al final de mi mensaje que haría falta más análisis
Siempre tuve en cuenta lo que dices, de hecho es natural (y hasta se podría decir que obvio) que implementar mi idea sería un poco más "lenta" y complicada que la mantener una estructura más simple.

Yo ofrecí un punto de vista que como muchas cosas tiene su lado bueno y su lado malo. Como bien dices, si se elije mi opción habrá que interpretar la información para conseguir las operaciones.

Firebird es rápido y puede soportar la cantidad de información. Eso lo se. Yo me pregunto: ¿Que tipos de consultas se harían?¿Que informes se confeccionarían?¿Que tan problable es que se recurra a una consulta que intervenga a todos los datos?

A lo que voy es que si en las consultas no se emplean demasiados registros, podría optarse por mi método... No creo que "interpretar" los registros haga tan lento un equipo... sobre todo si las computadoras son da vez más veloces.

¿Cúantas veces al día se lanzarán las consultas? Una, dos... ¿100?
Yo creería que se puede compensar la "perdida" de tiempo en la interpretación de valores, con la cantidad de registros.

¿Cúantos registros se ahorrarían en un día?¿En una semana?¿En un mes?¿En un año? ¡Muchísimos!

Como dije, y vuelvo a decir... se necesita de un buen análisis.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #17  
Antiguo 23-02-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 27
jachguate Va por buen camino
Confirmando lo ya mencionado por casimiro, cuándo hablé de Linux me refería específicamente al servidor de base de datos y no a la aplicación que le alimentará o que sacará información de él.

Sobre el tema iniciado por Delphius, comentar que, con lo que puedo entender de la aplicación de la que hablamos, me quedo con la opción de guardar todos y cada uno de los registros en la base de datos.

Por que razón: Los discos duros y la memoria son cada vez mas baratos, mientras que el tiempo que puede requerir en desarrollo de sistemas mantener y procesar datos no planos seguramente cada vez está mas caro..

Además, añadir esa complejidad al sistema, inevitablemente hará que sea mas difícil de mantener (mas fácil cagarla, en otras palabras) y mas lento el desarrollo de informes o nuevas características.

Para evitar desperdiciar tiempo innecesariamente en procesar tantos registros, he dado la idea al inicio de hacer procesos peroódicos que vayan resumiendo la información.

Por ejemplo, pensemos en la tabla de temperaturas, que tendrá esta estructura

Código:
temperatura
=================================
ID_Temperatura  bigint
ID_Sensor       integer
Hora            Timestamp
Temperatura     double precision
De esta podría derivarse las siguientes tablas:
Código:
temperatura_hora
=================================
ID_TemHora      bigint
ID_Sensor       integer
HoraInicio      TimeStamp
HoraFin         TimeStamp
Temp_Promedio   double precision
Temp_Min        double precision
Temp_Max        double precision
moda            double precision

temperatura_dia
=================================
ID_TemDia       bigint
ID_Sensor       integer
Fecha           Date
Temp_Promedio   double precision
Temp_Min        double precision
Temp_Max        double precision
moda            double precision
Estas se podrían ir llenando en el mismo proceso que carga la información a medida que se cuente con toda la necesaria (una hora completa) o un día completo, y obviamente pueden extenderse para agregar otras estadísticas.

Así, por ejemplo, saber la temperatura promedio de un año completo para un sensor particular, en lugar de tirar sobre una consulta que barra 525,600 registros, será solamente una que barra 365 (los que ya tienen información por día). Igualmente sencillo podría ser tener la temperatura promedio para la hora de 3 a 4PM de todo un año, pero seguiría siendo igual de sencillo escribir un query que nos devuelva la temperatura promedio para las 3:14 PM de todo el año.

Ya del análisis podrá determinarse si estas tablas son suficientes o si podrían crearse otras que vayan resumiendo información por otros criterios.

Desde mi punto de vista, este modelo nos permite tener lo mejor de ambos mundos.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #18  
Antiguo 23-02-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Juan Antonio, me saco el sombrero!

Me dejaste callado, sin palabras. Habló la experiencia.

Cuando leí en tu anterior mensaje sobre esto no lo había comprendido del todo. No se en que tenía la cabeza que ni siquiera se me cruzó por preguntartelo. Ahora lo entiendo.

¡Simplemente genial!

Bueno... si me quedan algunas dudas... más que nada por curioso:
El "cálculo" de las Temp_Min, Temp_Max, Tem_Promedio. las realizarías una vez finalidado el ejercicio? O directamente con algún Tigger After Insert de la tabla Temperatura?

Tu hablas de las dos opciones, pero en base a tu experiencia... ¿Cuál optarías? Se que en parte esto depende de las necesidades, del negocio, etc... ¿pero cual eligirías en esta ocasión?

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #19  
Antiguo 23-02-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
¿double precision jachguate? ... yo es que le tengo manía a ese tipo de dato, prefiero los numeric(10,2) por aquello de no perder precisión y poder encontrar una temperatura exacta.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #20  
Antiguo 23-02-2008
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is online now
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.039
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Lepe Ver Mensaje
¿double precision jachguate? ... yo es que le tengo manía a ese tipo de dato, prefiero los numeric(10,2) por aquello de no perder precisión y poder encontrar una temperatura exacta.

Saludos
Yo siempre uso double precision
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Herramienta case para diccionario de datos de base de datos firebird mcalmanovici Firebird e Interbase 1 11-02-2007 15:17:37
Como conectarme a una base de datos hecha en firebird? JuanErasmo .NET 5 30-12-2006 18:13:03
base de datos firebird Zehcliv Conexión con bases de datos 3 04-10-2006 17:45:27
Como conectar una Base de Datos en Firebird con TSQL Conection ?? Fer Gómez Firebird e Interbase 0 08-02-2006 20:52:37
como pasar una base de datos de fotografias en access a firebird Nelly Firebird e Interbase 1 06-10-2005 17:48:45


La franja horaria es GMT +2. Ahora son las 11:35:27.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi