# Arquitectura de InfluxDB

InfluxDB organiza los datos en una estructura jerárquica que facilita el almacenamiento eficiente y la consulta rápida de grandes volúmenes de información temporal. Los elementos principales de esta arquitectura son:

* **Bucket**: Contenedor lógico donde se almacenan los datos. Equivale a una base de datos en otros sistemas.
* **Measurement**: Agrupación lógica de datos, similar a una tabla en bases de datos relacionales.
* **Tags**: Pares clave-valor que representan metadatos y son indexados para búsquedas rápidas.
* **Fields**: Pares clave-valor que contienen los datos medidos (valores reales).
* **Point**: Registro individual de datos que incluye un timestamp, un measurement, un conjunto de tags y un conjunto de fields.
* **Timestamp**: Marca de tiempo asociada a cada registro, fundamental en bases de datos de series temporales.

## Elementos principales

<figure><img src="/files/oMQbg6Pct6RWumxuoI9J" alt="" width="375"><figcaption><p>Estructura jerárquica de datos en InfluxDB</p></figcaption></figure>

### **Measurement** <a href="#undefined" id="undefined"></a>

#### **¿Qué es un Measurement?**

Un *measurement* es el equivalente a una “tabla” en una base de datos relacional. Sirve como contenedor para los datos relacionados de una misma naturaleza, por ejemplo, “temperatura”, “presión” o “consumo\_energía”.

* **Propósito**: Agrupar datos que comparten un contexto o significado.
* **Nombre**: Es una cadena de texto que debe describir claramente el tipo de datos almacenados.
* **Ejemplo**: Un measurement llamado `temperatura` puede contener los valores de temperatura de distintos sensores en diferentes ubicaciones.

> **Recomendación**: Elige nombres de measurement descriptivos y evita crear demasiados measurements para no fragmentar la información innecesariamente.

### **Tags** <a href="#undefined" id="undefined"></a>

#### **¿Qué son los Tags?**

Los *tags* son pares clave-valor que almacenan metadatos sobre cada punto de datos. Son siempre de tipo string y están **indexados**, lo que permite filtrar y agrupar datos de manera eficiente.

* **Función**: Identificar, clasificar y filtrar los datos rápidamente.
* **Ejemplo**: `ubicacion=planta_norte`, `equipo=bomba_1`, `turno=mañana`.
* **Uso típico**: Los tags se utilizan para atributos que tienen un conjunto limitado de valores posibles y que suelen ser relevantes para filtrar o agrupar datos (por ejemplo, ubicación, tipo de sensor, nombre del operador).

> **Ventaja**: Al estar indexados, las consultas basadas en tags son mucho más rápidas que aquellas basadas en fields.

#### **Buenas prácticas al definir Tags**

* Utiliza tags para información que usarás frecuentemente en filtros o agrupaciones.
* Evita usar tags para valores altamente variables (como IDs únicos), ya que esto aumenta la cardinalidad y puede afectar el rendimiento.

### **Fields** <a href="#undefined" id="undefined"></a>

#### **¿Qué son los Fields?**

Los *fields* contienen los valores reales de las mediciones. Son pares clave-valor donde el valor puede ser de tipo string, float, integer o boolean.

* **Función**: Almacenar los datos medidos (por ejemplo, temperatura, presión, consumo).
* **Ejemplo**: `valor=23.5`, `humedad=80`.
* **No indexados**: Los fields **no están indexados**, por lo que las búsquedas por campos son menos eficientes que por tags.

#### **Diferencias clave entre Tags y Fields**

| Característica | Tags (Metadatos) | Fields (Datos)           |
| -------------- | ---------------- | ------------------------ |
| Indexados      | Sí               | No                       |
| Tipo de datos  | String           | String, int, float, bool |
| Uso            | Filtrar, agrupar | Almacenar valores        |
| Cardinalidad   | Baja recomendada | Puede ser alta           |

> **Regla general**: Usa fields para los valores que cambian constantemente y tags para los atributos que definen el contexto de los datos.

### **Point** <a href="#undefined" id="undefined"></a>

#### **¿Qué es un Point?**

Un *point* es el registro atómico de datos en InfluxDB. Cada point incluye:

* Un measurement
* Un conjunto de tags
* Un conjunto de fields (al menos uno)
* Un timestamp (marca de tiempo)

**Ejemplo de un point:**

{% code title="text" overflow="wrap" %}

```
temperatura,ubicacion=planta_norte,equipo=bomba_1 valor=23.5 1672531200000000000
```

{% endcode %}

* *measurement*: `temperatura`
* *tags*: `ubicacion=planta_norte`, `equipo=bomba_1`
* *fields*: `valor=23.5`
* *timestamp*: `1672531200000000000` (en nanosegundos)

### **Ejemplo: Esquema para Datos Industriales** <a href="#undefined" id="undefined"></a>

Supongamos que queremos almacenar la temperatura de varios sensores en una planta industrial:

* **Measurement**: `temperatura`
* **Tags**:
  * `ubicacion` (planta\_norte, planta\_sur)
  * `sensor` (sensor\_1, sensor\_2)
* **Fields**:
  * `valor` (float)
* **Timestamp**: Fecha y hora de la medición

**Consulta típica**: Obtener la temperatura promedio por ubicación en el último día.

### **Impacto en el Rendimiento** <a href="#undefined" id="undefined"></a>

* **Tags indexados**: Permiten búsquedas y agrupaciones rápidas.
* **Fields no indexados**: Adecuados para valores que cambian frecuentemente y no son usados para filtrar.
* **Cardinalidad**: Evita usar tags con valores únicos o muy variables para no saturar el índice y degradar el rendimiento.
* **Diseño de esquema**: Un buen diseño facilita consultas eficientes y escalabilidad.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://darioaplicano.gitbook.io/influxdb2.x/sesion-1/guion-de-la-sesion/documentacion/introduccion-a-influxdb-y-bases-de-datos-de-series-temporales/arquitectura-de-influxdb.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
