Pflanzendatenbank [Noob fängt an]

AliceDeh

Aktiver Benutzer
Beiträge
31
Grüße Leute,

ich betreibe zurzeit das Projekt meiner Pflanzendatenbank und würde gerne Schrittweise mein Vorgehen hier posten und mir Meinungen und Tipps einholen.

Ich habe bereits das ER-Modell und wenn ich die Sache mit den ID's und den Beziehungen richtig verstanden habe, dann müsste es auf diesem Wege funktionieren:

ER-Modell:
mtscz54n.png
Codes:

Abschnitt 1 "Main"-tables:
Code:
USE    My_Plantz


--#SKRIPT: Erstellen der Haupt- bzw. "Schlüssel"-tabellen.
--#TABELLEN_OHNE_FREMDSCHLÜSSEL ! BEGIN / BEGIN !
--Erstelle Tabelle "T_Pflanzengattung"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Gat_ID"

CREATE TABLE
    T_Pflanzengattung
        (Pk_Gat_ID int NOT NULL,
         Gattung nvarchar (50),
         Lat_Gattung nvarchar (50),
         PRIMARY KEY(Pk_Gat_ID))
; --/CREATE TABLE "T_Pflanzengattung"

--Erstelle Tabelle "T_Pflanzenordnung"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Ord_ID"

CREATE TABLE
    T_Pflanzenordnung
        (Pk_Ord_ID int NOT NULL,
         Ordnung nvarchar (50),
         Lat_Ordnung nvarchar (50),
         PRIMARY KEY(Pk_Ord_ID))
; --/CREATE TABLE "T_Pflanzenordnung"

--Erstelle Tabelle "T_Pflanzenfamilie"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Fam_ID"

CREATE TABLE
    T_Pflanzenfamilie
        (Pk_Fam_ID int NOT NULL,
         Familie nvarchar (50),
         Lat_Familie nvarchar (50),
         PRIMARY KEY(Pk_Fam_ID))
; --/CREATE TABLE "T_Pflanzenfamilie"

--Erstelle Tabelle "T_Pflanzenunterfamilie"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Unter_ID"

CREATE TABLE
    T_Pflanzenunterfamilie
        (Pk_Unter_ID int NOT NULL,
         Unterfamilie nvarchar (50),
         Lat_Unterfamilie nvarchar (50),
         PRIMARY KEY(Pk_Unter_ID))
; --/CREATE TABLE "T_Pflanzenunterfamilie"

--Erstelle Tabelle "T_Naehrstoffe"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Naehr_ID"

CREATE TABLE
    T_Naehrstoffe
        (Pk_Naehr_ID int NOT NULL,
         Naehrstoff nvarchar (20),
         Naehrstoffgruppe nvarchar (10),
         PRIMARY KEY(Pk_Naehr_ID))
; --/CREATE TABLE "T_Naehrstoffe"
--#TABELLEN_OHNE_FREMDSCHLÜSSEL ! ENDE / ENDE !

Abschnitt 2: Beziehungen erstellen

Code:
USE    My_Plantz


--#SKRIPT: Erstellen der Haupt- bzw. "Schlüssel"-tabellen.
--#TABELLEN_MIT_FREMDSCHLÜSSEL ! BEGIN / BEGIN !

--Erstelle Tabelle "T_Pflanzenart"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Art_ID"
USE My_Plantz
CREATE TABLE
    T_Pflanzenart
        (Pk_Art_ID int NOT NULL,
         Art nvarchar (50),
         PkF_Gat_ID int, --Pflanzengattung PRIMARY KEY
         PkF_Ord_ID int, --Pflanzenordnung PRIMARY KEY
         PkF_Fam_ID int, --Pflanzenfamilie PRIMARY KEY
         PkF_Unter_ID int, --Pflanzenunterfamilie PRIMARY KEY
         PRIMARY KEY(Pk_Art_ID),
            CONSTRAINT
                c_Foreign_Gat_ID --Pk_Gat_ID <> PkF_Gat_ID
                FOREIGN KEY(PkF_Gat_ID)
                REFERENCES T_Pflanzengattung(Pk_Gat_ID),
            CONSTRAINT
                c_Foreign_Ord_ID --Pk_Ord_ID <> PkF_Ord_ID
                FOREIGN KEY(PkF_Ord_ID)
                REFERENCES T_Pflanzenordnung(Pk_Ord_ID),
            CONSTRAINT
                c_Foreign_Fam_ID --Pk_Fam_ID <> PkF_Fam_ID
                FOREIGN KEY(PkF_Fam_ID)
                REFERENCES T_Pflanzenfamilie(Pk_Fam_ID),
            CONSTRAINT
                c_Foreign_Unter_ID --Pk_Unter_ID <> PkF_Unter_ID
                FOREIGN KEY(PkF_Unter_ID)
                REFERENCES T_Pflanzenunterfamilie(Pk_Unter_ID))
