Vés al contingut

Model de dades

El model de dades reflecteix tres conceptes principals: l'estructura geogràfica (municipis, comarques, províncies, agrupacions), els indicadors ODS (fites targets i indicadors) i els valors d'aquests indicadors per a cada entitat geogràfica i any.

Diagrama de relacions

TIP

Per a entitats obsoletes que es mantenen a l'esquema però ja no s'utilitzen (Ruralitat, Ubicacio, TerritorialRegion, User), vegeu les seccions corresponents més avall.

Entitats

Target — Fites ODS (targets)

Representa una fita dels Objectius de Desenvolupament Sostenible (p. ex. fita "1.2").

CampTipusDescripció
idintClau primària
sdgsmallintNúmero de l'ODS (1–17)
target_idvarchar(7)Codi de la fita, p. ex. "1.2"
target_namevarchar(255)Nom descriptiu de la fita
indicatorsrelacióCol·lecció d'Indicator associats

Indicator — Indicadors ODS

Cada indicador pertany a una fita (target) i defineix com es mesura i com es calcula el valor agregat.

CampTipusDescripció
idintClau primària
sdgsmallintNúmero de l'ODS (redundant amb target.sdg, per rendiment)
targetFK → TargetFita (target) a la qual pertany
indicator_idvarchar(7)Codi de l'indicador, p. ex. "1.2.1"
namevarchar(255)Nom descriptiu
signbooltrue = més alt és millor; false = més baix és millor
unitvarchar(15)Unitat de mesura interna (%, hab., , ...). Vegeu nota.
scalesmallintFactor d'escala heretat. No s'utilitza al backend — l'escalat del valor mostrat el determina el frontend (vegeu nota)
descriptionvarchar(255)Descripció de l'indicador. Vegeu nota.
sourcevarchar(255)Font de les dades (IDESCAT, INE, DIBA...)
api_url_municipalitiestextURL de l'API externa de la qual s'obtenen les dades
weightint (0–100)Pes de l'indicador per al càlcul de l'ODS sintètic
dimension_weightint (0–100)Pes de la dimensió per al càlcul sintètic
calculationvarchar(255)Estratègia de càlcul (simple, ratio, ...)

Camps descriptius vs. etiquetes del frontend

Els camps unit, name i description de la taula indicator tenen un valor intern de referència, però el text que mostra el frontend als usuaris no prové d'aquí. El nom de l'indicador, la seva descripció i la unitat de mesura que apareix a la UI són etiquetes de llengua i s'editen als fitxers JSON del frontend (src/locales/ca.json, es.json, en.json). Vegeu Textos i etiquetes.


Municipality — Municipis

Un registre per cada municipi inclòs al visor. A la instància de la Diputació de Barcelona, són 311 municipis de la província de Barcelona.

CampTipusDescripció
idintClau primària interna
municipality_namevarchar(255)Nom del municipi
municipality_codevarchar(7)Codi INE de 5 dígits (p. ex. "08019")
municipality_code_6varchar(7)Codi INE de 6 dígits (p. ex. "080193")
comarcaFK → ComarcaComarca a la qual pertany
populationintÚltima població disponible (dada de resum)
population_yearintAny de la dada de population
ubicacioFK → UbicacioClassificació per ubicació geogràfica
ruralitatFK → RuralitatClassificació per ruralitat
is_industrialboolMunicipi industrial
is_in_ambboolPertany a l'Àrea Metropolitana de Barcelona
is_in_rmbboolPertany a la Regió Metropolitana de Barcelona
territorial_regionFK → TerritorialRegionRegió territorial ampliada
aggregationsM2M → AggregationAgrupacions a les quals pertany (taula pivot: municipality_aggregation)

MunicipalityValue — Valors per municipi

La taula principal de dades. Cada fila és el valor d'un indicador per a un municipi i un any concrets.

