<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: 404Room</title>
    <description>The latest articles on DEV Community by 404Room (@javier_ee5cb8a318b2596536).</description>
    <link>https://dev.to/javier_ee5cb8a318b2596536</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4125393%2Fe208c017-4d08-4b4c-87b7-e610315eaac5.png</url>
      <title>DEV Community: 404Room</title>
      <link>https://dev.to/javier_ee5cb8a318b2596536</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/javier_ee5cb8a318b2596536"/>
    <language>en</language>
    <item>
      <title>Migraciones en Laravel</title>
      <dc:creator>404Room</dc:creator>
      <pubDate>Tue, 15 Sep 2026 04:51:38 +0000</pubDate>
      <link>https://dev.to/javier_ee5cb8a318b2596536/migraciones-en-laravel-hlo</link>
      <guid>https://dev.to/javier_ee5cb8a318b2596536/migraciones-en-laravel-hlo</guid>
      <description>&lt;p&gt;Seguramente en algún punto dentro del desarrollo de nuestra base de datos hemos atravesado por alguna de estas fases: &lt;em&gt;Análisis de requerimientos&lt;/em&gt; donde definimos las reglas de negocio, &lt;em&gt;Diseño de la Solución&lt;/em&gt; donde modelamos la información (Modelo Conceptual) y la representamos de forma gráfica, y la &lt;em&gt;Implementación&lt;/em&gt; (Modelo Físico) donde básicamente llevamos a la realidad la manera en que se almacenará nuestra información, es decir, donde creamos la base de datos, las tablas, las columnas, generamos los índices, establecemos las restricciones, etc.&lt;/p&gt;

&lt;p&gt;Es en esta fase de &lt;em&gt;implementación&lt;/em&gt; donde por lo regular hacemos uso de un gestor de base de datos como Mysql, Oracle, PostgreSQL, SQL Server, Mongodb, etc, para llevar a cabo las tareas previamente mencionadas, y es en esta fase donde haremos mayor énfasis.&lt;/p&gt;

&lt;p&gt;Por lo común, las tareas dentro del &lt;em&gt;Modelo Físico&lt;/em&gt; se llevan a cabo de forma manual, por ejemplo, directamente a través de un cliente en consola o a través de una interfaz gráfica como Mysql Workbench o DBeaver. Otra manera de lidiar con esta tarea es a través de la codificación de un script que automatice esta tarea por nosotros. En cualquier caso, llegar a ejecutar los cambios de nuestra db de alguna de estas formas puede llegar a ser complicada y/o engorrosa.&lt;/p&gt;

&lt;p&gt;Con Laravel, todas estas tareas pueden ser llevadas a cabo de una forma más sencilla y gestionable a través del uso de las &lt;em&gt;&lt;strong&gt;migraciones&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Una &lt;em&gt;&lt;strong&gt;migración&lt;/strong&gt;&lt;/em&gt; nos permite crear y alterar el esquema de nuestras tablas, generar índices, establecer restricciones, etc, sin embargo, también actúa como una especie de control de versiones sobre nuestra base de datos, esto es, si eventualmente necesitamos consultar un cambio anterior o decidimos que la versión inicial o previa era la que se necesita, en lugar de reescribir todo, simplemente lanzando algunos comandos podemos volver hacia atrás en la línea de tiempo de nuestra db.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creando nuestra primera migración
&lt;/h2&gt;

&lt;p&gt;Para crear una migración simplemente ejecutamos el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan make:migration create_posts_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Con esto se habrá generado un archivo de migración que tendrá por objetivo crear la tabla de nuestras publicaciones.&lt;/p&gt;

&lt;p&gt;Por defecto, Laravel ubica los archivos de migración en &lt;code&gt;database/migrations&lt;/code&gt;, además, podemos notar que el nombre del archivo de migración generado posee una nomenclatura que lo identifica:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyr19xqj6tu5m2njjvhp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Feyr19xqj6tu5m2njjvhp.webp" alt=" " width="720" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sin embargo, lo realmente interesante se encuentra dentro de nuestro archivo de migración recién generado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CreatePostsTable&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Migration&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cd"&gt;/**
  * Run the migrations.
  *
  * @return void
  */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'title'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;unique&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;mediumText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'excerpt'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'body'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published_at'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
  * Reverse the migrations.
  *
  * @return void
  */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dropIfExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dentro del cuerpo de esta Clase podemos identificar 2 métodos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dentro del método &lt;code&gt;up()&lt;/code&gt; se encuentra aquel código que altera de alguna manera nuestra tabla, por ejemplo, agregar columnas, cambiar el tipo de dato de una columna, generar índices, establecer restricciones, etc. Este método es invocado en el momento que ejecutamos la migración.&lt;/li&gt;