; --/CREATE TABLE "T_Pflanzengattung"

--Erstelle Tabelle "T_Naehrstoffbedarf"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Naehrbedarf_ID"
CREATE TABLE
    T_Naehrstoffbedarf
        (Pk_Naehrbedarf_ID int NOT NULL,
         PkF_Art_ID int,
         PkF_Naehr_ID int,
         PRIMARY KEY(Pk_Naehrbedarf_ID),
            CONSTRAINT
                c_Foreign_Art_ID
                FOREIGN KEY(PkF_Art_ID)
                REFERENCES T_Pflanzenart(Pk_Art_ID),
            CONSTRAINT
                c_Foreign_Naehr_ID
                FOREIGN KEY(PkF_Naehr_ID)
                REFERENCES T_Naehrstoffe(Pk_Naehr_ID))
; --/CREATE TABLE "T_Pflanzengattung"

Ist das so korrekt? Was sagt ihr?

Guten Abend
 
Werbung:
Ich würde sagen mindestens die Tabelle Pflanzenfamilie ist falsch verknüpft. Normalerweise sollte doch eine Familie mehrere Unterfamilien haben und wer einer Unterfamilie angehört, gehört zwangsläufig der Hauptfamilie an, der auch die Unterfamilie angehört- also streng hirachisch.

Was der Unterschied zwischen Familie und Gattung genau ist weiß ich nicht. Noch habe ich noch nichtmal einen Garten :)
 
Wobei ich generell eher eine Tabelle Pflanzenfamilie allgemein erstellen würde und die Ordnung in eine extra Tabelle packen würde.
Bsp.:
Tabelle: Pflanzenfamilien
- Fam_ID (PK)
- Bezeichnung
- Lat_Bezeichnung (Statt Bezeichnung und lat. Bezeichnung eine Tabelle Bezeichnung ? Damit könnte man dann mehr als 2 Sprachen abdecken)

Tabelle: Familienhierarchie
- Hauptfam_ID (FK zu Pflanzenfamilien.Fam_ID)
- Unterfam_ID (FK zu Pflanzenfamilien.Fam_ID)

Sowas in der Art ? ^^
Damit könnte man dann evtl. auch noch die Art der zugehörigkeit festlegen (Also Daten für die Verbindung der beiden Familien wie z.B. übereinstimmung der DNA in % oder sowas)

(Ich hab keine Ahnung von Pflanzen... Bei mir gehen sogar Kakteen ein ^^)
 
Danke für den Tip! Ich habe die Tabelle "Pflanzenunterfamilie" nun als FK in der Tabelle "Pflanzenfamilie" untergebracht.

Mal noch eine etwas andere Frage:
Wenn ich Familie, Ordnung, etc in der Tabelle eingetragen habe und ich nun in der Tabelle "Pflanzenart" die Pflanze auswählen möchte und ihr Familie und Ordnung zuordnen möchte, erscheinen dann automatisch die Einträge der "Pflanzenfamilie" in der Tabelle "Pflanzenart" und ich brauch einfach nur aus der Liste auswählen?
So kenne ich das aus Access, aber ich habe gestern in der Tabelle "Pflanzenfamilie" etwas eingetragen aber musste dann in der Tabelle "Pflanzenart" die Familie manuell eintragen.

Muss das so sein?

Gruß
 
Eintragen und Anzeige der Datensätze sind sache deines Front-Ends, also deiner Anwendung. Die Datenbank verwaltet nur die Daten und stellt z.B. sicher das Fremdschlüssel existieren.
 
Ok, danke. Also muss ich mit Views arbeiten oder sind "Front-Ends" eine extra Schiene?
Unsere Anwendungsentwickler auf Arbeit entwerfen die "Front-Ends". Vielleicht wende ich mich mal an die. :)
Danke für die Info.

Sind "views" "front-ends" ?

