2016-05-04 5 views
0

Dies ist eine zweiteilige Frage, so dass jeder Rat zu beiden Seiten willkommen ist. Ich benutze auch PostgreSQL.SQL-Fehler dieser Namenskonvention?

Frage 1 Ich habe also einige der Threads über Namenskonventionen für Einschränkungen für ein Projekt gelesen, an dem ich arbeite. Da es in den frühen Stadien ist, möchte ich es richtig machen.

Ich bemerke die Mehrheit hier (und andere Quellen) schlagen vor, etwas in Richtung fk_activetable_referencedtable_fieldname zu tun. Als ein Beispiel, wenn ich zwei Tabellen hatte, hieß eine user und die andere posts. Ein Fremdschlüssel in der Posts-Tabelle, der zur Benutzertabelle und zum ID-Feld geht, könnte etwas in der Art von fk_posts_user_id aussehen.

Ich dachte, dass eine bessere Wahl wäre fk_referencedtable_fieldname_activetable. Auf diese Weise würde es in gewissem Sinne einem ähnlichen Muster folgen wie das sequentielle Benennen von Dingen, z. B. fk_user_id1, fk_user_id2 usw .; wo statt am Ende 1,2,3,4 wäre, würde das Ende die Tabelle bedeuten, dass der Fremdschlüssel lokalisiert ist. Daher würde mein Fremdschlüssel im obigen Beispiel fk_user_id_post heißen. Derzeit ist es einfacher, alle meine Fremdschlüssel für einen Primärschlüssel zu sehen, indem ich es so nenne, aber es ist nicht das Ende der Welt, wenn es einen besseren Grund gibt, es anders zu machen.

Gibt es irgendwelche Nachteile, dies zu tun?

Frage 2 Wie Sie Situationen umgehen können, wo Sie eine Tabelle haben angenommen, bei dem die ersten drei Spalten alle Fremdschlüssel auf den gleichen Primärschlüssel auf einem anderen Tisch?

das gleiche Beispiel wie oben verwenden, wenn Sie einen usertree Tisch haben, wo die erste Spalte (genannt user_id) die id aus der user Tabelle identifiziert, die zweiten Spalte (genannt user_pid), geht auch auf den gleichen Primärschlüssel wie Die Tabelle user speichert jedoch den Wert des übergeordneten Benutzers. Die letzte Spalte, die derselben Konvention wie die vorherige folgt (user_rid), speichert den Wert des übergeordneten übergeordneten Elements in der Hierarchie.

Im Moment bin ich mir nicht sicher, ob es besser ist, einen fremden Schlüssel zu machen, wo der Name fk_user_id_usertree ist (da sie alle technisch die Benutzertabelle, ID-Feld beziehen) oder etwas in der Richtung fk_user_id_user_pid_user_rid_usertree was ich fühle würde bei Charakteren zunehmen und möglicherweise die Zeichengrenze mit nicht so kurzen Feldern treffen.

Leider habe ich keine große Erfahrung mit SQL, daher würde ich mich über jeden Einblick freuen, den mir jemand bieten kann.

Antwort

0

Auf die erste Frage:

ich wirklich mehr meine Fremdschlüssel Namen erzeugen nicht als meinen Rahmen für mich tut es jetzt. Aber das ist die Konvention, die ich verwendet habe, und die Konvention, die von vielen Generatoren in Backend-Frameworks verwendet wird. Zum Beispiel habe ich zwei Arten von Konventionen gesehen.Angenommen, Sie haben zwei Tabellen Users und Cars, dann ein Fremdschlüssel unter ihnen sind:

Ex ->car_id ist definiert auf user_id dann:

  1. fk-users-car_id (Benutzer ist die Tabelle, wo Sie hinzufügen, die FK und car_id ist das Feld)
  2. fk-users_cars-car_id (zuerst die Tabelle, wo die Zugabe von FK und zweiten der referenzierten Tabelle, dann wird der Fremdschlüssel)

auf Indizes:

  • IDX-Benutzer-car_id

Zu Ihrer zweiten Frage:

ich einen Fremdschlüssel für jedes der Felder hinzufügen würde und eines der folgen würde Konventionen oben. Fremdschlüssel hinzugefügt wie folgt aus:

fk_user_id_usertree 
fk_user_pid_usertree 
fk_user_rid_usertree 

Einige Konventionen über verschiedene Dialekte:

  • SQL Server: FK_ForeignKeyTable_PrimaryKeyTable
  • InnoDB (MySQL): fk_[referencing table name]_[referenced table name]_[referencing field name] Für Postgres können Sie überprüfen ->ADD table_constraint Postgres constraint documentation

    Dieses Formular fügt einer Tabelle, die das gleiche syn verwendet, eine neue Einschränkung hinzu Steuer als CREATE TABLE