&lt;li&gt;El método &lt;code&gt;down()&lt;/code&gt; hace lo opuesto, esto es, ejecutar código que revierta lo realizado por el método &lt;code&gt;up()&lt;/code&gt;. Este método es invocado en el momento en que decidimos revertir la migración.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ejecutando una migración
&lt;/h2&gt;

&lt;p&gt;Existen múltiples maneras de correr una migración, sin embargo, la manera más sencilla de hacerlo es con el siguiente comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto básicamente ejecuta el método &lt;code&gt;up()&lt;/code&gt; de nuestra migración. En este punto, se ha creado la tabla &lt;code&gt;posts&lt;/code&gt; dentro de nuestra base de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revirtiendo una migración
&lt;/h2&gt;

&lt;p&gt;Si nuestra intención es deshacer cualquier operación realizada por la ejecución de las migraciones previas, simplemente ejecutamos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Esto básicamente ejecuta el método &lt;code&gt;down()&lt;/code&gt; de nuestra migración. En este punto, se ha removido la tabla &lt;code&gt;posts&lt;/code&gt; dentro de nuestra base de datos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migraciones e identificadores de Lote
&lt;/h2&gt;

&lt;p&gt;Creo que esta parte es una de las más importantes y un poco engañosas de entender. Si inspeccionamos la base de datos de nuestro proyecto veremos que existe una tabla llamada &lt;em&gt;migrations&lt;/em&gt; que es la encargada de llevar a cabo el control de nuestras migraciones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpdoszaqvx2ceb30ejgo6.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpdoszaqvx2ceb30ejgo6.webp" alt=" " width="430" height="282"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro de esta tabla podemos identificar una columna llamada &lt;em&gt;batch&lt;/em&gt;. El valor de esta columna es utilizada por Laravel para determinar el orden de ejecución y/o reversión de nuestras migraciones, básicamente funciona como un &lt;em&gt;&lt;strong&gt;identificador de lote&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Forjcx0mz7j04xc49jtl3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Forjcx0mz7j04xc49jtl3.webp" alt=" " width="713" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las migraciones cuyo identificador de lote o batch es 1, son aquellas que ejecutamos por lo común al inicio de nuestro proyecto. La migración con identificador de lote 2, es la migración que recién ejecutamos para crear la tabla de publicaciones que pretendemos utilizar en nuestro proyecto.&lt;/p&gt;

&lt;p&gt;Vamos a generar 2 nuevas migraciones: categorías y tags.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan make:migration create_categories_table
&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan make:migration create_tags_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ejecutamos nuestra suite de migración:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Y obtenemos el siguiente resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxns0kb8yslhfi95pj58v.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxns0kb8yslhfi95pj58v.webp" alt=" " width="709" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Las nuevas migraciones han sido ejecutadas y ahora poseen el identificador de lote 3. Básicamente cada vez que creamos y corremos nuevas migraciones sobre nuestro proyecto, se genera un identificador de lote propio.&lt;/p&gt;

&lt;p&gt;Podemos observar que este identificador de lote se va generando de forma incremental en el caso de nuevas migraciones, de igual manera, si revertimos una migración, el identificador de lote irá disminuyendo. Probemos ejecutando el comando de reversión de migraciones previamente mencionado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:rollback
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado es el siguiente:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foos8lrbb9dgyig54xkti.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foos8lrbb9dgyig54xkti.webp" alt=" " width="713" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podemos apreciar que no todas las migraciones fueron revertidas, solo las últimas, las que tenían el número de lote 3, básicamente hemos vuelto un paso hacia atrás. Si nuevamente ejecutamos el comando de &lt;em&gt;rollback&lt;/em&gt;, el resultado será:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqym8njv8io19ab9ubi3w.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqym8njv8io19ab9ubi3w.webp" alt=" " width="720" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Y si nuevamente revertimos nuestras migraciones con el comando anterior en este punto, solo nos quedaremos con:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F331jfgppivcx9zmmwmyr.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F331jfgppivcx9zmmwmyr.webp" alt=" " width="341" height="91"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;absolutamente nada, nuestra base de datos no contiene tabla alguna a excepción de la tabla &lt;em&gt;migrations&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Tal vez te preguntes ¿Por qué sucede esto?, nuevamente la respuesta se encuentra en el valor del campo &lt;em&gt;batch&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;El proceso de &lt;em&gt;rollback&lt;/em&gt; solamente revierte un lote o conjunto de migraciones a la vez tomando como referencia el valor del campo &lt;em&gt;batch&lt;/em&gt;, es por ello que tuvimos que ejecutar 3 veces el procedimiento de reversión a través del comando &lt;em&gt;rollback&lt;/em&gt; en la consola de Laravel.&lt;/p&gt;

