# Individuelle Datenbankfelder/-spalten wie realisieren?



## *Hendrik (9. Jan 2008)

Szenario: Swing-Applikation, Hibernate, MySQL (Wechsel auf andere DB soll möglich sein). Es werden Stammdaten z.B. Adressen verwaltet.

Der User soll zusätzliche individuelle/von ihm gewählte Datenbankfelder anlegen können. Z.B. Adressstamm hat Spalten Name, Strasse, PLZ, Ort, Telefon. Der User möchte zusätzlich weitere Spalten definieren können, z.B. Augenfarbe, Größe. Wie kann dies datenbanktechnisch realisiert werden. (Hier geht es nicht um die Darstellung der Daten mit Swing.)

1. Ansatz:

(Primärschlüssel werden nicht aufgeführt)

Eine Tabelle "Adressen" mit den Spalten:

- Name
- Strasse
- PLZ
- Ort
- Telefon
- Individuallfelder (VARCHAR(5000))

plus eine Tabelle "Individualfelder" mit den Spalten:

- Beschreibung (z.B. Augenfarbe)
- Position
- Länge
- Typ

In der Tabelle Individuallfelder werden die zusätzlichen Felder vom User angelegt und in der Spalte Individualfelder des Adressstammes an der angegebenen Position gespeichert.

2. Ansatz:

Eine Tabelle "Adressen" mit den Spalten:

- Adresse_ID
- Name
- Strasse
- PLZ
- Ort
- Telefon

plus eine Tabelle "Individualfelder" mit den Spalten:

- Individuallfeld_ID
- Beschreibung (z.B. Augenfarbe)
- Typ

plus eine Tabelle "Adressen_Wert" mit den Spalten:

- Adresse_ID
- Individuallfeld_ID
- Wert (VARCHAR(255)


Dazu meine Fragen: Gibt es noch weitere Lösungen um dem User Individualfelder zur Verfügung zu stellen? Welchen Ansatz würdet Ihr bevorzugen (Vor- und Nachteile beim Datenzugriff)? (Datenmenge angenommen 5000 Adressen und 50 Individualfelder.)

Gruß 
Hendrik


----------



## tuxedo (10. Jan 2008)

Ansatz 1 versteh ich nicht ganz. Du scheinst die eine Spalte " Individuallfelder (VARCHAR(5000)) " mehrfach mit Strings, die mit irgend einem Zeichen (" ", ";", ",", ...) getrennt sind zu belegen... Abfragetechnisch find ich das eher ungeschickt.

Hätte sowas jetzt auch nach Ansatz Nummer 2 gemacht.

- Alex


----------



## *Hendrik (10. Jan 2008)

Bei Ansatz 1 habe ich das so gemeint:

Beispiel für Individualfelder:

1. Individualfeld:

- Augenfarbe
- 0
- 8 
- alphanumerisch

2. Individualfeld:

- Haarfarbe
- 8
- 8
- alphanumerisch

3. Individualfeld:

- Größe
- 16
- 3
- numerisch


In der Tabelle Adressen wird dann im Feld Individualfelder z.B. der String "blau    braun   165". Die Aufschlüsselung der einzelnen Felder erfolgt über die Position und die Länge, d.h. um Größe festzustellen: substring(16, 16+3); (Wenn das komplette Feld zunächst aus der DB gelesen wird).

Wenn ich mit einem Select arbeite um direkt nur bestimmte Adressen aus der Datenbank zu lesen, z.B. Adressen mit blauen Augen:

Select * from Adressen where 'blau' IN (
          select substring(Indivudualfelder from 1 for 8) from Adressen
          );

(Hab den Select-Befehl jetzt nicht getestet).

EDIT: In meinem Beispielstring werden die Leerzeichen entfernt - ich ersetz die mal durch *: "blau****braun***165"


----------



## tuxedo (10. Jan 2008)

Naja, finde Ansatz 2 immer noch besser. Die Abfrage gestaltet sich so meines Erachtens besser.

- Alex


----------