CampTipusDescripció
idintClau primària
municipalityFK → MunicipalityMunicipi
indicatorFK → IndicatorIndicador
yearsmallintAny de la dada
valuefloatValor principal
value2float (nullable)Valor secundari (p. ex. denominador d'un ràtio)
subindicatorint (nullable)Subdivisió d'indicadors amb múltiples valors per any (p. ex. per sexe)
monthsmallint (nullable)Mes, si la granularitat és mensual
unitvarchar(15)Unitat de mesura
created_atdatetimeData de creació del registre
updated_atdatetimeData de darrera actualització

Índexs: (year, indicator_id) i (year, subindicator) per a consultes ràpides.


Comarca — Comarques

CampTipusDescripció
idintClau primària
comarca_namevarchar(255)Nom de la comarca
comarca_codevarchar(7)Codi de comarca
provinceFK → ProvinceProvíncia

ComarcaValue — Valors per comarca

Mateixa estructura que MunicipalityValue però vinculada a una Comarca. Aquests valors es calcula amb la comanda app:calculate-aggregation-values --target=comarca.


Province — Províncies

CampTipusDescripció
idintClau primària
province_namevarchar(255)Nom de la província
province_codevarchar(5)Codi de la província

ProvinceValue — Valors per província

Mateixa estructura que MunicipalityValue però vinculada a una Province.


Aggregation — Agrupacions

Una agrupació és un conjunt de municipis que comparteixen una característica (ruralitat, ubicació, pertinença a la RMB, etc.). Els municipis pertanyen a una o més agrupacions via la taula pivot municipality_aggregation.

CampTipusDescripció
idintClau primària
namevarchar(255)Nom de l'agrupació
slugvarchar(100)Identificador URL-friendly, únic (p. ex. "rural", "litoral", "amb")
groupvarchar(50)Grup al qual pertany ("ruralitat", "ubicacio", "territory", ...)

AggregationValue — Valors pre-calculats per agrupació

Valors ja calculats per a cada agrupació, indicador i any. S'omple amb la comanda app:calculate-aggregation-values.

CampTipusDescripció
idintClau primària
aggregationFK → AggregationAgrupació
indicatorFK → IndicatorIndicador
yearsmallintAny
valuefloatValor agregat calculat
value2float (nullable)Valor secundari
subindicatorint (nullable)Subdivisió
monthsmallint (nullable)Mes
unitvarchar(15)Unitat

Population — Sèrie temporal de població

CampTipusDescripció
idintClau primària
municipalityFK → MunicipalityMunicipi
population_countintHabitants
yearsmallintAny del padró

Usada com a ponderació en algunes estratègies de càlcul d'agrupació.


Budget — Pressupostos municipals

CampTipusDescripció
idintClau primària
municipalityFK → MunicipalityMunicipi
yearintAny
programvarchar(6)Codi de programa pressupostari
valuefloatImport (€)

Ruralitat, Ubicacio i TerritorialRegionDeprecated

Obsoletes

Aquestes tres taules de lookup existeixen a l'esquema però ja no s'utilitzen. La seva funció ha estat absorbida per l'entitat Aggregation, que és el mecanisme únic per a totes les agrupacions de municipis. Els camps ruralitat, ubicacio i territorial_region de Municipality es mantenen per compatibilitat però no s'han de fer servir en codi nou.


Label — Etiquetes i textos de la UI

Emmagatzema els textos de la interfície d'usuari editables des del backoffice o via l'endpoint d'edició del frontend.

CampTipusDescripció
idintClau primària
codevarchar(255)Clau d'i18n (p. ex. "HOMEPAGE.TITLE")
languagevarchar(10)Codi d'idioma (ca, es, en)
texttextContingut del text

Restricció única: (code, language).


UserDeprecated

Obsoleta

Aquesta entitat existeix a l'esquema però no s'utilitza. L'autenticació del projecte es gestiona via JWT sense persistir usuaris a la base de dades pròpia.

El model de valors: value i value2

Aquest és un dels conceptes més importants del model de dades. Les taules de valors (municipality_value, comarca_value, province_value, aggregation_value) no emmagatzemen el número final que veu l'usuari, sinó les dades en brut necessàries per calcular-lo. Cada fila té dos camps numèrics:

  • value — el numerador (o l'únic valor, en indicadors simples)
  • value2 — el denominador (opcional)

Aquesta decisió és deliberada: emmagatzemant numerador i denominador per separat, el sistema pot agregar correctament els valors a nivell de comarca, província o agrupació (sumant numeradors i denominadors per separat abans de dividir), cosa que seria impossible si només guardéssim el percentatge ja calculat.

Tres famílies d'indicadors

Segons com es combinen value i value2, els indicadors es divideixen en tres famílies:

FamíliaQuè s'emmagatzemaCom es mostraExemple
Ràtiovalue = numerador, value2 = denominadorvalue / value2 × factor (×100, ×1000, ×10⁴, ×10⁵...)3.4.1 % població: (value × 100) / value2
Simplenomés valuevalue tal qual (potser ×100 o ×1000)1.2.2 renda mediana: value
Diferènciavalue i value2value − value25.1.1 diferència d'atur dones−homes

TIP

El fet que un indicador sigui de tipus "ràtio" a nivell de càlcul es correspon amb l'estratègia ratio del càlcul d'agrupacions (vegeu Agrupacions): el backend suma numeradors i denominadors per separat i desa value/value2, sense aplicar cap factor d'escala. El factor multiplicador (×100, ×1000...) l'aplica únicament el frontend en mostrar el valor (vegeu Càlcul i format dels valors). El camp scale de l'entitat Indicator és un romanent i no es fa servir al backend.

On es defineix el càlcul

La fórmula concreta de cada indicador (quina operació i quants decimals) es defineix dues vegades, i les dues han d'estar sincronitzades:

  • Backendsrc/Util/IndicatorCalculator.php
  • Frontendsrc/utils/indicators.js

Vegeu la pàgina dedicada Càlcul i format dels valors per a la taula completa de funcions de càlcul i el mapatge indicador → fórmula.

Evolució de l'esquema: migracions

Cap canvi directe a la BBDD

Tots els canvis d'esquema (afegir/eliminar columnes, índexs, taules, etc.) s'han de fer sempre via una migració Doctrine. No editeu mai l'estructura de la base de dades amb un client SQL ni executeu doctrine:schema:update en producció. Les migracions són la font de veritat versionada de l'esquema, i sense elles els entorns acaben desincronitzats.

Flux habitual

bash
# 1. Modificar l'entitat (afegir una propietat, canviar un tipus, etc.)
#    Pots fer-ho a mà a src/Entity/{Entity}.php o amb make:entity:
php bin/console make:entity Indicator

# 2. Generar la migració comparant l'estat actual de les entitats amb la BBDD
php bin/console make:migration
# (equivalent: php bin/console doctrine:migrations:diff)

# 3. Revisar el fitxer generat a migrations/Version{timestamp}.php
#    Cal llegir-lo sempre: a vegades cal afegir-hi una migració de dades manual.

# 4. Aplicar la migració
php bin/console doctrine:migrations:migrate

Comandes habituals

ComandaQuè fa
make:entityCrea o modifica una entitat (afegeix propietats interactivament)
make:migrationGenera una migració a partir de la diferència entre entitats i BBDD
doctrine:migrations:migrateAplica totes les migracions pendents
doctrine:migrations:statusMostra quines migracions s'han aplicat i quines queden
doctrine:migrations:execute --down 'DoctrineMigrations\VersionXXX'Reverteix una migració concreta
doctrine:migrations:rollupMarca totes les migracions com a aplicades (per a un esquema acabat de carregar)
doctrine:schema:validateComprova que entitats i BBDD coincideixen
make:controllerCrea un controlador buit
make:commandCrea una comanda CLI buida

API Platform: cap canvi d'esquema

Afegir o modificar endpoints amb atributs #[ApiResource] o #[ApiFilter] no requereix migració: només afecta la capa HTTP. Només cal migració quan canvies columnes o relacions a l'entitat.

Documentació oficial

Generar el diagrama complet

Si tens instal·lat el bundle jawira/doctrine-diagram-bundle:

bash
php bin/console doctrine:generate:diagram

Publicat sota llicència MIT