&lt;p&gt;Si nuestra intención es revertir todas la migraciones sin importar el identificador de lote, simplemente lanzamos en la terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternativamente, podemos ejecutar un &lt;em&gt;rollback&lt;/em&gt; de forma selectiva:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:rollback &lt;span class="nt"&gt;--step&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En este caso solo se eliminara la migración más reciente pero respetando el lote:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsk1eo84rfie04latufmp.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsk1eo84rfie04latufmp.webp" alt=" " width="720" height="250"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Reversión y Migración en un sola acción
&lt;/h2&gt;

&lt;p&gt;Cuando nos encontramos en modo desarrollo es muy común borrar todas las tablas haciendo un &lt;em&gt;rollback&lt;/em&gt; y recrearlas nuevamente ejecutando la migración. Para poder realizar esta tarea en un solo paso simplemente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:fresh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sin embargo, dado que esta acción es destructiva se desaconseja su uso en producción.&lt;/p&gt;

&lt;p&gt;Adicionalmente, podemos agregar una acción más a este comando, y esto es, correr nuestros &lt;em&gt;seeders&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan migrate:fresh &lt;span class="nt"&gt;--seed&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migrando sin perder la información
&lt;/h2&gt;

&lt;p&gt;Probablemente te estes preguntando como alterar el esquema de una tabla sin perder la información que contiene.&lt;/p&gt;

&lt;p&gt;Para poder alterar la estructura de una tabla sin perder la información que contiene simplemente creamos migraciones adicionales. Cada una de estas migraciones debe seguir una determinada convención que describe lo que hace.&lt;/p&gt;

&lt;p&gt;Por ejemplo, digamos que necesitamos agregar una nueva columna a nuestra tabla de publicación para guardar la url de una imagen destacada, simplemente escribiríamos algo como esto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; php artisan make:migration add_featured_image_url_to_posts_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si abrimos el archivo recién generado, podemos observar que el cuerpo de la Clase cambia ligeramente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AddFeaturedImageUrlToPostsTable&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Migration&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cd"&gt;/**
  * Run the migrations.
  *
  * @return void
  */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// Deseamos agregar esta nueva columna a nuestra tabla 'posts'&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'featured_image_url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cd"&gt;/**
  * Reverse the migrations.
  *
  * @return void
  */&lt;/span&gt;
  &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;     
      &lt;span class="c1"&gt;// Debemos es explícitos e indicar que queremos hacer cuando esta migración sea revertida.&lt;/span&gt;
      &lt;span class="c1"&gt;// En nuestro caso, deseamos eliminar la columna previamente creada.&lt;/span&gt;
      &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;dropColumn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'featured_image_url'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;En el método &lt;code&gt;up()&lt;/code&gt; en lugar de crear una nueva tabla, hacemos referencia a una existente, en este caso, a la tabla &lt;em&gt;posts&lt;/em&gt;. De igual manera, dentro del método &lt;code&gt;down()&lt;/code&gt; indicamos que deseamos eliminar una columna, en lugar de la tabla completa.&lt;/p&gt;

&lt;p&gt;Ya simplemente queda ejecutar la migración, y listo, tendremos una nueva columna en nuestra tabla de publicaciones.&lt;/p&gt;

&lt;p&gt;Hablar sobre la convención de nombres que debemos utilizar para agregar nuevas columnas, índices, restricciones daría para otro articulo en el futuro. Espero esta información te haya servido para entender un poco más sobre las migraciones en Laravel.&lt;/p&gt;

