2009-05-13 9 views
0

Ich habe einen Namen Tabelle mit (id, first_name, middle_name, last_name, Geschlecht) und eine E-Mail-Tabelle mit (id_fk, Email_add)Ist in diesem speziellen Szenario ein Primärschlüssel erforderlich?

Infact ich ähnliche Tabellen der zweiten Art werden mit, wie ein Telefon Tisch (id_fk, phone_no), wobei id_fk der Fremdschlüssel ist, der sich auf die ID in der Namenstabelle bezieht.

Ist es erforderlich oder eher gibt es einen guten Grund, einen Primärschlüssel in der zweiten und dritten Tabelle zu haben? Oder andere ähnliche Tabellen? Oder würden Sie ein anderes Schema vorschlagen?

PS: Die Tische sind für einen Kontakt App

Antwort

1

Sie sind fast immer besser dran mit einem Primärschlüssel. Auch wenn Sie denken, dass es jetzt nicht benötigt wird, wenn Ihre Datenbank wächst und komplizierter wird, werden Sie schnell auf Probleme ohne eine solche stoßen.

Persönlich würde ich auch empfehlen, eine datenunabhängige Spalte für Ihren Primärschlüssel etwas wie eine GUID/UUID/serielle. Wenn Sie ein Feld verwenden, das keine verwendbaren Daten enthält, werden Sie sich niemals in einer Situation befinden, in der Sie den Primärschlüssel aktualisieren müssen, was eine weitere unordentliche Operation sein kann, sobald Ihre Datenbank wächst.

+0

Der Grund, warum ich die Frage gestellt habe ist, dass, während ich Datenbank studiert habe, ich keine echte Welterfahrung (Projekt) habe, die eine verwendet. "Wenn Ihre Datenbank wächst und komplizierter wird, werden Sie ohne Probleme schnell auf Probleme stoßen." Können Sie mir ein Beispiel geben? wie welche Probleme ich haben könnte. Obwohl Ihr Ratschlag solide ist und ich geneigt bin, einen generierten PK für alle Tabellen zu verwenden. – Sujoy

+1

In Ihrer dritten Tabelle (id_fk, phone_no) ist Ihr Primärschlüssel ein zusammengesetzter Schlüssel von id_fk und phone_no, was bedeutet, dass wenn Sie (nicht if) die phone_no ändern müssen, Sie den Primärschlüssel ändern. Zusätzlich, wenn Sie später Ihre Anwendung verbessern und etwas wie Arbeit, Handy und Hausnummern haben und ein Benutzer die gleiche Nummer für alle 3 eingibt, scheitert Ihre Einfügung mit einem doppelten Primärschlüsselfehler. – sipwiz

+0

In diesem Fall sollte die Telefonnummerntabelle eine dritte Spalte namens "type" enthalten und der zusammengesetzte Primärschlüssel sollte (id_fk, phone_no, type) lauten. –

4

In den Fällen, Speichern Sie, der Primärschlüssel ist die gesamte Tabelle (id_fk, PHONE_NO), da die Zeilen nicht andersweitig, repräsentieren eine ungeordnete Sammlung beschreiben und haben nur Wert und nicht irgendeine Art von Identität.

+0

Ja, das habe ich auch bemerkt. Jedoch, nach sipwiz 'Antwort bezüglich des Problems, pk später zu ändern, bin ich halb geneigt, ein seperates pk zu benutzen. – Sujoy

1

Sie könnten (Fremdschlüssel, Telefonnummer) einen zusammengesetzten Primärschlüssel erstellen.

Persönlich bevorzuge ich die Verwendung von streng technischen Primärschlüssel, typischerweise eine Auto-ID-Spalte. Einer der Vorteile ist, dass es das Aktualisieren und Löschen von Datensätzen mithilfe der ID erleichtert, statt sich an den alten Wert in HTML-Formularen usw. zu erinnern.

2

Ich würde einen einfachen automatisch inkrementierenden "ID" Primärschlüssel zu jeder dieser Tabellen hinzufügen, es kostet sehr wenig und macht es einfacher, bestimmte Zeilen später zu referenzieren.

Es könnte auch eine gute Idee sein, ein anderes Benennungsschema für Ihre Fremdschlüssel zu betrachten, "id_fk" könnte etwas verwirrend sein, da es keinen Hinweis darauf gibt, auf welche "id" der Tabelle es sich bezieht, name_id "könnte eine bessere Wahl sein.

