Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

1

09.11.2015, 16:24

[SQL] Zusammengesetzte Entität auslesen

Hallo,

ich überlege gerade wie ich möglichst effizient mit SQL eine zusammengesetzte Entität auslesen kann:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
type Product struct {
    Id uint64
    Category uint
    Title string
    Cost float32
    Datasheets []Datasheet // <- hier anhängen
    Reviews []Review // <- hier anhängen
}

type Datasheet struct { // liegt immer im Product struct
    Id uint64
    Title string
    Text string
    Sort int
}

type Review struct {
    Id uint64
    Product uint // hat eine Referenz, da es auch losgelöst existieren kann
    Author uint
    Created time.Time
    Title string
    Text string
}


Die Teile sind auch je auf eine Tabelle aufgeteilt. Ich möchte jetzt ein Product auslesen und dann alle Datasheets und Reviews anhängen.
Geht das in einem Schritt oder muss ich 3 Queries nutzen?

[Edit]

Also ums deutlich zu machen hier das ganze zusammenbauen/auslesen, super hässlich.
Ausgabe:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
2015/11/09 16:58:25 ID: 1, category: 1, title: Product_0_0, cost: 605.66
2015/11/09 16:58:25     Title: First, text: First content
2015/11/09 16:58:25     Title: Second, text: Second content
2015/11/09 16:58:25     Title: Third, text: Third content
2015/11/09 16:58:25     Author: user458@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user481@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user302@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user708@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user840@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user454@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user48@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user844@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user995@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0
2015/11/09 16:58:25     Author: user697@test.com, created: 0001-01-01 00:00:00 +0000 UTC, title: Review title, text: 0

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (09.11.2015, 17:00)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

09.11.2015, 17:15

Wenn ich dich richtig verstehe dann möchtest du joinen. Dabei kannst du mehrere selects ineinander verschachteln. Du kannst also im Prinzip aus verschiedenen Einzelanfragen direkt eine machen. Den einzelnen selects, bzw deren Ergebnissen kannst du einen Alias geben um hinterher einfacher darauf zuzugreifen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

3

09.11.2015, 17:22

Gut habe ich auch schon überlegt. Guck dir mal die Ausgabe an.
Problem ist, das an einem Produkt 3 Datasheets und 10 Reviews hängen.

Beispiel:

Quellcode

1
2
3
4
5
6
7
select *
from product p
join datasheet d
  on p.id = d.product
join review r
  on p.id = r.product
where p.title = 'Product_0_0';


Gibt mir 1*3*10 Zeilen.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »DeKugelschieber« (09.11.2015, 17:28)


Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

4

09.11.2015, 17:32

So in etwa hätte ich es auch erst mal versucht. SQL habe ich schon ewig nicht mehr gebraucht. Welche Zeilen hättest du denn erwartet? Aus der Ausgabe kann ich grad nicht schließen welche Zeilen du gerne hättest. Oder sind das alles Datensätze die du gern hättest?

edit: Auch wenn das die SQL Frage nicht löst, ist aber vielleicht dennoch sinnvoll, wie sieht es mit Frameworks wie Hibernate aus? Da kannst du dir die ganze SQL Logik sparen.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

09.11.2015, 17:39

Das wird eine Bespielanwendung die mongodb mit SQL Datenbanken vergleicht. In mongodb lese ich das ganze Produkt einfach mit embedded Reviews und Datenblättern aus. Hier weiß ich gerade nicht wie ich das in einer Query hinbekommen, wenn es überhaupt möglich ist.
Wenn es nicht geht: gut so, ein Argument mehr für mongodb :D

Die Struktur sieht (erstmal) so aus:

Quellcode

1
2
3
1 Produkt
  - 3 Datenblätter
  - 10 Reviews


Lese ich so aus wie oben, bekomme ich alle Kombinationen, also 1*3*10 = 30 Ergebnisse. Da bräuchte ich dann wieder Logik um das zuzuordnen. Pro Ergebnis also das Produkt 30 mal (30x die ID, 30x der Titel, ...) und pro Datenblatt 10 identische Reviews...

Sehr unschön.
Mit der 3 Query Lösung gehts natürlich, aber auch da ist der Code wesentlich komplexer. Ich möchte einen "fairen" Vergleich, das mapping geht mir momentan am meisten auf die Nerven. Daher die Frage.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

6

09.11.2015, 18:16

Ah jetzt verstehe ich dein Problem. Hatte das mit dem 1*3*10 falsch verstanden. Ja das ist normal. Dafür sorgt join ja. Eine andere Möglichkeit würde mir da grad auch nicht einfallen. Schlimm ist das meiner Meinung nach aber erst mal nicht. Kommt aber natürlich auf die Anzahl der Datensätze an.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

7

09.11.2015, 18:44

Sind die 3 Datenblätter und die 10 Reviews (jeweils) alle gleich? Wenn ja dann sollt hier Gruppieren helfen.

Habe aber noch nicht ganz verstanden wo das Problem genau liegt.

Wenn ich auf Arbeit mit Access in VBA eine Abfrage zusammen bastel, gehe ich meistens her und Stricke mir die Querry (in der normalen Entwurfsansicht) so wie ich es brauch und wechsel dann in SQL ansicht und kopier mir den SQL-String. Dafür braucht man natürlich zugang zu MS Access vielleicht geht das aber auch mit der OpenOffice Lösung.
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

8

09.11.2015, 19:28

Ich benutze MySQL, daher fällt Access schon mal flach.
Ich glaube aber auch nicht dass es dafür eine vernünftige SQL Lösung gibt. So wie ich sie haben möchte.
Ein GROUP BY geht nicht, da die Reviews und Datenblätter eben nicht gleich sind. Ich poste später mal das UML dazu.

9

09.11.2015, 19:55

Um ehrlich zu sein, hatte ich so ein Problem auch schonmal. Hab es dann tatsächlich mit 3 Queries gelöst. Finde da SQL auch ein wenig sehr kryptisch...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

10

09.11.2015, 20:18

So siehts aus. Ich denke ich lass es so. Wirkt halt nur doof wenn ich sage: ja da ist mongodb viel besser Entitäten <-> Code mappen, wenns dann doch eine Lösung gäbe (die praktisch anwendbar wäre).

Die Testdaten sind übrigens 1000 Produkte in 8 Kategorien mit je 3 Datenblättern und 10 Reviews.
»DeKugelschieber« hat folgendes Bild angehängt:
  • Relationales_Modell.jpg

Werbeanzeige