Autor Beitrag
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 30.01.08 18:18 
Hallo!

Ich habe mit Datenbanken bisher nur in PHP (hauptsächlich im Rahmen der Entwicklung der EE-Software) gearbeitet. Das war recht einfach, weil alles ziemlich linear ablief. Nun wollte ich mich mal mit Datenbanken bei "normalen" Anwendungen beschäftigen. Als Lernanwendung habe ich mal ganz einfallslos eine Filmdatenbank gewählt.

Mein Problem ist prinzipieller Natur und ich muss dafür auch ein bisschen ausholen ;-)

Ich habe nun drei Tabellen:
  1. Movies
    - Id
    - Title
  2. Genres
    - Id
    - Title
  3. Movies_Genres
    - Movie_Id
    - Genre_id
Die erste beiden sind klar, die letzte wahrscheinlich auch, sie speichert, welche Genres zu welchen Filmen gehören.


In meiner Anwendung habe ich für Filme und Genres jeweils zwei Klassen. Jeweils eine Klasse, die keine Ahnung von der DB hat, sondern einfach einen Film / ein Genre darstellt, z.B.
ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  Genre = public class
  (* noch ein bisschen Zeugs *)
  public
    property Id : Int64 read fId;    
    property Title : String read fTitle write SetTitle;
        
    property IsChanged : Boolean read fIsChanged;            
    method ToString: String; override;
  end;


Und ich habe jeweils eine (statische) Klasse, welche für die Zugriffe auf die Datenbank zuständig ist, z.B.:
ausblenden Delphi-Prism-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  FbGenre = public static class
  public
    class method Init(aConnection : DbConnection); 
        
    class method Create(aTitle : String) : Genre; 
        
    class method Update(gs : IEnumerable<Genre>);
    class method Delete(gs : IEnumerable<Genre>); 
    class method Get(m : Movie) : List<Genre>;
    class method Get(whereClause : String; params parameters : Array of ParamNameValue) : List<Genre>;     
  end;


Damit habe ich, denke ich, die Datenbank-Zugriffe recht sauber vom Rest getrennt.

Änderungen an den Instanzen werden nicht direkt in die Datenbank geschrieben, sondern beim Schließen der Anwendung wird auf "IsChanged" geprüft und falls das wahr ist, der Datensatz in der DB aktualisiert.

Und hier ist mein Problem:
Wie mache ich das, wenn ein Genre zu einem Film hinzugefügt oder entfernt wird? Hält man in einem solchen Fall eine Liste, welche die hinzugefügten und gelöschten "Verbindungen" speichert und aktualisiert auch dann die DB erst am Schluss? Falls ja: Wo würde ich diese Liste in meiner Klassenstruktur einbauen. In der Movie-Klasse hat sie IMHO nix verloren, weil diese ja nichts von der Datenhaltung wissen soll. :gruebel:

Ich hoffe, ich konnte mein Problem darstellen :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Christian S. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 30.01.08 22:35 
Nach einem Vorschlag von user profile iconRobert_G rufe ich jetzt die Genre-IDs zu jedem Film ab und schaue dadurch, was sich geändert hat. Dem Argument, dass das ja nur ein paar LongInts sind, konnte ich mich nicht verschließen ;-)

Für weitere Vorschläge bin ich offen!

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 31.01.08 08:46 
Ja, das ist schon Mal ne gute Sache, der Film selbst sollte ja schon wissen, welchen Genres er zugeordnet ist, daher einfach eine Liste der GenreIds integrieren.

Ich habe das in meiner Datenbankanwendung dann auch noch etwas weiter getrieben, indem ich auch solchen Verweisen Eigenschaften wie Changed, Deleted und New gegeben habe, damit ich wirklich nur die geänderten Datensätze in der Datenbank schreiben muss. Aber in diesem Fall ist das nicht nötig, da löschst DU dann einfach alle Verbindungen und erstellst sie neu.