Views oder Zwischentabellen?

cups

Grünschnabel
Hey,

ich beschäftige mich für die Uni grad mit dem Thema Datenbanken,
habe aber noch keine Vorlesung dazu gehabt.
Wir haben eine Datenbank erstellt, die auf biologischen Daten basiert und haben
unteranderem die Tabellen Gen und Pathway. Diese stehen jetzt in einer n:m Relation, daher
haben wir eine Zwischentabelle benutzt.
Was ich mich jetzt aber Frage: Warum benutzt man Zwischentabellen überhaupt? Überall redet man davon, dass Konsitenz so wichtig ist, warum dann kein View?
Wir hätten dann die Gentabelle so erweitern müssen, dass sie noch Informationen über die zugehörigen Pathways hat, dann hätten wir einen View erstellen können, dass diese Informationen aber nicht zeigt (damit der Benutzer nur die wenigen Informationen sehen kann, die ihn interessieren) und dann
einen View, der eben die Zwischentabelle simuliert.
Warum ich das so besser finde: Wenn ich jetzt ein Gen lösche, dann müsste ich die zugehörigen Spalten ja auch in meiner Zwischentabelle löschen. Wenn ich jetzt nur 2 Tabellen habe ist das natürlich übersichtlich, aber normalerweise ist es ja so nicht.
Aber da es im Internet überall mit Zwischentabellen gemacht wird, frage ich mich natürlich, was daran besser ist? Denn ich scheine irgendwas ja zu übersehen.

Man könnte womöglich das jew Gen auch mit Select Gen1 from * löschen.. also überall, wo es vorkommt, es auch löschen, aber ich bin mir nicht sicher ob das das A) immer so einfach ist und B) was daran der Vorteil ist. Wenn ich einen View anlege, kann ich ja sicher sein, dass immer die neuen Daten darin sind.

Kann mir jemand das erklären?

LG!

cups
 
hab ich eigentlich versucht zu erklären.
ich habe dann meine tabelle gen:
gen_id, gen_name, gen_pathways(id)
und meine pathwaytabelle:
pathwayname, pathway_id
und würde dann einen view setzen,
meine pathways durchgehen (wir schreiben das in java)
und in diesen view kommen dann eben alle gene,
die gen_pathways(id) == pathway_id (den ich gerade durchgehe)
haben

das funktioniert nicht?
 
Also, eine VIEW ist ein gespeichertes SELECT-Statement und nicht mehr und nicht weniger.

Du hast die Tabelle gen wo jede Zeile eine ID hat.
Dasselbe mit der Tabelle pathway.

Woher weisst du nun, welche gen-Einträge zu welchen pathway-Einträgen gehören? Genau, durch die Zuordnungstabelle. Diese braucht man nachher auch im der VIEW um die Daten zu verbinden.

Was das löschen angeht. Je nach DBMS kannst du das mit einem CONSTRAINT mit Löschweitergabe lösen. Oder einem Trigger.
 
ja richtig, aber ich kann doch genau

Code:
SELECT Gen_id, gen_Pathway_id from Gen where gen_pathway_id == pathway_id
machen, dann werden doch genau diejenige selektiert, die ich für das view brauche.

in java dann
Code:
for(int i=0; i<pathway_id.length; i++) {
     SQL_Statement: SELECT Gen_id, gen_Pathway_id from Gen where gen_pathway_id == pathway_id[i];
}
SQL_Statement, weil mir im Moment gerade der richtige java Befehl nicht einfällt. Ist aber ja auch nicht so wichtig, deswegen dachte ich, es reicht so.
pathway_id ist eben ein Feld, dass all die pathway ids hält.


EDIT: mir fällt auf, dass er hier ja schon beim zweiten Schleifendurchlauf meckern würde, weil er ja so immer mehr views erstellen würde, das habe ich nicht bedacht.
Ich kann doch aber dennoch einen View erstellen, der
SELECT Gen_id, gen_pathway_id from Gen;
in den view packt und dann zum view den jew pathwaynamen hinzufügen..
ich habe ja die zugehörigen von pathwaynamen und id!
 
Zuletzt bearbeitet:
Das ist eine 1:n Beziehung, keine n:m. Denn jeder gen-Eintrag hat so nur eine pathway-ID gespeichert.
 
OK,

nehmen wir mal an Deine Tabelle A enthält 3 Tupel (Zeilen) und 4 Attribute:

A
====================
A_id, atr1, atr2, pathway_id
------------------------------------
A1, 1 , 1, P1
A2, 2 , 5, P2
A3, 5, 9, P1

und Deine Tabelle B 2 Tupel:

B
===============
name, pathway_id
---------------------------
someName, P1
someOther, P2


Nach dieser Annahme kannst Du also mit Deinem SELECT, jeder Tupel in Tabelle A einen Pathway zuordnen. ABER, was ist wenn eine Tupel in Tabelle A mehrere Pathways haben kann...? Genau, dann musst Du für jeden neuen Pathway ein weiteres Attribut hinzufügen...BUMM, macht man nicht. Viel einfacher, übersichtlicher und effizienter ist es, eine Zwischentabelle zu erstellen, die diese Referenzen zwischen den zwei Tabellen verwaltet.

Z:
============
A_id, pathway_id
----------------------
A1, P1
A2, P1
A3, P1
A2, P2
A3, P2

Wie Du jetzt siehst kannst Du jede Tupel aus A mit jeder aus B kombinieren, ohne die Attribute der einzelnen Relationen (Tabellen) zu verändern. Also hast Du eine echte n:m Beziehung und über diese kannst Du jetzt auch ein View legen, welches Dir die referenzierten Datensätze anzeigt. Bezüglich des Löschens hat Dir Yaslaw ja schon gesagt, dass es CONSTRAINTS gibt. Du kannst aber natürlich auch mit JAVA dafür sorgen, dass immer alle Referenzen zu einer ID mitgelöscht werden. Das ganze nennt man auch "Referenzielle Integrität.

So...hope that helps,
OneOf6
 

Neue Beiträge

Zurück