Datenmodell finalisieren #2

Closed
opened 2026-05-13 12:25:45 +00:00 by jreinemann-euris · 3 comments
jreinemann-euris commented 2026-05-13 12:25:45 +00:00 (Migrated from github.com)

Ziel

Room-Entities aus dem Anforderungsdokument ableiten und final festlegen.

Scope (enthalten)

  • Alle Room-Entities mit Feldern und Datentypen definieren (Items, Categories, Locations, …)
  • Beziehungen zwischen Entities (1:N, N:M)
  • Enums und Value-Types (z.B. Einheit, MHD-Format)

Akzeptanzkriterium

Entscheidung ist dokumentiert (Issue-Kommentar oder Anforderungen-Datei) und dient als Referenz für alle nachgelagerten Features.

## Ziel Room-Entities aus dem Anforderungsdokument ableiten und final festlegen. ## Scope (enthalten) - Alle Room-Entities mit Feldern und Datentypen definieren (Items, Categories, Locations, …) - Beziehungen zwischen Entities (1:N, N:M) - Enums und Value-Types (z.B. Einheit, MHD-Format) ## Akzeptanzkriterium Entscheidung ist dokumentiert (Issue-Kommentar oder Anforderungen-Datei) und dient als Referenz für alle nachgelagerten Features.
jreinemann-euris commented 2026-05-13 12:52:50 +00:00 (Migrated from github.com)

Entschieden (2026-05-13)

Gewählt: Ansatz B - Pragmatisches Datenmodell

Begruendung: Beste Balance aus sauberer Normalisierung (Category, Location als verwaltbare Entities) und pragmatischer Vereinfachung (Unit als String, kein Unit-Overhead).


Finale Room-Entities

Category

  • id: Int PK AutoIncrement
  • name: String (benutzerdefiniert, z.B. Grundnahrungsmittel)

Location

  • id: Int PK AutoIncrement
  • name: String (benutzerdefiniert, z.B. Keller)

Item

  • id: String (UUID) - exportfreundlich, verteilte Systeme
  • name: String
  • categoryId: Int FK -> Category.id
  • quantity: Double
  • unit: String (kg, l, Stueck, Dosen ...)
  • unitPrice: Double
  • totalPrice: NICHT gespeichert, berechnet: quantity x unitPrice
  • kcalPer100g: Int? (nullable, nur fuer Lebensmittel)
  • expiryDate: LocalDate? (TypeConverter -> String ISO-8601, kompatibel mit JSON-Export)
  • locationId: Int FK -> Location.id
  • minStock: Double (gleiche Einheit wie quantity)
  • notes: String
  • lastUpdated: Long (Epoch-Millis)

Settings

  • key: String PK (z.B. persons, kcalPerPersonPerDay)
  • value: String (serialisiert)

Beziehungen

  • Item -> Category: N:1
  • Item -> Location: N:1

TypeConverter

  • LocalDate? <-> String? (ISO-8601: 2028-01-01) - direkt kompatibel mit JSON-Format

Berechnete Felder (nicht in DB)

  • totalPrice = quantity x unitPrice
  • totalKcal = (quantity_in_100g) x kcalPer100g
  • rangeInDays = totalKcal / (persons x kcalPerPersonPerDay)

Alternativen geprueft:

  • Ansatz A (Vollnormalisiert, Unit als Entity): Overhead ohne Mehrwert fuer v1.0
  • Ansatz C (Flach, alles String): Kategorieverwaltung nicht sauber umsetzbar
## Entschieden (2026-05-13) **Gewählt:** Ansatz B - Pragmatisches Datenmodell **Begruendung:** Beste Balance aus sauberer Normalisierung (Category, Location als verwaltbare Entities) und pragmatischer Vereinfachung (Unit als String, kein Unit-Overhead). --- ## Finale Room-Entities ### Category - id: Int PK AutoIncrement - name: String (benutzerdefiniert, z.B. Grundnahrungsmittel) ### Location - id: Int PK AutoIncrement - name: String (benutzerdefiniert, z.B. Keller) ### Item - id: String (UUID) - exportfreundlich, verteilte Systeme - name: String - categoryId: Int FK -> Category.id - quantity: Double - unit: String (kg, l, Stueck, Dosen ...) - unitPrice: Double - totalPrice: NICHT gespeichert, berechnet: quantity x unitPrice - kcalPer100g: Int? (nullable, nur fuer Lebensmittel) - expiryDate: LocalDate? (TypeConverter -> String ISO-8601, kompatibel mit JSON-Export) - locationId: Int FK -> Location.id - minStock: Double (gleiche Einheit wie quantity) - notes: String - lastUpdated: Long (Epoch-Millis) ### Settings - key: String PK (z.B. persons, kcalPerPersonPerDay) - value: String (serialisiert) --- ## Beziehungen - Item -> Category: N:1 - Item -> Location: N:1 ## TypeConverter - LocalDate? <-> String? (ISO-8601: 2028-01-01) - direkt kompatibel mit JSON-Format ## Berechnete Felder (nicht in DB) - totalPrice = quantity x unitPrice - totalKcal = (quantity_in_100g) x kcalPer100g - rangeInDays = totalKcal / (persons x kcalPerPersonPerDay) --- **Alternativen geprueft:** - Ansatz A (Vollnormalisiert, Unit als Entity): Overhead ohne Mehrwert fuer v1.0 - Ansatz C (Flach, alles String): Kategorieverwaltung nicht sauber umsetzbar
jreinemann-euris commented 2026-05-13 12:52:54 +00:00 (Migrated from github.com)

