# Datenmodell für Regeln + Bedingungen & Referenz auf andere Tabelle



## beta20 (6. Nov 2019)

Hallo, 

ich habe mal eine Frage zur Erstellung von Regeln mit Bedingungen in einem Datenmodell.
Was ich habe ist:

*Tabelle: Rule*
- ID 
- Name
- Description

*Tabelle: RuleAction*
- ID
- Operator (+, -, ....)
- FieldName (bspw. email)
- FieldDataType (String)
- FieldValue (test@domain.com)
- RuleFK

So funktioniert das für einzelne Felder, wie bspw. die Emailadresse wunderbar.
Mein Problem ist nun aber, wie speichere ich Referenzen auf andere Tabellen.

Bspw: 
FieldName "CUSTOMER_FK" soll die ID = 1 sein
Wäre dann eben:
- Operator (=)
- FieldName (CUSTOMER_FK)
- FieldDataType (SINGLE_LIST)
- FieldValue (ID = 1)

Hat jemand eine Idee?


----------



## Thallius (6. Nov 2019)

Sorry aber ich verstehe überhaupt nicht was du willst.


----------



## Oneixee5 (6. Nov 2019)

Meinst du sowas wie Fremdschlüsselbeziehungen in Datenbanken? Das ist ein komplexes Thema und lässt sich nicht mit 2 Sätzen erklären. Sieh mal z.B.: https://de.wikibooks.org/wiki/Einführung_in_SQL:_Fremdschlüssel-Beziehungen


----------



## mihe7 (6. Nov 2019)

beta20 hat gesagt.:


> So funktioniert das für einzelne Felder, wie bspw. die Emailadresse wunderbar.
> Mein Problem ist nun aber, wie speichere ich Referenzen auf andere Tabellen.


Ob das so wunderbar funktioniert, ist die Frage. Warum willst Du auf Tabellenebene arbeiten?


----------



## beta20 (6. Nov 2019)

Naja, da sehe ich weniger Hindernisse.
Dann generiere ich mir eben ein SQL Statement auf Basis der RuleAction.
vllt sollte ich als Attribut in RuleAction noch gleich den Tabellennamen mitgeben.

Dann kann ich mir ja eben sowas basteln, wie:

```
public void generateSql(RuleAction ruleAction) {
"SELECT * FROM" + ruleAction.getTableName()....
"WHERE " + ruleAction.getFieldName()
}
```
Für die RuleCondition mache ich dann eben ein Mapping, was mir dann die SQL Syntax ausgibt.

Problem ist dann eben, wenn ich anstatt ein Feldname eine Referenz auf eine andere Tabelle speichern will.
Was ich machen könnte wäre, dass ich mir die den Tabellenname als String speichere und dann die ID des Objekts von der anderen Tabelle?

Wie kann ich dann aber eine Multiple List speichern? Also zB muss die Bedingung zutreffen für Kunde1, Kunde2, Kunde3.... (Ohne, dass ich 3 Regeln anlegen muss)


----------



## mihe7 (6. Nov 2019)

beta20 hat gesagt.:


> Naja, da sehe ich weniger Hindernisse.


Eine Regel wäre für mich etwas wie: 
1. wenn Kunde 0815 seit mindestens 180 Tagen nichts mehr bestellt hat, dann schick ihm ein E-Mail. 
oder
2. wenn eine E-Mail im Betreff XYZ enthält und sich im Posteingang befindet, dann verschiebe sie in den Folder ABC
o. ä.
Ich sehe hier nirgends ein DB-Feld oder eine Tabelle.


----------



## beta20 (6. Nov 2019)

Wir sollten zwischen Bedingung und Aktion differenzieren:

*Bedingung:*
Kunde = Tabelle
0815 = Kundennummer (=DB Feld)
seit mind. 180 Tagen (Operator ist dann >)
180 = conditionValue


----------



## mihe7 (6. Nov 2019)

1. was soll diese Bedingung denn aussagen? Kunde 0815 seit mind. 180 Tagen.
2. wer sagt denn, dass der Kunde in einer Tabelle liegt?


----------



## beta20 (6. Nov 2019)

nein, ich baue mir doch nur anhand dessen meine SQL Query...
Ob der Kunde in der DB ist, ist ja meine Prüfung...


----------



## mihe7 (6. Nov 2019)

beta20 hat gesagt.:


> nein, ich baue mir doch nur anhand dessen meine SQL Query...


Die Frage ist, woher Du weißt, dass "180" in dem Fall bedeutet: keine Bestellung seit mind. 180 Tagen?



beta20 hat gesagt.:


> Ob der Kunde in der DB ist, ist ja meine Prüfung...


Deine Prüfung ist, ob es einen Datensatz mit einer ID abc in einer Tabelle XYZ in einer DB existiert. Das ist eine mögliche Implementierung. Das Konzept sehe ich aber auf anderer Ebene.


----------



## mrBrown (7. Nov 2019)

Nochmal die Bitte, versuch doch deine Threads halbwegs in ein passendes Forum einzuordnen. Keines deiner Themen ist im Anfängerforum (Fragen *ausschließlich zu Java-Grundlagen* von Ein- und Umsteigern.) passend aufgehoben.


----------



## beta20 (11. Nov 2019)

mihe7 hat gesagt.:


> Die Frage ist, woher Du weißt, dass "180" in dem Fall bedeutet: keine Bestellung seit mind. 180 Tagen?



Naja dazu bräuchte ich noch ein ValueType oder sowas. So ganz trivial ist das nicht....


----------



## mihe7 (11. Nov 2019)

beta20 hat gesagt.:


> Naja dazu bräuchte ich noch ein ValueType oder sowas. So ganz trivial ist das nicht....


Eben. Bevor Du Dich mit Fragen quälst, wie Du das in der DB darstellst, solltest Du Dir erstmal ein Modell überlegen, mit dem Du die Regeln ausreichend beschreiben kannst.


----------