PS: Meine Tabelle "Pflanzenart" wäre dann die "Front-End-Tabelle" ?
Ich würde gerne in dieser Tabelle die Daten der anderen Tabellen zusammenfließen lassen,
also eine Pflanze per grafische Oberfläche eine Art, Ordnung und Familie zuordnen.

Erledige ich das vorher oder über Front-Ends?

Btw: Bekommt meine Pflanzenart die ID der Familie (Pk_Fam_ID) oder den Familiename?
Ich verstehe noch nicht ganz weshalb man ID'S verwendet. Das verwirrt mich leicht.
Ich habe es einfach eingebunden, weil man mir mal sagte, dass Datenbanken dann schneller die Daten finden / verarbeiten können.
 
Zuletzt bearbeitet:
Nein nein, "Front-End" ist die Anwendung oder die Webseite oder was auch immer in die du deine Daten eingibst und mit der du dir die Daten anzeigen lassen kannst. Die Datenbank bezeichnet man auch als "Back-End", die ist nur für das Speichern und liefern von Daten zuständig. Natürlich kann sie auch Berechnungen durchführen oder mit Views Dinge verinfachen, aber der Kern ist die Datenhaltung.
 
Ok, aber in jeder Tabelle steht ja eine ID und in der Tabelle "Pflanzenart" ordne ich ja zB der Kartoffel eine "Art_ID", "Gat_ID", "Fam_ID" usw zu.
Theoretisch würde dann dort stehen: Kartoffel - 1 - 3 - 4 - 7

Die Zahlen sollen dabei aber die Familie, Gattung und Unterfamilie darstellen mit Text, aber ich lasse ja die ID's zusammenfließen.
Warum macht man das so? Ich würde doch gerne: Kartoffel - Ordnung: Nachschattenartige - Familie: Nachtschattengewächse etc mir anzeigen lassen.
Weswegen verwendet man ID's? Oder ist es mein Fehler und ich muss den Familienname, Gattungsname, etc zusammenfließen lassen in der Tabelle "Pflanzenart" ?

Gruß
 
Hey ja Joins kenne ich. Da "verschmelzt" man Tabellen miteinander. Also kombiniere ich die jeweiligen ID's miteinander und dann entsteht ja eine Tabelle mit Spalten und Zeilen der "verschmelzten" Tabellen.
Aber wie sage ich der Tabelle dann, dass sie anstatt den ID's die 2. Spaltenüberschrift, also den Familien-, Gattungsnamen, etc. anzeigen soll? :)

Gruß

PS: Ich joine erstmal ein paar Tabellen, aber ich habe bis jetzt keine Datensätze eingetragen, weil ich noch erfragen wollte, ob ich die ID's auf "auto_increment" setzen soll.
Ist das sinnvoll oder soll ich das lieber erstmal lassen? Sieht mir nach einem mächtigen Befehl aus der viel Schaden anrichtet, wenn man verkackt.
 
PS: Leider finde ich nichts bei Google dazu, wie man vorgehen muss, wenn ich einen Fremdschlüssel als erneuten Fremdschlüssel in einer anderen Tabelle verwenden möchte.

Hat diesbezüglich jemand einen Tip?

Gruß
 
Hmn. Na vielleicht hilft es wenn ich mal den Code poste. Kann ich das so machen? habe ich alles richtig beachtet? Laut all euren Tipps müsste dies so korrekt sein:

Code:
USE    My_Plantz


--#SKRIPT: Erstellen der Haupt- bzw. "Schlüssel"-tabellen.


--#TABELLEN_OHNE_FREMDSCHLÜSSEL ! BEGIN / BEGIN !


--Erstelle Tabelle "T_Pflanzengattung"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Gat_ID"

CREATE TABLE
    T_Pflanzengattung
        (Pk_Gat_ID int NOT NULL,
         Gattung nvarchar (50),
         Lat_Gattung nvarchar (50),
         PRIMARY KEY(Pk_Gat_ID))
; --/CREATE TABLE "T_Pflanzengattung"


--Erstelle Tabelle "T_Pflanzenordnung"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Ord_ID"

CREATE TABLE
    T_Pflanzenordnung
        (Pk_Ord_ID int NOT NULL,
         Ordnung nvarchar (50),
         Lat_Ordnung nvarchar (50),
         PRIMARY KEY(Pk_Ord_ID))
; --/CREATE TABLE "T_Pflanzenordnung"


--Erstelle Tabelle "T_Pflanzenunterfamilie"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Unter_ID"