&lt;p&gt;Si te interesa seguir aprendiendo sobre desarrollo web, ciberseguridad y tecnología, te invito a visitar &lt;a href="https://jjeuribe.github.io/" rel="noopener noreferrer"&gt;mi blog personal&lt;/a&gt;, donde comparto lo que voy aprendiendo y construyendo en el camino.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducción a la Notación Big O</title>
      <dc:creator>404Room</dc:creator>
      <pubDate>Tue, 15 Sep 2026 04:23:59 +0000</pubDate>
      <link>https://dev.to/javier_ee5cb8a318b2596536/introduccion-a-la-notacion-big-o-4c4l</link>
      <guid>https://dev.to/javier_ee5cb8a318b2596536/introduccion-a-la-notacion-big-o-4c4l</guid>
      <description>&lt;p&gt;¿Cómo evaluar el desempeño de un algoritmo?, ¿Qué queremos decir cuando el desempeño de un algoritmo es mejor que otro?, ¿Qué es lo que buscamos de la implementación de nuestro algoritmo?. Al desarrollar un algoritmo surgen estas interrogantes y la ambigüedad se hace presente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sea que busquemos rapidez en el &lt;strong&gt;tiempo de ejecución&lt;/strong&gt;, ya sea en el orden de segundos e incluso en milisegundos.&lt;/li&gt;
&lt;li&gt;Minimizar el &lt;strong&gt;uso intensivo de la memoria&lt;/strong&gt;, definiendo menos variables y con nombres más compactos.&lt;/li&gt;
&lt;li&gt;Maximizar la &lt;strong&gt;legibilidad&lt;/strong&gt; de nuestro código para hacerlo más mantenible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cualquier decisión que tomemos siempre tendrá un &lt;em&gt;tradeoff&lt;/em&gt; o &lt;em&gt;costo de oportunidad&lt;/em&gt;, sin embargo, lo importante es saber realmente lo qué queremos o buscamos de nuestro algoritmo.&lt;/p&gt;

&lt;p&gt;¿Deberíamos escribir código más compacto con el riesgo de que sea menos legible y por lo tanto más &lt;em&gt;difícil de mantener&lt;/em&gt;? o por el contrario, ¿Deberíamos escribir código más claro y legible con el potencial de que ocupe mas espacio en memoria?.&lt;/p&gt;

&lt;p&gt;Supongamos que nuestra intención es comparar la &lt;em&gt;velocidad&lt;/em&gt; de ejecución entre estas 2 funciones:&lt;/p&gt;

&lt;p&gt;Implementación de &lt;code&gt;addUpToFirst()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addUpToFirst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Implementación de &lt;code&gt;addUpToSecond()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;addUpToSecond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Procedamos a evaluar el desempeño de ejecución de cada uno y comparemos.&lt;/p&gt;

&lt;p&gt;Resultados de &lt;code&gt;addUpToFirst()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;addUpToFirst&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tiempo transcurrido: ${(t2 - t1) / 1000} segundos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Tiempo Transcurrido: &lt;strong&gt;1.25750000000006985 segundos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tiempo Transcurrido: &lt;strong&gt;1.24369999999936985 segundos&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Resultados de &lt;code&gt;addUpToSecond()&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;t1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nf"&gt;addUpToSecond&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;t2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Tiempo transcurrido: ${(t2 - t1) / 1000} segundos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Tiempo Transcurrido: &lt;strong&gt;0.00010000000004773 segundos&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tiempo Transcurrido: &lt;strong&gt;0.00010000000004773 segundos&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Evidentemente la segunda versión es muchísimo mas rápida en comparación con la primera versión en términos de velocidad de ejecución.&lt;/p&gt;

&lt;p&gt;Sin embargo, esta evaluación de alguna manera sigue siendo ambigua, y esto se debe principalmente a la herramienta que hemos utilizado para evaluar el desempeño en el tiempo de ejecución del algoritmo en cuestión: un &lt;strong&gt;Temporizador&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Entonces, ¿Me estás diciendo que un &lt;em&gt;temporizador&lt;/em&gt; es un mecanismo poco confiable al evaluar el desempeño del tiempo de ejecución de un algoritmo?, en definitiva, y esto se debe principalmente al hardware:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Diferentes máquinas registran diferentes tiempos dadas las especificaciones de hardware de cada máquina, lo que ocasiona que los resultados puedan variar.&lt;/li&gt;
&lt;li&gt;Una misma máquina puede registrar diferentes tiempos cada vez que ejecutamos nuestra rutina. La variación puede ser poco significativa, pero aún así puede existir una falta de precisión.&lt;/li&gt;
&lt;li&gt;La métrica de velocidad en el &lt;em&gt;tiempo de ejecución&lt;/em&gt; puede no ser un indicador preciso y confiable en algoritmos que son muy veloces. Por ejemplo, podemos tener 4 algoritmos superveloces, tan rápidos que los temporizadores no lleguen a registrar los &lt;em&gt;tiempos de ejecución&lt;/em&gt; de cada uno de forma precisa.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En lugar de intentar contabilizar el &lt;em&gt;número de segundos&lt;/em&gt; (el cual es variable) que tarda una rutina en finalizar su ejecución, es mucho mejor concentrarse en contabilizar el &lt;em&gt;número de operaciones&lt;/em&gt; que nuestra implementación debe realizar para llegar a un resultado.&lt;/p&gt;

