> For the complete documentation index, see [llms.txt](https://docs.devonyx.fr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devonyx.fr/getting-started/base-de-donnees.md).

# Base de données

### SGBD utilisé

DashFarm utilise **MySQL** (compatible MariaDB) pour la persistance des données. Le modèle est entièrement relationnel et exploite les contraintes d'intégrité référentielle (clés étrangères).

### Modèle conceptuel (MCD)

Le modèle est organisé autour de **9 entités principales :**&#x20;

![](/files/AxCOT6A4Lzd4x0khrPSs)

### Schéma relationnel détaillé

#### Table `utilisateur`

Stocke les comptes des agriculteurs et administrateurs.

| Colonne          | Type         | Contraintes                     | Description              |
| ---------------- | ------------ | ------------------------------- | ------------------------ |
| `id_utilisateur` | INT          | PK, AUTO\_INCREMENT             | Identifiant unique       |
| `nom`            | VARCHAR(100) | NOT NULL                        | Nom de famille           |
| `prenom`         | VARCHAR(100) | NOT NULL                        | Prénom                   |
| `email`          | VARCHAR(150) | NOT NULL, UNIQUE                | Email de connexion       |
| `mot_de_passe`   | VARCHAR(255) | NOT NULL                        | Hash bcrypt              |
| `role`           | VARCHAR(50)  | NOT NULL, DEFAULT 'agriculteur' | `agriculteur` ou `admin` |

#### Table `parcelle`

Décrit les terrains agricoles, géolocalisés.

| Colonne          | Type         | Contraintes         | Description                 |
| ---------------- | ------------ | ------------------- | --------------------------- |
| `id_parcelle`    | INT          | PK, AUTO\_INCREMENT | Identifiant unique          |
| `nom`            | VARCHAR(100) | NOT NULL            | Nom donné par l'agriculteur |
| `surface`        | FLOAT        | NOT NULL            | Surface en hectares         |
| `latitude`       | FLOAT        | NOT NULL            | Coordonnée GPS              |
| `longitude`      | FLOAT        | NOT NULL            | Coordonnée GPS              |
| `description`    | TEXT         | —                   | Description libre           |
| `date_creation`  | DATE         | NOT NULL            | Date d'enregistrement       |
| `id_utilisateur` | INT          | FK → utilisateur    | Propriétaire                |

#### Table `culture`

Cultures plantées sur une parcelle, optionnellement typées.

| Colonne               | Type         | Contraintes                  | Description                                |
| --------------------- | ------------ | ---------------------------- | ------------------------------------------ |
| `id_culture`          | INT          | PK, AUTO\_INCREMENT          | Identifiant unique                         |
| `nom`                 | VARCHAR(100) | NOT NULL                     | Nom de la culture                          |
| `variete`             | VARCHAR(100) | —                            | Variété (ex: Apache pour le blé)           |
| `date_semis`          | DATE         | NOT NULL                     | Date de semis                              |
| `date_recolte_prevue` | DATE         | —                            | Estimation de récolte                      |
| `statut`              | VARCHAR(50)  | NOT NULL, DEFAULT 'en cours' | `en cours`, `récoltée`, `abandonnée`, etc. |
| `id_parcelle`         | INT          | FK → parcelle, NOT NULL      | Parcelle d'origine                         |
| `id_type_culture`     | INT          | FK → type\_culture, NULLABLE | Typage optionnel                           |

#### Table `type_culture`

Catalogue  des types de cultures (Blé, Orge, Maïs, etc...) avec couleur d'affichage

| Colonne           | Type         | Contraintes                | Description        |
| ----------------- | ------------ | -------------------------- | ------------------ |
| `id_type_culture` | INT          | PK, AUTO\_INCREMENT        | Identifiant unique |
| `nom`             | VARCHAR(100) | NOT NULL                   | Nom du type        |
| `description`     | TEXT         | —                          | Description libre  |
| `couleur`         | VARCHAR(7)   | DEFAULT '#4D7C2F'          | Code hex pour l'UI |
| `created_at`      | TIMESTAMP    | DEFAULT CURRENT\_TIMESTAMP | Date de création   |

> Cette table est créée automatiquement au premier démarrage du serveur via une migration dans `type_cultures.controller.js`

#### Table `observation`

Observations terrain rattachées à une culture spécifique.

| Colonne            | Type         | Contraintes                | Description                   |
| ------------------ | ------------ | -------------------------- | ----------------------------- |
| `id_observation`   | INT          | PK, AUTO\_INCREMENT        | Identifiant unique            |
| `date_observation` | DATE         | NOT NULL                   | Date relevée                  |
| `type`             | VARCHAR(100) | NOT NULL                   | Type d'observation            |
| `description`      | TEXT         | —                          | Détails                       |
| `unite`            | VARCHAR(20)  | —                          | Unité de mesure si pertinente |
| `id_culture`       | INT          | FK → culture, NOT NULL     | Culture observée              |
| `id_utilisateur`   | INT          | FK → utilisateur, NOT NULL | Auteur de l'observation       |

#### Table `meteo`

Relevés métérologiques quotidiens (données globales, pas par parcelle dans le schéma actuel).

| Colonne         | Type  | Contraintes         | Description            |
| --------------- | ----- | ------------------- | ---------------------- |
| `id_meteo`      | INT   | PK, AUTO\_INCREMENT | Identifiant unique     |
| `date_meteo`    | DATE  | NOT NULL            | Date du relevé         |
| `temperature`   | FLOAT | NOT NULL            | Température en °C      |
| `humidite`      | FLOAT | NOT NULL            | Humidité relative en % |
| `precipitation` | FLOAT | NOT NULL            | Précipitations en mm   |
| `vent`          | FLOAT | NOT NULL            | Vitesse du vent        |

#### Table `regle_alerte`

Règles paramétrables qui déclenchent les alertes (moteur de règles).

| Colonne            | Type         | Contraintes         | Description                                                                 |
| ------------------ | ------------ | ------------------- | --------------------------------------------------------------------------- |
| `id_regle`         | INT          | PK, AUTO\_INCREMENT | Identifiant unique                                                          |
| `nom`              | VARCHAR(100) | NOT NULL            | Nom de la règle                                                             |
| `parametre`        | VARCHAR(100) | NOT NULL            | Champ météo à vérifier (`temperature`, `humidite`, `precipitation`, `vent`) |
| `operateur`        | VARCHAR(10)  | NOT NULL            | `>`, `<`, `>=`, `<=`, `=`                                                   |
| `seuil`            | FLOAT        | NOT NULL            | Valeur seuil                                                                |
| `niveau`           | VARCHAR(20)  | NOT NULL            | `info`, `warning`, `critique`                                               |
| `message_template` | TEXT         | NOT NULL            | Message affiché dans l'alerte                                               |

#### Table `alerte`

Alertes générées par le moteur de règles.

| Colonne       | Type         | Contraintes                  | Description                             |
| ------------- | ------------ | ---------------------------- | --------------------------------------- |
| `id_alerte`   | INT          | PK, AUTO\_INCREMENT          | Identifiant unique                      |
| `date_alerte` | DATETIME     | NOT NULL                     | Horodatage de génération                |
| `type_alerte` | VARCHAR(100) | NOT NULL                     | Reprend le `nom` de la règle déclenchée |
| `message`     | TEXT         | NOT NULL                     | Message issu du `message_template`      |
| `niveau`      | VARCHAR(20)  | NOT NULL                     | `info`, `warning`, `critique`           |
| `statut`      | VARCHAR(20)  | NOT NULL, DEFAULT 'active'   | `active` ou `resolue`                   |
| `id_culture`  | INT          | FK → culture, NOT NULL       | Culture concernée                       |
| `id_regle`    | INT          | FK → regle\_alerte, NOT NULL | Règle ayant déclenché                   |

#### Table `historique_culture`

Trace l'évolution du statut d'une culture dans le temps.

| Colonne           | Type        | Contraintes            | Description                   |
| ----------------- | ----------- | ---------------------- | ----------------------------- |
| `id_historique`   | INT         | PK, AUTO\_INCREMENT    | Identifiant unique            |
| `statut`          | VARCHAR(50) | NOT NULL               | Nouveau statut                |
| `date_changement` | DATETIME    | NOT NULL               | Quand le changement a eu lieu |
| `commentaire`     | TEXT        | —                      | Raison du changement          |
| `id_culture`      | INT         | FK → culture, NOT NULL | Culture concernée             |

### Récapitulatif des relations

| De            | Vers                | Cardinalité | Description                                   |
| ------------- | ------------------- | ----------- | --------------------------------------------- |
| utilisateur   | parcelle            | 1:N         | Un agriculteur possède plusieurs parcelles    |
| parcelle      | culture             | 1:N         | Une parcelle peut héberger plusieurs cultures |
| culture       | observation         | 1:N         | Une culture accumule plusieurs observations   |
| culture       | alerte              | 1:N         | Une culture peut générer plusieurs alertes    |
| culture       | historique\_culture | 1:N         | Une culture a une histoire de statuts         |
| type\_culture | culture             | 1:N         | Un type est associé à plusieurs cultures      |
| regle\_alerte | alerte              | 1:N         | Une règle peut déclencher plusieurs alertes   |
| utilisateur   | observation         | 1:N         | Un utilisateur saisit plusieurs observations  |

### Requêtes types

#### Toutes les parcelles d'un utilisateur avec leurs cultures actives

```sql
SELECT p.*, COUNT(c.id_culture) AS nb_cultures
FROM parcelle p
LEFT JOIN culture c
  ON c.id_parcelle = p.id_parcelle AND c.statut = 'en cours'
WHERE p.id_utilisateur = ?
GROUP BY p.id_parcelle;
```

#### Alertes actives critiques de la dernière semaine

```sql
SELECT a.*, c.nom AS culture_nom
FROM alerte a
JOIN culture c ON a.id_culture = c.id_culture
WHERE a.niveau = 'critique'
  AND a.statut = 'active'
  AND a.date_alerte >= NOW() - INTERVAL 7 DAY
ORDER BY a.date_alerte DESC;
```

#### Moyenne météo des 7 derniers jours

```sql
SELECT
  date_meteo,
  ROUND(AVG(temperature), 1) AS temp,
  ROUND(AVG(humidite), 1)    AS humid,
  ROUND(AVG(precipitation),1) AS pluie
FROM meteo
GROUP BY date_meteo
ORDER BY date_meteo DESC
LIMIT 7;
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## 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, and the optional `goal` query parameter:

```
GET https://docs.devonyx.fr/getting-started/base-de-donnees.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

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.