CREATE TABLE
    T_Pflanzenunterfamilie
        (Pk_Unter_ID int NOT NULL,
         Unterfamilie nvarchar (50),
         Lat_Unterfamilie nvarchar (50),
         PRIMARY KEY(Pk_Unter_ID))
; --/CREATE TABLE "T_Pflanzenunterfamilie"


--Erstelle Tabelle "T_Naehrstoffe"
--Erstelle Constraint [Bedingung] "NOT NULL"
--Erstelle Constraint [Bedingung] "PRIMARY KEY on Pk_Naehr_ID"

CREATE TABLE
    T_Naehrstoffe
        (Pk_Naehr_ID int NOT NULL,
         Naehrstoff nvarchar (20),
         Naehrstoffgruppe nvarchar (10),
         PRIMARY KEY(Pk_Naehr_ID))
; --/CREATE TABLE "T_Naehrstoffe"


--#TABELLEN_OHNE_FREMDSCHLÜSSEL ! ENDE / ENDE !

Code:
USE    My_Plantz


--#SKRIPT: Erstellen der Haupt- bzw. "Schlüssel"-tabellen.


--#TABELLEN_MIT_FREMDSCHLÜSSEL ! BEGIN / BEGIN !


--Erstelle Tabelle "T_Pflanzenfamilie"
--Erstelle "PRIMARY KEY" auf Pk_Fam_ID
--KANN NUR MIT DER TABELLE "T_Pflanzenunterfamilie" EXISTIEREN
--Erstelle "FOREIGN KEY" Pk_Unter_ID wird Fremdschlüssel als PkF_Unter_ID in "T_Pflanzenfamilie"

CREATE TABLE
    T_Pflanzenfamilie
        (Pk_Fam_ID int NOT NULL,
         PkF_Unter_ID int NOT NULL,
         Familie nvarchar (50),
         Lat_Familie nvarchar (50),
         PRIMARY KEY(Pk_Fam_ID),
             CONSTRAINT
                c_Foreign_Unter_ID --Pk_Unter_ID <> PkF_Unter_ID
                FOREIGN KEY(PkF_Unter_ID)
                REFERENCES T_Pflanzenunterfamilie(Pk_Unter_ID))
; --/CREATE TABLE "T_Pflanzenfamilie"


--Erstelle Tabelle "T_Pflanzenart"
--Erstelle "PRIMARY KEY" auf Pk_Art_ID

CREATE TABLE
    T_Pflanzenart
        (Pk_Art_ID int NOT NULL,
         Art nvarchar (50),
         PkF_Gat_ID int, --Von: Pflanzengattung PRIMARY KEY
         PkF_Ord_ID int, --Von: Pflanzenordnung PRIMARY KEY
         PkF_Fam_ID int, --Von: Pflanzenfamilie PRIMARY KEY
         PkF_Unter_ID int, --Von: Pflanzenunterfamilie PRIMARY KEY
         PRIMARY KEY(Pk_Art_ID),
            CONSTRAINT
                c_Foreign_Gat_ID --Pk_Gat_ID <> PkF_Gat_ID
                FOREIGN KEY(PkF_Gat_ID)
                REFERENCES T_Pflanzengattung(Pk_Gat_ID),
            CONSTRAINT
                c_Foreign_Ord_ID --Pk_Ord_ID <> PkF_Ord_ID
                FOREIGN KEY(PkF_Ord_ID)
                REFERENCES T_Pflanzenordnung(Pk_Ord_ID),
            CONSTRAINT
                c_Foreign_Fam_ID --Pk_Fam_ID <> PkF_Fam_ID
                FOREIGN KEY(PkF_Fam_ID)
                REFERENCES T_Pflanzenfamilie(Pk_Fam_ID, PkF_Unter_ID))
; --/CREATE TABLE "T_Pflanzengattung"


--Erstelle Tabelle "T_Naehrstoffbedarf"
--Erstelle "PRIMARY KEY" auf Pk_Naehrbedarf_ID
CREATE TABLE
    T_Naehrstoffbedarf
        (Pk_Naehrbedarf_ID int NOT NULL,
         PkF_Art_ID int,
         PkF_Naehr_ID int,
         PRIMARY KEY(Pk_Naehrbedarf_ID),
            CONSTRAINT
                c_Foreign_Art_ID
                FOREIGN KEY(PkF_Art_ID)
                REFERENCES T_Pflanzenart(Pk_Art_ID),
            CONSTRAINT
                c_Foreign_Naehr_ID
                FOREIGN KEY(PkF_Naehr_ID)
                REFERENCES T_Naehrstoffe(Pk_Naehr_ID))