&lt;p&gt;El &lt;em&gt;tiempo de ejecución&lt;/em&gt; de nuestro algoritmo depende del &lt;em&gt;número de operaciones&lt;/em&gt; que realice, y este número es constante sin importar la máquina o hardware que utilicemos.&lt;/p&gt;

&lt;p&gt;Tomemos como ejemplo la implementación de la función &lt;code&gt;addUpToFirst()&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79gvi9u7ozkiypzcfpzz.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F79gvi9u7ozkiypzcfpzz.webp" alt=" " width="720" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;y comparemosla con la función &lt;code&gt;addUpToSecond()&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jpvy2rh3oeo2i5ddd9t.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jpvy2rh3oeo2i5ddd9t.webp" alt=" " width="720" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¿Qué podemos concluir de esta comparativa?. La función &lt;code&gt;addUpToFirst()&lt;/code&gt; ejecuta un número de operaciones que es proporcional al valor asignado a &lt;code&gt;n&lt;/code&gt;, es decir, a medida que &lt;code&gt;n&lt;/code&gt; aumenta, el número de operaciones que realiza este algoritmo crecerá en la misma proporción.&lt;/p&gt;

&lt;p&gt;En contraste, la función &lt;code&gt;addUpToSecond()&lt;/code&gt; lleva a cabo solamente 3 operaciones independientemente del valor que le asignemos a &lt;code&gt;n&lt;/code&gt;, por lo que si &lt;code&gt;n&lt;/code&gt; crece, el número de operaciones que realiza nuestro algoritmo se mantiene siempre igual.&lt;/p&gt;

&lt;p&gt;En la práctica llevar un conteo de operaciones ejecutadas por un algoritmo puede parecer un enfoque poco intuitivo, sin embargo, existe una manera de llevar a cabo esto.&lt;/p&gt;

&lt;p&gt;Debemos entender qué, lo importante no es llevar el conteo preciso y exacto en el número de operaciones ejecutadas, lo que realmente importa es observar el comportamiento general del número de operaciones ejecutadas relativas la variabilidad de &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esto básicamente significa que todo algoritmo posee un tendencia que puede ser plasmada en una gráfica, y es a través de esta gráfica que nos damos una idea general del desempeño de nuestro algoritmo, en este caso, relativa al tiempo o velocidad de ejecución.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tendencia general de &lt;code&gt;addUpToFirst()&lt;/code&gt;: a medida que &lt;code&gt;n&lt;/code&gt; crece, el tiempo de ejecución crece de forma proporcional o lineal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft846fbp23g0fm1uldw2m.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ft846fbp23g0fm1uldw2m.webp" alt=" " width="720" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tendencia general de &lt;code&gt;addUpToSecond()&lt;/code&gt;: a medida que &lt;code&gt;n&lt;/code&gt; crece, el tiempo de ejecución permanece casi constante.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqp7tkw8bao5hvau7ef3.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwqp7tkw8bao5hvau7ef3.webp" alt=" " width="720" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En esta breve introducción tenemos los fundamentos necesarios para comenzar a entender lo que es la notación Big O y su significado. En el siguiente artículo nos adentraremos en mayor profundidad en el tema, espero les haya gustado. Saludos y Happy Coding.&lt;/p&gt;

&lt;p&gt;Si te interesa seguir aprendiendo sobre desarrollo web, ciberseguridad y tecnología, te invito a visitar mi &lt;a href="https://jjeuribe.github.io/" rel="noopener noreferrer"&gt;blog personal&lt;/a&gt;, donde comparto lo que voy aprendiendo y construyendo en el camino.&lt;/p&gt;

</description>
      <category>bigonotation</category>
      <category>algorithms</category>
      <category>bigo</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
