[Gelöst] C# MsSQL-Datenbank -- Frage zu Beziehungen

Palladin007

assimiliert
Moin


Ich hab den Titel so wage formuliert, weil ich nicht wusste, wie ich es genauer ausdrücken kann.

Ich suche eigentlich auch gar nicht nach einer festen Anleitung für mein Problem (auch wenn es ganz super toll wäre^^), sondern mehr nach Hinweisen, wonach ich suchen kann.


Und zwar möchte ich eine einfache Datenbank für ein einfaches Adressbuch zum Ausprobieren schreiben.

Da eine Person aber mehrere Telefon-Nummern haben kann, will ich das so lösen, dass ich eine kleine Tabelle für eine Nummer schreibe. Da kommt dann der Nummer und die Telefon-Art (Handy, etc.) rein.

verborgener Text:
Code:
Person
-ID
-Name
-Nummern

   |
   |
  \ /

Nummer
-ID
-Nr
-Art

Ich stelle also die beiden Tabellen in Beziehung. "Nummern" ist der Fremdschlüssel und "ID" aus "Nummer" ist der Primerschlüssel.
Und es sollen in diesem Tabellen-Eintrag mehrere Nummern gespeichert werden.
Und nun möchte ich folgendes wissen:

1.) Wie nennt man eine deratige Beziehung zwischen zwei Tabellen?
2.) Wer sich mit MsSQL und C# soweit auskennt: Wie stellt man das gleich ein?


verborgener Text:
PHP:
namespace Datenbank
{
    using System;

    class Person
    {
        // Private Variablen
        private UInt32 _ID = 0;
        private string _Name = null;
        private TelefonNummer[] _Nummern = null;

        // Konstruktor
        public Person(UInt32 ID, string Name)
        {
            _ID = ID;
            _Name = Name;
            _Nummern = new TelefonNummer[0];
        }

        // Eigenschaften
        public UInt32 ID
        {
            get { return _ID; }
        }
        public string Name
        {
            get{return _Name;}
            set { _Name = value; }
        }
    }

    class TelefonNummer
    {
        // Private Variablen
        private string _Art = null;
        public UInt32 Nummer = 0;

        // Konstruktor
        public TelefonNummer() { }
        public TelefonNummer(string nArt, UInt32 nNummer)
        {
            _Art = nArt;
            Nummer = nNummer;
        }

        // Eigenschaft
        public string Art
        {
            get { return _Art; }
        }
    }
}
 
Zu dem C# Teil kann ich jetzt nichts groß sagen.

Aber ich versuche gerade, die Tabellen zu verstehen...

So, wie du es aufgezeichnet hast, müsstest Du in der Tabelle Person sowieso schon mehrere Einträge haben, nämlich einen pro Nummer, damit diese wiederum eindeutig zugeordnet werden kann. Da kommst Du in Teufels Küche...

Besser ist es umgekehrt: Du hast hier eine 1-n-Beziehung. (Eine Person, mehrere Telefonnummern). 'Personen' ist die Mastertabelle, 'Telefonnummern' ist die sog. Detailtabelle.

Der Fremdschlüssel ist immer der Primärschlüssel aus der Mastertabelle, welcher in die Detailtabelle eingetragen wird. Dadurch hast Du schon die Eindeutige Zuordnung, welche Nummer zu welcher Person gehört.

Also:

Code:
Personen                                 Nummern
---------                                -----------
                                         ID
ID   ----------- 1 ----- n -----------   IDperson
Name                                     Tel
                                         Art


IDperson ist die ID der entsprechenden Person (zu welcher die Nummer gehört) aus der Tabelle Personen.

Achso. Das Stichwort hier heißt: Referenzielle Integrität.

Beispiel:

Code:
Personen
--------------
ID | Name
-------------
 7 | Fritz
 8 | Rita
 9 | Erna


Nummern
--------------
ID | IDperson | Art   | Tel
---------------------------------
67 |        7 | Handy | 64329748392
68 |        7 | Festn | 7846714789
69 |        9 | Handy | 643782549
70 |        8 | Festn | 26384
71 |        9 | Festn | 67438263

Jetzt kannst Du z.B. eindeutig Ernas Handynummer aus der Tabelle abrufen.

Code:
SELECT Tel FROM Nummern JOIN Personen ON Personen.ID = Nummern.IDperson 
WHERE Art = 'Handy' AND Personen.Name = 'Erna';
 
Zuletzt bearbeitet:
Herlich, genau das meinte ich ^^
1 - n - Beziehung... Hätte ich aber auch selber drauf kommen können ^^

Dass der Fremdschlüssel in der zweiten Tabelle liegen muss, daran hab ich gar nicht gedacht.
Und mit dem Stichwort kann ich gleich weiter suchen.


Ach ja, so, wie ich das gemacht habe, erstelle ich dann eine 1 - 1 Beziehung, oder?


Ps: Dein Abfrage-Beispiel können sich andere C#-Begeisterte gleich näher anschauen. Wenn ich mich nicht irre, dann läuft das in C# bei MsSQL mit LINQ-Unterstützung exakt genauso ab.
Wird genauso aufgeschrieben und das Ergebnis landet in einer Variable.
 
Ach ja, so, wie ich das gemacht habe, erstelle ich dann eine 1 - 1 Beziehung, oder?

Ja, irgendwas in der Art... :unsure:
Versuch mal, Dir das anhand einiger Beispieldatensätze zu veranschaulichen...

Übrigens muss Du an einer Stelle noch aufpassen. Wenn jemand zum Beispiel zwei Festnetznummern oder zwei Handys oder was weiß ich hat, dann musst Du beachten, dass dann die Abfrage eventuell mehrere Treffer liefert.
Oder Du sorgst in Deinem System dafür, dass man von jeder Art immer nur eine Nummer haben kann.
 
Ich merk auch, so langsam kommen die Erinnerungen wieder.

Hab die 11. Klasse freiwillig wiederholt und deshalb hab ich letztes Jahr alles über Datenbanken gemacht.
Und so langsam kommen die Erinnerungen wieder, wie das mit den Normalformen und so ging^^


Mitschriften hab ich leider nicht mehr, aber dafür gibts Wikipedia^^
Ich les mich mal wieder in die Materie, bevor ich dann ne Datenbank bau und die total verhaue^^
 
Hehe, ja, ich musste auch meine Erinnerungen wieder ein bisschen zusammenkramen. Hab das alles mal sehr ausführlich gelernt, aber danach leider nicht mehr so regelmäßig verwendet. Doof eigentlich...

Im Anschluss kam dann Oracle SQL dran. Unsere Dozentin hat sich da immer (mehr scherzhaft) beschwert, wir würden ja immer nur herumrätseln, aber nicht richtig über die Lösung nachdenken, bis ich dann mal gekontert habe: Aber schließlich machen wir machen hier ja auch "Orakel". ;)
 
Den Witz kapier ich nicht :/

Liegt wohl daran, dass ich keine Ahnung habe, was du mit Oracle meinst^^


Das einzige Orakel, was ich kenne, ist meine eigene Spielerei^^
Meine magische Miesmuschel mit speziellen Möglichkeiten^^
 
Oben