+0

Ich stimme mit Tobias Kommentar über die Benennung der Fremdschlüsselspalte überein. Es ist eine gute Idee, die Benennungskonvention "parent_id" (wobei parent der Name der referenzierten Tabelle ist) zu verwenden. Verwenden Sie den 'fk', um dem Fremdschlüssel CONSTRAINT einen Namen zu geben, nicht die Spalte. – spencer7593

1

Sie sollten auf jeden Fall einen Primärschlüssel für alle Ihre Tabellen haben. Im Fall von (id_fk, phone_no) könnten Sie entweder einen zusammengesetzten Schlüssel verwenden, der aus beiden Spalten besteht, oder Sie könnten eine weitere Spalte als Primärschlüssel hinzufügen. Ich würde das Letztere empfehlen, da es letztendlich die Komplexität von allem reduzieren wird und viel angenehmer sein wird, wenn Sie ein ORM verwenden.

0

Warum benötigen Sie separate Tabellen für E-Mail-Adressen und Telefonnummern? Sie alle in derselben Tabelle zu speichern, ist viel effizienter. Ihr Schema könnte wie folgt aussehen:

(Pseudo SQL)

Create table ContactName (
     CONTACT_ID integer not null default auto_increment, 
     etc 
     ) 

CREATE TABLE TELECOM_CLASSES (
    CLASS_ID INTEGER NOT NULL DEFAULT AUTO_INCREMENT, 
    CLASS_NAME VARCHAR(200) NOT NULL 
       CHECK (CLASS_NAME IN ('email','tel','fax',etc)), 
    etc 
    ); 

CREATE TABLE CONTACT_TELECOMS (
    TELECOM_ID INTEGER NOT NULL DEFAULT AUTO_INCREMENT, 
    CONTACT_ID INTEGER NOT NULL REFERENCES CONTACTNAME (CONTACT_ID), 
    CLASS_ID INTEGER NOT NULL REFERENCES TELECOMS_CLASSES (CLASS_ID), 
    TELECOM VARCHAR(200) NOT NULL, 
    etc 

); 
+0

Wenn also CLASS_ID eine E-Mail ist, hat TELECOM eine E-Mail-Adresse. hmm ich bekomme die Idee, aber nicht sicher, wie dies effizienter ist, da ich mit zwei separaten Tabellen, wenn ich E-Mails brauche, nur gegen die E-Mail-Tabelle abfragen kann, ohne sich um CLASS_ID zu kümmern – Sujoy

+0

Dies ermöglicht es Ihnen, eine andere Entität hinzuzufügen, um Post Office Boxes zu verfolgen. Erleichtert außerdem die Abfrage aller Daten für einen Benutzer und das Auflisten der Daten, ohne alle Tabellen mit Union verknüpfen zu müssen. Was Sie verlieren, ist die Möglichkeit, das Format Ihrer Telefonnummern und E-Mail-Adressen auf Datenbankebene zu steuern. Ich denke, ein Trigger mit entsprechender Logik könnte damit umgehen. – JeffO

+0

Beachten Sie die Konvention, bei der einige Tabellennamen _SINGULAR_ und einige _PLURAL_ sind. Benenne die Klasse. Nennen Sie, was eine Zeile in der Tabelle darstellt. – spencer7593

2

Meine Design-Philosophie ist, dass jeder Tisch hat immer eine einzelne int Identität pk Spalt.

Dies scheint eine umstrittene Entscheidung zu sein, wie frühere Kommentare zu SO gezeigt haben, aber es ist auch sehr praktisch.

+0

Das Schreiben von Ad-hoc-Abfragen in Datenbanken mit einer Menge zusammengesetzter Schlüssel lässt sie einfach weiter und weiter gehen. – JeffO

+0

Es gibt Vorteile und Nachteile für die Praxis, die Sie beschreiben. Dieser Raum ist zu eng, um diese Vor- und Nachteile gründlich zu diskutieren oder mit anderen Entwurfspraktiken zu vergleichen. Ich möchte das Thema woanders weiterverfolgen, wenn es ohne Kontroversen zu Bitterkeit und Beleidigung kommen kann. –

Verwandte Themen