Entschieden (2026-05-13)

Gewählt: Ansatz B - Pragmatisches Datenmodell

Begruendung: Beste Balance aus sauberer Normalisierung (Category, Location als verwaltbare Entities) und pragmatischer Vereinfachung (Unit als String, kein Unit-Overhead).


Finale Room-Entities

Category

  • id: Int PK AutoIncrement
  • name: String (benutzerdefiniert, z.B. Grundnahrungsmittel)

Location

  • id: Int PK AutoIncrement
  • name: String (benutzerdefiniert, z.B. Keller)

Item

  • id: String (UUID) - exportfreundlich, verteilte Systeme
  • name: String
  • categoryId: Int FK -> Category.id
  • quantity: Double
  • unit: String (kg, l, Stueck, Dosen ...)
  • unitPrice: Double
  • totalPrice: NICHT gespeichert, berechnet: quantity x unitPrice
  • kcalPer100g: Int? (nullable, nur fuer Lebensmittel)
  • expiryDate: LocalDate? (TypeConverter -> String ISO-8601, kompatibel mit JSON-Export)
  • locationId: Int FK -> Location.id
  • minStock: Double (gleiche Einheit wie quantity)
  • notes: String
  • lastUpdated: Long (Epoch-Millis)

Settings

  • key: String PK (z.B. persons, kcalPerPersonPerDay)
  • value: String (serialisiert)

Beziehungen

  • Item -> Category: N:1
  • Item -> Location: N:1

TypeConverter

  • LocalDate? <-> String? (ISO-8601: 2028-01-01) - direkt kompatibel mit JSON-Format

Berechnete Felder (nicht in DB)

  • totalPrice = quantity x unitPrice
  • totalKcal = (quantity_in_100g) x kcalPer100g
  • rangeInDays = totalKcal / (persons x kcalPerPersonPerDay)

Alternativen geprueft:

  • Ansatz A (Vollnormalisiert, Unit als Entity): Overhead ohne Mehrwert fuer v1.0
  • Ansatz C (Flach, alles String): Kategorieverwaltung nicht sauber umsetzbar
## Entschieden (2026-05-13) **Gewählt:** Ansatz B - Pragmatisches Datenmodell **Begruendung:** Beste Balance aus sauberer Normalisierung (Category, Location als verwaltbare Entities) und pragmatischer Vereinfachung (Unit als String, kein Unit-Overhead). --- ## Finale Room-Entities ### Category - id: Int PK AutoIncrement - name: String (benutzerdefiniert, z.B. Grundnahrungsmittel) ### Location - id: Int PK AutoIncrement - name: String (benutzerdefiniert, z.B. Keller) ### Item - id: String (UUID) - exportfreundlich, verteilte Systeme - name: String - categoryId: Int FK -> Category.id - quantity: Double - unit: String (kg, l, Stueck, Dosen ...) - unitPrice: Double - totalPrice: NICHT gespeichert, berechnet: quantity x unitPrice - kcalPer100g: Int? (nullable, nur fuer Lebensmittel) - expiryDate: LocalDate? (TypeConverter -> String ISO-8601, kompatibel mit JSON-Export) - locationId: Int FK -> Location.id - minStock: Double (gleiche Einheit wie quantity) - notes: String - lastUpdated: Long (Epoch-Millis) ### Settings - key: String PK (z.B. persons, kcalPerPersonPerDay) - value: String (serialisiert) --- ## Beziehungen - Item -> Category: N:1 - Item -> Location: N:1 ## TypeConverter - LocalDate? <-> String? (ISO-8601: 2028-01-01) - direkt kompatibel mit JSON-Format ## Berechnete Felder (nicht in DB) - totalPrice = quantity x unitPrice - totalKcal = (quantity_in_100g) x kcalPer100g - rangeInDays = totalKcal / (persons x kcalPerPersonPerDay) --- **Alternativen geprueft:** - Ansatz A (Vollnormalisiert, Unit als Entity): Overhead ohne Mehrwert fuer v1.0 - Ansatz C (Flach, alles String): Kategorieverwaltung nicht sauber umsetzbar
jreinemann-euris commented 2026-05-13 12:53:05 +00:00 (Migrated from github.com)

Datenmodell finalisiert. Entscheidung im Kommentar oben dokumentiert.

Datenmodell finalisiert. Entscheidung im Kommentar oben dokumentiert.
Sign in to join this conversation.
No description provided.