Adicionar días/horas/minutos/segundos a fechas en Oracle
Cuando de trabajar con fechas en Oracle se trata, se debe tener en cuenta que la aritmética de fechas en Oracle trabaja en función de un día. Aunque podemos trabajar con cualquier fecha, para hacerlo más fácil realizaré la labor con la pseudo-columna SYSDATE. Si bien sabemos, SYSDATE muestra la fecha y hora actual de sistema, sumando 1 (uno) a SYSDATE se aumentará la fecha y hora actual en un día. Se pueden usar fracciones para añadir horas, minutos o segundos a la fecha:
SYSDATE SYSDATE+1 SYSDATE+1/24
------------------- ------------------- -------------------
18-02-2010 09:26:44 19-02-2010 09:26:44 18-02-2010 10:26:44
SYSDATE SYSDATE+1/1440 SYSDATE+1/86400
------------------- ------------------- -------------------
18-02-2010 09:26:44 18-02-2010 09:27:44 18-02-2010 09:26:45
Algunos ejemplos que pueden servir para aclarar el uso de fracciones, teniendo presente que 1 día = 24 horas = 1440 minutos = 86400 segundos:
Fecha y hora actual |
sysdate
|
Dia siguiente (24 Horas adelante) | sysdate + 1 |
12 días delante | sysdate + 12 |
2 Horas adelante | sysdate + 2 / 24 |
120 Minutos adelante | sysdate + 120 / 1440 |
15 Segundos adelante | sysdate + 15 / 86400 |
Día siguiente a las 9 AM | TRUNC(sysdate) + 1 + 9/24 |
Próximo martes a las 3 PM | NEXT_DAY(TRUNC(sysdate), 'TUESDAY') + 15/24 |
Ultimo dia del mes a las 10:30 AM | LAST_DAY(TRUNC(sysdate)) + 10/24 + 30/1440 |
Próximo Martes, Jueves o Domingo a las 8:05 AM | TRUNC(LEAST(NEXT_DAY(sysdate, 'TUESDAY'), NEXT_DAY(sysdate, 'THURSDAY'), NEXT_DAY(sysdate, 'SUNDAY'))) + 8/24 + 5/1440 |
Cómo crear un usuario y asignarle permisos en PostgreSQL
Tutorial de PostgreSQL para crear usuarios, crear bases de datos con un usuario específico como propietario y asignación de permisos a una base de datos.
Este nantoturial enseña cómo crear un usuario en el motor de base de datos PostgreSQL, así como crear bases de datos y asignación de permisos a nuevos usuarios.
PostgreSQL es unos de los motores de base de datos más robusto en el mundo de Open Source. Su flexibilidad y estabilidad le hacen una de las mejores alternativas a utilizar.
Algo muy importante en cualquier motor de base de datos son los privilegios de usuarios, veamos a continuación algunas de las opciones posibles.
Abrir un cliente de PostgreSQL
Para poder desarrollar este nanotutorial necesitamos tener disponible una sesión cliente en un servidor PostgreSQL. Para esto debemos iniciar el cliente con el siguiente comando:
psql -U postgres -h localhost -W
Si no posees una instalación de PostgreSQL como servidor, te invitamos a que la hagas a través de este nanotutorial: Instalación de PostgreSQL Server.
Crear usuario
Para crear un usuario lo haremos con el siguiente comando:
CREATE USER nanotutoriales PASSWORD 'password';
Eliminar usuario
Si deseamos eliminar un usuario debemos ejecutar el siguiente comando:
DROP USER nanotutoriales;
ALTER ROLE
El manejo de roles en PostgreSQL permite diferentes configuraciones, entre ellas estan:
- SUPERUSER/NOSUPERUSER. Super usuario, privilegios para crear bases de datos y usuarios.
- CREATEDB/NOCREATEDB. Permite crear bases de datos.
- CREATEROLE/NOCREATEROLE. Permite crear roles.
- CREATEUSER/NOCREATEUSER. Permite crear usuarios.
- LOGIN/NOLOGIN. Este atributo hace la diferencia entre un rol y usuario. Ya que el usuario tiene permisos para acceder a la base de datos a traves de un cliente.
- PASSWORD. Permite alterar la contraseña.
- VALID UNTIL. Expiración de usuarios.
Para cambiar la configuracion de un usuario o rol debemos ejecutar el siguiente comando.
ALTE ROLE <nombre del rol> WITH <opciones>
Asignar permisos de super usuario a un usuario
El permiso de super usuario es el mas alto. Con este usuario se podrán administrar todos los objetos del motor de base de datos.
Para asignar este privilegio a un rol lo hacemos con el siguiente comando:
ALTER ROLE nanotutoriales WITH SUPERUSER;
Cambiar la contraseña de un usuario
Para cambiar la contraseña de un usuario es necesario ejecutar el siguiente comando:
ALTER ROLE nanotutoriales WITH PASSWORD 'nuevopassword';
Crear una base de datos con un usuario específico como propietario
Todas las bases de datos que creamos con un usuario que tenga los privilegios CREATEDB automáticamente asignan como propietario al usuario mismo. Si lo que queremos crear es un usuario limitado, la forma de crearlo con una base de datos específica será:
CREATE DATABASE nanotutoriales_website WITH OWNER nanotutoriales;
Asignar todos los permisos a un usuario a una base de datos existente
Cuando recien hemos creado un usuario y queremos darle permisos a una base de datos existente, podemos utilizar el siguiente comando:
GRANT ALL PRIVILEGES ON DATABASE nanotutoriales_website TO nanotutoriales;
Bases de datos relacionales vs. no relacionales: ¿qué es mejor?
Es muy común entre desarrolladores de aplicaciones encontrarse en una situación de tener que elegir si se va a usar una base de datos relacional o no relacional. La mayoría no se lo piensa demasiado y opta por la opción que más conocen y con la que más cómodos trabajan. Tampoco es una decisión catastrófica; en realidad, ya sea la base de datos relacional o no, se puede construir cualquier cosa.
Vale, entonces, ¿por qué es importante saber en qué se diferencian y cuál deberíamos usar en cada caso? Pues porque un buen diseño de base de datos con la tecnología apropiada indudablemente aporta calidad al proyecto. Dependiendo de la naturaleza de la aplicación, interesa que la base de datos tenga unas características u otras.
Un poco de historia
Las bases de datos relacionales o de lenguaje de consulta SQL se empezaron a usar en los años 80 y a día de hoy siguen siendo la opción más popular. En cambio, las bases de datos no relacionales o de lenguaje de consulta NoSQL solo están empezando a ser más populares en los últimos años. Entre 2012 y 2015, hubo un crecimiento importante en el uso de este tipo de bases de datos. Y aunque desde 2016 su racha se ha quedado un poco estancada, siguen siendo también muy populares.
Bases de datos relacionales
El principio de las bases de datos relacionales se basa en la organización de la información en trozos pequeños, que se relacionan entre ellos mediante la relación de identificadores.
En el ámbito informático se habla mucho de ACID, cuyas siglas vienen de las palabras en inglés: atomicidad, consistencia, aislamiento y durabilidad. Son propiedades que las bases de datos relacionales aportan a los sistemas y les permiten ser más robustos y menos vulnerables ante fallos.
La base de datos relacional más usada y conocida es MySQL junto con Oracle, seguida por SQL Server y PostgreSQL, entre otras.
Bases de datos no relacionales
Como su propio nombre indica, las bases de datos no relacionales son las que, a diferencia de las relacionales, no tienen un identificador que sirva de relación entre un conjunto de datos y otros. Como veremos, la información se organiza normalmente mediante documentos y es muy útil cuando no tenemos un esquema exacto de lo que se va a almacenar.
La indiscutible reina del reciente éxito de las bases de datos no relacionales es MongoDB seguida por Redis, Elasticsearch y Cassandra.
Formatos
La información puede organizarse en tablas o en documentos. Cuando organizamos información en un Excel, lo hacemos en formato tabla y, cuando los médicos hacen fichas a sus pacientes, están guardando la información en documentos. Lo habitual es que las bases de datos basadas en tablas sean bases de datos relacionales y las basadas en documentos sean no relacionales, pero esto no tiene que ser siempre así. En realidad, una tabla puede transformarse en documentos, cada uno formado por cada fila de la tabla. Solo es una cuestión de visualización.
Los dos esquemas de la imagen contienen exactamente la misma información. Lo único que cambia aquí es el formato: cada documento de la figura de la derecha es una fila de la figura de la izquierda.
Se ve más claro en la tabla, ¿verdad? Lo que pasa es que a menudo en una base de datos no relacional una unidad de datos puede llegar a ser demasiado compleja como para plasmarlo en una tabla. Por ejemplo, en el documento JSON de la imagen que se muestra a continuación, al tener elementos jerárquicos, es más difícil plasmarlo en una tabla plana. Una solución sería plasmarlo en varias tablas y, por tanto, necesitar de relaciones.
[
{
"student_id":1,
"age":12,
"subjects":{
"mathematics":{
"scores":[7,8,7,10],
"final_score":8
},
"biology":{
"scores":[6,6,5,7],
"final_score":6
}
}
}
]
Esto explica por qué las bases de datos relacionales suelen servirse de tablas y las no relacionales de documentos JSON. En cualquier caso, a día de hoy, las bases de datos más competitivas suelen permitir, de una forma u otra, operaciones de los dos tipos. Por ejemplo, el servicio de base de datos en la nube BigQuery que ofrece Google es, en principio, una base de datos de lenguaje de consulta SQL, por lo que permite fácilmente relacionar varias tablas, pero, a su vez, permite insertar elementos jerárquicos JSON, más propios de bases de datos no relacionales.
La diferencia entre el éxito y el fracaso recae, sobre todo, en el diseño del modelo. Es decir, si se decide que el mejor enfoque es usar una base de datos relacional, no es suficiente con meter la información a lo bruto en una base de datos relacional y esperar a que se relacione sola, porque eso no va a ocurrir. De nada sirve elegir la base de datos más apropiada para nuestro sistema, si luego no se hace un buen diseño.
¿Un poco perdidos? ¡Pasemos a la acción!
Ejemplo práctico: base de datos relacional
Imaginemos que tenemos una plataforma online que ofrece cursos de idiomas. Los clientes contratan o se suscriben al idioma y al nivel que más les puede interesar, y, además, tienen la opción de elegir qué tipo de suscripción quieren: mensual, trimestral o anual. Y dependiendo de esta opción, se les aplicará un descuento u otro.
El primer diseño de base de datos que propongo es una tabla donde cada fila corresponde con un servicio contratado por un cliente. Toda la información está contenida en una sola tabla, por tanto, no es relacional.
fecha | cliente | idioma | nivel | suscripción | precio | descuento_% | precio final |
---|---|---|---|---|---|---|---|
25/06/2018 | Pedro | Inglés | Intermedio | Mensual | 7 | 0 | 7 |
25/06/2018 | Pedro | Chino | Principiante | Mensual | 9 | 0 | 9 |
01/07/2018 | Aurelia | Francés | Avanzado | Anual | 8 | 25 | 6 |
03/07/2018 | Federico | Inglés | Intermedio | Trimestral | 7 | 10 | 6.3 |
Problemas que podemos encontrar con este modelo
- No sabemos si el Pedro de la primera fila es el mismo cliente que el Pedro de la segunda fila o si son dos clientes con el mismo nombre. Sí, podríamos incluir el e-mail para que haga de identificador único, pero es una solución cogida con pinzas.
- Si algún precio o descuento cambia, hay que modificarlo en todas las filas en las que aparece y, si no se hace correctamente, puede dar lugar a discrepancias. No tiene sentido que la información esté duplicada de esta manera.
- Si un cliente cambia su suscripción, habría que cambiar tanto el campo de suscripción como el precio. Y también puede dar lugar a discrepancias si no se hace correctamente.
- Al tener la columna de “precio final” se está duplicando información, ya que se puede calcular fácilmente con las columnas “precio” y “descuento_%”. Esto también puede dar lugar a discrepancias.
- No hay manera de saber qué idiomas y niveles hay disponibles, ni cuál es su precio hasta que alguien lo contrate.
¿Cómo solucionamos todos estos problemas?
Parece que esta situación está pidiendo a gritos un diseño de base de datos relacional, donde se recoja la información en varias tablas y no solo en una.
Empezamos con la primera tabla; esta contendrá solamente la información del cliente.
cliente_id | nombre_cliente |
---|---|
1 | Pedro |
2 | Aurelia |
3 | Federico |
Por otro lado tenemos la tabla contenedora de las clases disponibles. Cada una con su nivel y precio base.
programa_id | idioma | nivel | precio |
---|---|---|---|
1 | alemán | principiante | 7 |
2 | chino | principiante | 9 |
3 | francés | avanzado | 8 |
4 | inglés | intermedio | 7 |
En esta tabla podemos ver todos los cursos disponibles. En el diseño principal, como nadie se había suscrito al curso de alemán, ni siquiera podíamos saber que existía.
A este precio base luego se descontará un porcentaje, según la suscripción que los clientes elijan.
suscripcion_id | tipo | descuento_% |
---|---|---|
1 | Mensual | 0 |
2 | Trimestral | 10 |
3 | Anual | 25 |
Y por último, tenemos la tabla que relaciona todo: a cada cliente con la clase o clases contratadas y el tipo de suscripción.
id | cliente_id | programa_id | suscripcion_id |
---|---|---|---|
1 | 1 | 4 | 1 |
2 | 1 | 2 | 1 |
3 | 2 | 3 | 3 |
4 | 3 | 4 | 2 |
Pedro, que es el cliente con identificador 1, se había suscrito mensualmente (id=1) a inglés intermedio (id=4) y chino principiante (id=2). Por eso, en las dos filas en las que el identificador de cliente “client_id” es 1, el identificador de programa es 4 y 2, y el identificador de suscripción es un 1.
Fijaos también que no hemos apuntado el precio final en ningún lado. No es necesario, ya que, conociendo el precio del programa y el descuento de la suscripción elegida, se puede calcular de inmediato. Y así evitaremos duplicidad y la posibilidad de discrepancias en nuestros datos.
¡Y ya lo tenemos! No es tan difícil, ¿no?
Antes de continuar, os propongo un ejercicio: ¿cómo haríais para incluir la posibilidad de tener cupones de descuento? Pensad que estos cupones son canjeables por cada curso que se contrata y cada uno puede proporcionar un descuento diferente.
Ejemplo práctico: bases de datos no relacionales
Quizá os estéis preguntando “si las bases de datos relacionales son tan prácticas, ¿en qué situaciones es buena idea trabajar con las no relacionales?”. Si algo tienen de malo las bases de datos relacionales, es que son como Sheldon Cooper, tienen que saber de antemano qué es y cómo es lo que van a almacenar. En cambio, las bases de datos no relacionales son más flexibles, se lo tragan todo, sin importar su estructura.
Imaginemos que hemos mandado unas máquinas al espacio para que nos reporten qué es lo que encuentran en su viaje. Obviamente, no sabemos a ciencia cierta qué se van a encontrar. De alguna forma, tienen una inteligencia artificial instalada que reconoce los objetos con los que se va encontrando y también tienen sensores instalados. Pero no sabemos bien qué miden, ya que cada máquina tiene sensores diferentes. Cada 24 horas envían un resumen de lo que han visto durante el día.
{
"maquina_id":1,
"timestamp":149992693000,
"coordenadas":"75988823.567, 55375867.098, 12676444.311",
"encontrado":[
"roca",
"agua",
"roca",
"roca",
"algo que parece un animal",
"roca"
],
"temperatura":{
"min":-50,
"max":-49
},
"ruido":{
"min":72,
"max":4549
}
}
{
"maquina_id":2,
"timestamp":1499925677000,
"coordenadas":"66635675.920, 78021134.727, 53580995.751",
"temperatura":{
"min":-50,
"max":-49
},
"humedad":{
"min":2%,
"max":5%
}
}
Cada uno de estos documentos JSON contiene la información reportada en cada envío por cada máquina. La máquina con identificador 1 está reportando datos de temperatura y ruido, mientras que la de identificador 2 reporta temperatura y humedad. No sabemos qué sensores tendrá instalados la siguiente y, mucho menos, qué y cómo reportarán las máquinas que aún no se han mandado y los ingenieros están montando.
No merece la pena ponerse a diseñar una base de datos relacional para almacenar esta información. En este caso, lo mejor es dejar a una base de datos no relacional que se trague todo lo que las máquinas reportan, tal cual.
Además, la finalidad del sistema es meramente científica y no se contempla la existencia de usuarios a los que se les deba la garantía de consistencia que ofrecen las bases de datos SQL. Simplemente, se quiere almacenar todo para un futuro análisis.
Una vez almacenados en la base de datos no relacional se podrá pedir y visualizar la información de diferentes maneras. Y si en algún momento se necesita consumir los datos de una forma más estructurada, siempre podremos procesar y volcar la información a una base de datos relacional. Pero es que, muy probablemente, no sea necesario.
¿Qué hacer para convertiros en expertos?
Espero que este post haya servido para aclarar algunos conceptos y dudas básicas sobre las diferencias entre las bases de datos relacionales y no relacionales. Pero, indudablemente, como se comprenden de verdad estas cosas es cacharreando, rompiendo y rediseñando (y volviendo a romper) aplicaciones. Solo así podréis convertiros en verdaderos expertos.
Cómo calcular el tamaño de una base de datos en Oracle
Con el tiempo las bases de datos de Oracle crecen paulatinamente en tamaño. Dependiendo del tamaño de la organización, el factor de crecimiento puede ser tal que necesitará darse mantenimiento a intervalos periódicos para asegurar suficiente espacio disponible en el servidor y hacer que la base de datos funcione eficientemente. El tamaño de una base de datos Oracle depende de un número de factores. Además de la información, existen archivos temporales y esenciales de control que contienen la estructura de la base de datos. Todos estos son esenciales para el buen funcionamiento.
Paso 1
Incluye los tamaños de los archivos de datos en la búsqueda. El tamaño total incluye tablas, campos, procedimientos almacenados y otros objetos de la base de datos. Calcula el tamaño de la vista «dba_data_files» como sigue:
SELECT SUM(bytes)/1024/1024/1024 data_size from dba_data_files;
Paso 2
Calcula el tamaño de los archivos temporales. Estos almacenan datos durante el procesamiento pero no es permanente. Calcula el tamaño del archivo temporal como sigue:
select nvl(sum(bytes),0)/1024/1024/1024 temp_size from dba_temp_files.
Paso 3
Obtén el tamaño del redo log. Este almacena cualquier cambio en la base de datos antes de ser aplicados en los datos actuales de la base. Esto ofrece una manera de almacenar la base de datos a su estado original previo a un extracto diseñado para modificar cualquier información.
select sum(bytes)/1024/1024/1024 redo_size from sys.v_$log.
Paso 4
Extrae el tamaño del archivo de control usado por Oracle usando la vista V$CONTROLFILE. Esta vista se usa para obtener información del esquema de la base de datos y los objetos contenidos en la misma.
El extracto seleccionado para obtener el tamaño del archivo de control es:
select sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1024/1024/1024 controlfile_size from v$controlfile
Paso 5
Combina los extractos seleccionados para calcular el tamaño de la base de datos. El resultado corresponde al tamaño total de la base de datos en gigabytes:
select d.data_size+T.temp_size+R.redo_size+C.controlfile_size “Database Size in GB” from ( select sum(bytes)/1024/1024/1024 data_size from dba_data_files) d, ( select nvl(sum(bytes),0)/1024/1024/1024 temp_size from dba_temp_files ) t, ( select sum(bytes)/1024/1024/1024 redo_size from sys.v_$log ) r, ( select sum(BLOCK_SIZE*FILE_SIZE_BLKS)/1024/1024/1024 controlfile_size from v$controlfile) c;
Esto presentará el tamaño total de la base de datos en el siguiente formato:
Tamaño de la base de datos en GB
Resultado:
149.58765
Notas sobre diagramas de clases y diagramas de secuencias
Diagramas de clases
¿Qué son los diagramas de clase?
Son diagramas para modelar un gráficamente la vista estática del software, en la que se muestran un conjunto de clases, interfaces y las relaciones y colaboraciones que existen entre ellos.
Para que usamos los diagramas de clases
- Permiten realizar una visualización de las clases a utilizar.
- Describen los objetos a modelar en el sistema.
- Permiten mostrar las relaciones entre las clases.
Identificación de clases
- Identificamos las clases necesitadas en las capas de modelo, vista y controlador.
- Las clases del modelo son las que representan los datos de la aplicación.
- Las clases del Controlador son las que representan las reglas de negocio.
- Las clases de la vista son las que permiten la interacción con el usuario.
Clases de modelo
- A partir de los casos de uso se identifican los conjuntos de datos que representan la información que va a manejar el sistema.
- Incluye clases para realizar las conexiones con la base de datos.
Clases de controlador
- Son clases que dan funcionalidad al sistema. Esta funcionalidad depende directamente del detalle de los casos de uso.
- Generalmente son clases que contienen métodos que están relacionados entre si para dar soporte a las acciones identificadas en los casos de uso.
Clases de vista
- Son clases que representan la interfaz con el usuario.
- Pueden ser implementadas a través de HTML, JSP y servlets.
Diagramas de secuencias
¿Qué son los diagramas de secuencias?
Son diagramas que muestran la interacción entre los objetos de las clases como una secuencia de envío de mensajes entre ellos, ordenados en el tiempo.
Para su construcción se parte del detalle de los casos de uso. Para cada flujo normal, alternativo y excepcional de eventos en los casos de uso, se construye un diagrama de secuencia.
Herramientas para migraciones de bases de datos.
Existen diversos tipos de herramientas para realizar migraciones de bases de datos (Schema migration, database migration, database change management en inglés). Estas herramientas están diseñadas para administrar cambios incrementales y reversibles sobre esquemas de bases de datos relacionales.
Una migración sobre un esquema es realizada siempre que se necesite actualizar o revertir un cambio sobre un esquema de una base de datos relacional.
En este texto, mostraré las herramientas disponibles y de las más oídas para trabajar con migraciones para bases de datos.
Flyway
Herramienta desarrollada para interactuar con Java
Bases de datos soportadas:
- Oracle
SQL Server
SQL Azure
DB2
MySQL
MariaDB
Google Cloud
PostgreSQL
Redshift
Otras…
Herramientas de Java con las que interactua
- Maven
Gradle
Ant
6 Comandos básicos
- Migrate
Clean
Info
Validate
Baseline
Repair
Liquibase
Herramienta desarrollada para interactuar con Java
Bases de datos soportadas
- MySQL
PostgreSQL
Oracle
SQL Server
Sybase
DB2
Apache Derby
Otras
Herramientas Java con las que interactua
- Maven
Ant
Muchos comandos dependiendo de lo que se quiera hacer
Datical DB
Sin interacción directa con Java
Bases de datos soportadas
- Oracle
DB2
MySQL
SQL Server
PostgreSQL
Otras
Muchos comandos dependiendo de lo que se quiera hacer. Similar a Liquibase.
Active Record (migrations)
Herramienta hecha con Ruby
Bases de datos soportadas
- PostgreSQL
MySQL
Comandos basados en definir cosas en Ruby
Ruckusing-migrations
Herramienta hecha en PHP
Bases de datos soportadas
- PostgreSQL
MySQL
Sqlite
Varios comandos basados en lo que se quiera hacer.
Phinx
Herramienta hecha en PHP
Bases de datos soportadas
- MySQL
PostgreSQL
SQLite
SQL Server
Varios comandos basados en lo que se quiera hacer.
MyBatis Migrations
Framework de persistencia para Java.
Bases de datos soportadas
- Cualquiera bajo JDBC
Configuración basada en SQL, Java y XML
Ragtime
Biblioteca para realizar migraciones de datos estructurados hecha en Clojure
Bases de datos soportadas
- Cualquiera bajo JDBC
Configuración basada en SQL
Lobos
Biblioteca para realizar migraciones de bases de datos escrita en Clojure.
Bases de datos soportadas
- H2
MySQL
PostgreSQL
SQLite
SQL Server
Configuración bajo clojure
Ejecución de consultas SQL en org-mode
Una de las cosas por la que me gusta usar org-mode es la posibilidad de usar código fuente de prácticamente cualquier lenguaje en él.
Particularmente hoy estuve haciendo unas pruebas sobre su uso con SQL y PostgreSQL. Para configurarlo hay que agregar las siguientes lineas a nuestro archivo .org:
1
2
3
4
5
|
:PROPERTIES: :engine: postgresql :cmdline: database -U user :exports: both :END: |
Y lo siguiente es probar que org puede realizar una conexión con la base de datos a simplemente realizando una consulta que va a depender de la estructura de la base de datos a la que queremos conectarnos. En mi caso, mi consulta de prueba sería la siguiente:
1
2
3
4
|
#+name my-query #+begin_src sql select nombre, fecha from public.videojuego limit 1; # +end_src |
La consulta se ejecuta tecleando C-c C-c
y eso desplegará resultados como el que muestro a continuación:
1
2
3
4
5
6
|
| ┌────────┬────────────┐ | |-------------------------| | │ nombre │ fecha │ | | ├────────┼────────────┤ | | │ Gears │ 2015-04-16 │ | | └────────┴────────────┘ | |
Esta consulta la realicé a una de las bases de mis alumnos. Una vez entendido este pequeño ejemplo, lo utilizaré para explicar algunas cosas y manteniendo todas las herramientas que provee org-mode.
Convertir base de Datos de MSSQL SERVER A MYSQL con DBConvert for MSSQL y MySQL
Dos de los Sistemas Administradores de Bases de Datos mas populares en el mundo son sin duda son Microsoft Sql Server y MySQL, sin duda habrá discrepancias acerca de cual es mejor que el otro, pero aquí no se pretende entrar en esa discusion, puesto que cada herramienta es realmente muy potente.
En este tutorial se pretende mostrar la utilización de dos herramientas que pueden convertir las base de datos ya se de MySQL a MSSQL y viceversa, las herramientas utilizadas son DBConvert for MSSQL & MySQL y Full Convert Enterprise ((hacer clic en los nombres para descargar versiones trial), lo que haremos es convertir dos base de datos de SQL SERVER 2008 a MYSQL
la Base de Datos de SQL SERVER a convertir para el primer caso es hoteles y se ve en la imagen anterior las tablas y vemos los datos de la tabla habitacion, para poder comprobar luego si la conversión también contempla los datos de las tablas
Bueno ahora si empezamos por DBConvert for MSSQL & MySQL, una vez descargada la version trial ejecutamos el programa
Hacemos clic en trial sino tenemos la clave o algun crack
hacemos clic en next
verificamos que el origen (source) sea MSSQL Database y Destination sea MySQL database y hacemos clic en next
ingresamos el nombre de usuario de sql server y su contraseña si tuviera o seleccionar Windows Authentication si queremos conectarnos con el usuario del Sistema Operativo, seleccionamos la Base de Datos origen y clic en next
escrirbimos el nombre de usuario con el cual nos conectamos a MYSQL y su contraseña si tuviera y seleccionamos a la base de datos donde se migraran los datos o sino escribir el nombre de la base de datos destino para crearla
seleccionamos las tablas a comvertir , o dejamos marcadas todas y hacemos clic en siguiente
hacemos clic en commnit para empezar el proceso de conversion
puesto que tenemos el programa en version trial solo nos permite la conversion de 50 registros por tabla, si quisieramos mas tendriamos que comprar el programa, hacemos clic en aceptar
luego de terminado el proceso haacemos clic en finish
verificamos que la conversión se ha llevado a cabo
Ahora convertiremos la base de Datos SISOPTEC e SQL SERVER 2008, como vemos en la siguiente imagen
Datos de la tabla Equipo
Ahora si jecutamos el programa si ya lo hemos descargado e instalado
como es una version trial tenemos 30 dias para probarlo
clic en new databse conversion
seleccionamos el motor de base de datos de origen, para este ejemplo SQL Server y seleccionamos los parametros de conexion(server, user, password)
Ahora elegimos el motor de base de datos de destino y los parametros necesarios para la conexion (servidor, usuario, contraseña)
si la base de datos no existe la creara
seleccionamos la tablas que queremos migrar y le damos clic en next
le damos clic en convert para iniciar el proceso de conversión
como es una version trial nos muestra mensaje que nos dice que solo convertira los 50 primeros registros de cada tabla , luego le damos clic en continue
empieza el proceso de conversión
clic en ok
ahora vemos la base de datos que acabamos de migrar , y podemos ver los datos y como vemos la version trial de este programa como solo migra los nombres de las cinco primeras columnas de las tablas
las siguientes salen con el nombre TRIAL_COLUMNS 😦
verificamos en propio mysql , en este ejemplo mediante phpmyadmin de XAMPP y vemos que realizo la conversion, pero con las restricciones antes mencionadas
Como vemos resulta sencillo convertir base de datos entre MYSQL Y MSSQL con estos dos programas, teniendo como limitaciones las antes mencionadas, pero solo en sus versiones trial
7 Páginas Web absurdas que querrá visitar
¿Creías que ya habías visto todo lo absurdo que existe en Internet? Te retamos a comprobar gracias a estas web que lo inútil no conoce de límites.
El universo de Internet esta cargado de ideas, creatividad y proyectos de todo tipo. Es posible encontrar contenido interesante que nos sea de gran utilidad en nuestro día a día, aunque también hay espacio para las web absurdas para divertirse y pasar el rato. Estas páginas que vamos a recomendar no son de mucha utilidad, pero seguramente te gustará visitarlas.
¿Por qué ibas a querer entrar en alguna de estas web absurdas? El motivo es muy simple, por la curiosidad, la diversión, hacer un poco el payaso y desconectar del estrés diario y la rutina. Te sorprenderá saber lo absurdas que son algunas webs por Internet, siendo esa su seña de identidad y encanto particular. Hemos intentado extraer algunas de ellas, con el ánimo de que no te pasen para nada desapercibidas.
1. HACKERTYPER
Seguro que más de una vez te has quedado con la boca abierta al ver a los hackers que aparecen en las películas de Hollywood, tecleando a toda velocidad en una pantalla en negro con letras en color verde insertando códigos indescifrables. Pues esta es tu oportunidad de aparentar ser un programador experto que conoce a la perfección todos los entresijos de los códigos informáticos. Por supuesto que se trata de una web absurda, pero en Hackertyper podrás simular ser un interesante programador que está intentando conseguir introducirse en los sistemas más complejos.
Nada más entrar en la web aparece la pantalla en negro, y solo tienes que teclear para que vaya saliendo el código en verde flúor, de manera que va a parecer totalmente real. Si quieres además sorprender, solo tienes que pulsar la tecla Alt.
2. SWARM
Si te apetece realmente desconectar de todo para dejar tu mente en blanco, es posible que con esta web absurda lo consigas. Le puedes dar muchas interpretaciones, como que la energía está en movimiento y tu la centras en un solo lugar. Es algo así lo que puedes hacer, ya que aparecen como cientos de peces, larvas, gusanos o como lo quieras llamar, y donde dejes el cursor del ratón ahí será donde se concentren y vayan todos, como si estuvieras dándoles de comer.
Swarm es una experiencia que te recomendamos que pruebes si quieres dejar de pensar y solo atender a lo que ocurre mientras mueves el cursor del ratón. Es posible que incluso te ayude a relajarte, compruébalo por ti mismo.
3. THEUSELESSWEB
Si te interesa mucho este mundo de las web absurdas y no quieres estar investigando ni buscando de un lado a otro para acceder a ellas, te presentamos la web Theuselessweb que de forma aleatoria te va llevando a diferentes web que son realmente absurdas. Para ver cómo funciona, solo tienes que hacer clic en el botón que pone PLEASE, de forma inmediata aparecerás en una web absurda que seguramente te sorprenderá.
Lo interesante, es que puedes probar las veces que quieras y descubrir así multitud de web absurdas, y más de una te acabará atrapando. ¿Habrá algún limite de web absurdas? Ya puedes comprobarlo.
4. CAT-BOUNCE
Si crees que ya habías visto todo lo absurdo que se puede ver en Internet, te mostramos algo más. A la mayoría nos gustan los gatitos y sabemos de sus cualidades para saltar de un lado a otro, en esta web los podrás ver rebotar sin parar de un sitio a otro. Además, haz la prueba de hacer clic en alguno de ellos y soltarlo donde quieras para que siga rebotando.
Otra de las sorpresas que incorpora la web Cat-bounce absurda es la lluvia de estos felinos. Al pulsar el botón MAKE IT RAIN comprobarás lo que sucede.
5. POINTERPOINTER
Una de las cualidades que tiene lo absurdo es que siempre es capaz de sorprender. Aunque creas que ya lo has visto todo siempre algo que jamás te habrías imaginado. Te proponemos esta web que está basada en imágenes, donde quiera que pongas el puntero del ratón habrá una imagen con un dedo que apunta justo ahí.
Pointerpointer es una auténtica declaración de cómo podemos invertir nuestro tiempo en cosas totalmente inútiles, pero aún así parece que nos merece la pena.
6. RANDOMCOLOUR
Es cierto eso de que lo absurdo no conoce límites, en Internet hay muchas personas que se esfuerzan para ser originales y hacer cosas que resulten totalmente inútiles. Randomcolour es precisamente eso, color aleatorio. Al cargar la web te muestra un color y cada vez que la cargues el color será diferente apareciendo de forma aleatoria. ¿Te animas a adivinar el color que te saldrá? Una web perfecta para perder el tiempo y distraerte sin que tengas que pensar en nada más.
7. KOALASTOTHEMAX
Para terminar con esta selección de las web más absurdas de Internet, lo hacemos con koalastothemax. Es otra de animalitos y tendrás que descubrir porqué. Se trata de una idea original e inquietante porque no sabes lo que va a ocurrir con tanta división de círculos. Al principio aparece un círculo y conforme vas pasando el ratón se van dividiendo sin que parezca que haya fin. Te animamos a que pruebes a pasarlo sin parar lo más rápido que puedas a ver lo que sucede.
Los círculos se van dividiendo sin parar dejando un fondo que te sorprenderá. Lo más curioso, es que los resultados serán diferentes cada vez que lo hagas. Sin duda, es una forma bastante curiosa para entretenerse sin tener que pensar absolutamente en nada.
Estas webs te garantizamos que cumplen a la perfección con ser absolutamente inútiles. Son absurdas y aunque te pueda parecer extraño, es posible que te veas entrando más de una vez en ellas una vez que las has descubierto. Como verás puedes encontrar todo lo que te propongas en Internet, ya que es un mundo repleto de utilidades con webs que nos ayudan en nuestro día a día en multitud de tareas, y también un lugar para conocer lo más absurdo que jamás habríamos imaginado.
35 motores de Bases de Datos Open Source
Fantástico el artículo que han preparado en WebResourcesDepot en el cual nos hablan de las grandes posibilidades que tenemos a la hora de elegir un motor de base de datos en el terreno Open Source.
Como indican en el artículo, probablemente conozcáis las principales alternativas (algunas de ellas comerciales):
Como indican en ese texto, es normal que dichas opciones estén tan extendidas: están muy bien documentadas, hay una gran comunidad de usuarios detrás de todas ellas y están muy integradas con la mayoría de CMS del mercado, además de estar disponibles en las principales empresas de hosting. Pero hay todo un mundo de posibilidades que va más allá de esas opciones.
Lo demuestra el citado artículo, del que simplemente haré una adaptación y que os recomiendo visitar. Las 35 alternativas Open Source en este terreno son las siguientes, y antes de nada, permitidme que me disculpe por la traducción. No estoy familiarizado con muchos de los términos que se manejan en el artículo, así que puede que haya metido la pata en alguna descripción:
MongoDB
Es una base de datos Open Source de gran rendimiento, escalable, schema-free (creo que esto se refiere a que no es una base de datos relacional convencional, aunque no estoy del todo seguro) y orientada a documentos (esquemas de datos tipo JSON). Hay drivers preparados para usar esta base de datos desde lenguajes como PHP, Python, Perl, Ruby, JavaScript, C++ y muchos más.
Hypertable
Hypertable es un sistema de almacenamiento distribuido de datos de alto rendimiento diseñado para soportar aplicaciones que requieran máximo rendimiento, escalabilidad y eficiencia. Se ha diseñado y modelado a partir del proyecto BigTable de Google y se enfoca sobre todo a conjuntos de datos de gran escala.
Apache CouchDB
Como en el caso de MongoDB, este proyecto está destinado a ofrecer una base de datos orientada a documentos que se pueden consultar o indexar en modo MapReduce usando JavaScript. CouchDB ofrece una API JSON RESTful a la que se puede acceder desde cualquier entorno que soporte peticiones HTTP.
Neo4j
Es un motor de persistencia completamente transaccional en Java que almacena los datos mediante grafos, y no mediante tablas. Neo4j ofrece una escalabilidad masiva. Puede manejar grafos de varios miles de millones de nodos/relaciones/propiedades en una única máquina, y se puede escalar a lo largo de múltiples máquinas.
Riak
Riak es una base de datos ideal para aplicaciones web y combina:
- Una tienda con un valor clave descentralizado
- Un motor map/reduce flexible
- Una interfaz de consultas HTTP/JSPN amigable.
Oracle Berkeley DB
Se trata de un motor de bases de datos embebidas que proporciona a los desarrolladores persistencia local, rápida y eficiente con una administración nula. Oracle Berkeley DB es una librería que se enlaza directamente en nuestras aplicaciones y permite realizar llamadas simples a funciones en lugar de enviar mensajes a un servidor remoto para mejorar el rendimiento.
Apache Cassandra
Cassandra es probablemente uno de los proyectos NoSQL más concoidos del mercado. Se trata de una base de datos distribuida de segunda generación con alta escalabilidad que está siendo usada por gigantes como Facebook (que es quien la ha desarrollado), Digg, Twitter, Cisco y más empresas. El objetivo es ofrecer un entorno consistente, tolerante a fallos y de alta disponibilidad a la hora de almacenar datos.
Memcached
Memcached es un almacen del tipo in-memory key-value para pequeñas cadenas de datos arbitrarios (textos, objetos) de resultados de llamadas a base de datos, llamadas a API, o renderizado de páginas. Está orientado a acelerar aplicaciones web dinámicas al aliviar la carga de la base de datos.
Firebird
Firebird -no confundir con Firefox- es una base de datos relacional que puede ser utilizada en Linux, Windows y varias plataformas UNIX, y ofrece un alto rendimiento y potente soporte de lenguajes para procedimientos almacenados y triggers.
Redis
Redis es una base de datos avanzada del tipo fast key-value que está escrita en C y quese puede usar como memcached, por delante de una base de datos tradicional, o bien por sí sola de forma independiente. Tiene soporte para varios lenguajes de programación y se utiliza en proyectos muy populares como GitHub o Engine Yard. También hay un cliente PHP llamado Rediska que permite gestionar bases de datos Redis.
HBase
HBase es u almaceén distribuido del tipo column-oriented que puede ser también denominado como la base de datos Hadoop. El proyecto está dirigido a ofrecer tablas enormes de “miles de millones de filas, y millones de columnas”. Dispone de un gateway RESTful que soporta XML, Protobug y opciones de codificación binaria de datos.
Keyspace
Se trata de un almacén del tipo key-value con replicación consistente y que funciona sobre sistemas operativos Windows. Keyspace ofrece una alta disponibilidad al enmascarar los fallos de servidor y red y al aparecer como un único servicio de alta disponibilidad.
4store
4store es un motor de almacenamiento de bases de datos y de consultas que mantiene datos en formato RDF. Está escrito en ANSI C99, está diseñado para funcionar en sistemas UNIX y ofrece una plataforma de alto rendimiento, escalable y estable.
MariaDB
MariaDB es una rama compatible hacia atrás de MySQL® Database Server. Incluye soporte para la mayoría de los motores de almacenamiento Open Source, y además para el propio motor de almacenamiento Maria.
Drizzle
Es un fork de MySQL que se centra en ser una base de datos eficiente y estable, sobre todo optimizada para aplicaciones de Internet y que siguen la filosofía Cloud Computing.
HyperSQL
Es un motor de bases de datos relacionales SQL escrito en Java. HyperSQL ofrece un pequeño pero veloz motor de bases de datos que dispone de tablas in-memory y basadas en disco, y que soporta los modos embebido y servidor. Además, dispone de herramientas como una consola de comandos SQL y una interfaz gráfica para las consultas.
MonetDB
MonetDB es un sistema de bases de datos para aplicaciones de alto rendimiento dirigidas a la minería de datos, OAP, GIS, búsquedas XML, y recolección de información a partir de ficheros de texto y multimedia.
Persevere
Es un motor de almacenamiento de objetos y un servidor de aplicaciones (ejecutándose en Java/Rhino) que ofrece almacenamiento de datos dinámicos JSON para el desarrollo rápido de aplicaciones de Internet orientadas a datos y basadas en JavaScript.
eXist-db
eXist-db está desarrollada a través de la tecnología XML. Almacena datos CML según el modelo de datos de este estándar, y se caracteriza por un procesado eficiente y basado en índices de XQuery.
Otras alternativas
- Gladius (base de datos PHP flat-file)
- CloudStore
- OpenQM (base de datos multivalor)
- ScarletDME (base de datos multivalor)
- SmallSQL (Motor de bases de datos Java Desktop SQL)
- LucidDB
- HyperGraphDB (base de datos de grafos)
- InfoGrid (base de datos de grafos)
- Apache Derby
- hamsterdb
- H2 Database
- EyeDB
- txtSQL
- db4o
- Tokyo Cabinet
- Project Voldemort
Facebook y sus problemas de bases de datos
De acuerdo al pionero de bases de datos, Michael Stonebraker, Facebook opera una gigantesca implementación de MySQL, equivalente, según sus palabras, “a un destino peor que la muerte“, y la única manera de salir de este problema es “reescribirlo todo de nuevo“. Cabe decirse que no es un error necesariamente de Facebook. Stonebraker dice que el predicamento de la red social es comín a todos los inicios en la web que empiezan casi de cero y que crecen a proporciones épicas.
Durante una entrevista esta semana, Stonebraker explicó que Facebook ha dividido la base de datos MySQL en 4000 fragmentos, para poder manejar la cantidad masiva de datos y que está actualmente corriendo 9000 instancias (en memoria caché), para poder lidiar con el número de transacciones que la base de datos debe servir. Y aunque hay que corroborar estos números con Facebook, es evidente que no hay misterios en la historia de Facebook con MySQL. SigueLeyendo…