; --/CREATE TABLE "T_Pflanzengattung"

Code:
USE    My_Plantz


--#SKRIPT: Einfügen der Tabelleninhalte.


-- Füge Inhalt "T_Naehrstoffe" hinzu
INSERT INTO
T_Naehrstoffe(Pk_Naehr_ID, Naehrstoff, Naehrstoffgruppe)
    VALUES
    (*Pk_Naehr, *Naehrstoff, *Naehrstoffgruppe)
;--/INSERT ITO


-- Füge Inhalt "T_Pflanzengattung" hinzu
INSERT INTO
T_Pflanzengattung(Pk_Gat_ID, Gattung, Lat_Gattung)
    VALUES
    (*Pk_Gat_ID, *Gattung, *Lat_Gattung)
;--/INSERT INTO


-- Füge Inhalt "T_Pflanzenordnung" hinzu
INSERT INTO
T_Pflanzenordnung(Pk_Ord_ID, Ordnung, Lat_Ordnung)
    VALUES
    (*Pk_Ord_ID, *Ordnung, *Lat_Ordnung)
;--/INSERT INTO


-- Füge Inhalt "T_Pflanzenunterfamilie" hinzu
INSERT INTO
T_Pflanzenunterfamilie(Pk_Unter_ID, Unterfamilie, Lat_Unterfamilie)
    VALUES
    (*Pk_Unter_ID, *Unterfamilie, *Lat_Unterfamilie)
;--/INSERT INTO


-- Füge Inhalt "T_Pflanzenfamilie" hinzu
INSERT INTO
T_Pflanzenfamilie(Pk_Fam_ID, Familie, Lat_Familie)
    VALUES
    (*Pk_Fam_ID, *Familie, *Lat_Familie)
;--/INSERT INTO
-- Füge Pk_Unter_ID in PkF_Unter_ID ein
INSERT INTO
T_Pflanzenfamilie(PkF_Unter_ID)
    SELECT
        Pk_Unter_ID
            FROM T_Pflanzenunterfamilie
;--/INSERT INTO SELECT FROM


-- Füge Inhalt "T_Pflanzenart" hinzu
INSERT INTO
T_Pflanzenart(Pk_Art_ID, Art, PkF_Gat_ID, PkF_Ord_ID, PkF_Fam_ID)
    VALUES
    (*Pk_Art_ID, *Art)
;--/INSERT INTO
-- Füge Pk_Gat_ID in PkF_Gat_ID ein
-- Füge Pk_Ord_ID in PkF_Ord_ID ein
-- Füge Pk_Fam_ID in PkF_Fam_ID ein
INSERT INTO
T_Pflanzenart(PkF_Gat_ID, PkF_Ord_ID, PkF_Fam_ID)
    SELECT
        Pk_Gat_ID, Pk_Ord_ID, Pk_Fam_ID
            FROM
                T_Pflanzengattungen, T_Pflanzenordnung, T_Pflanzenfamilie
;--/INSERT INTO SELECT FROM

Nette Grüße
 
Werbung:
Ohne Daten brauche ich deine Tabellen nicht einspielen :) Aber hier mal ein klassisches Beispiel:
Code:
WITH test_genre(pk,bezeichnung) AS (
    SELECT    1,'House'
    ),
    test_untergenre(pk,fk_genre,bezeichnung) AS (
    SELECT    11,1,'Vocal House'
    ),
    test_tracks(pk,fk_untergenre,bezeichnung) AS (
    SELECT    111,11,'tolles Lied'
    UNION ALL
    SELECT    112,NULL,'anderes Lied'
    )
SELECT    test_tracks.bezeichnung AS track,
        test_genre.bezeichnung AS genre,
        test_untergenre.bezeichnung AS untergenre
FROM    test_tracks
LEFT JOIN test_untergenre
ON        test_tracks.fk_untergenre = test_untergenre.pk
LEFT JOIN test_genre
ON        test_untergenre.fk_genre = test_genre.pk
Mit WITH simuliere ich nur die 3 Tabellen. Der Select zeigt dir die Tabelle tracks an und holt dir über die Unterkategorie die Hauptkategorie. IDs und Fremdschlüssel werden nur benutzt um die Tabellen zu verknüpfen, angezeigt werden durch den Join die Namen aus den Tabellen (+ ggf. weitere Informationen).
 
Zurück
Oben