3 Stimmen

Wie soll ich meine Many-to-Many-Beziehungen verwalten?

Ich habe eine Datenbank mit ein paar Tabellen: Dateien und Benutzer. Diese Beziehung ist viele-zu-viele, daher habe ich auch eine Tabelle namens users_files_ref, die Fremdschlüssel zu beiden oben genannten Tabellen enthält.

Hier ist das Schema jeder Tabelle:

files -> file_id, file_name

users -> user_id, user_name

users_files_ref -> user_file_ref_id, user_id, file_id

Ich verwende Codeigniter, um eine Datei-Host-Anwendung zu erstellen, und ich bin gerade dabei, die Funktion hinzuzufügen, die es Benutzern ermöglicht, Dateien hochzuladen. Hier stoße ich auf mein Problem.

Sobald ich eine Datei in die Dateien-Tabelle einfüge, benötige ich die ID dieser neuen Datei, um die users_files_ref-Tabelle zu aktualisieren. Derzeit füge ich den Datensatz in die Dateien-Tabelle ein und dann dachte ich, ich würde eine Abfrage ausführen, um die zuletzt hinzugefügte Datei zu erhalten, damit ich die ID bekommen kann und diese ID verwenden kann, um den neuen users_files_ref-Datensatz einzufügen.

Ich weiß, dass dies im kleinen Maßstab funktionieren wird, aber ich stelle mir vor, dass es einen besseren Weg gibt, um diese Datensätze zu verwalten, insbesondere in einem Szenario mit hohem Traffic.

Ich bin neu im Bereich der relationalen Datenbanken, bin aber schon eine Weile in PHP unterwegs, also bitte haben Sie etwas Geduld mit mir :-)

Ich habe Primär- und Fremdschlüssel für die Tabellen files, users und users_files_ref korrekt eingerichtet, ich frage mich nur, wie ich das Hinzufügen von Dateidatensätzen für dieses Szenario verwalten soll?

Vielen Dank für jede Hilfe, die bereitgestellt wird, es wird sehr geschätzt.

-Wes

1voto

Summer Punkte 2498

Verwenden Sie $this->db->insert_id(), um die ID-Nummer der gerade eingefügten Zeile zu erhalten. Weitere Dokumentation hier: http://codeigniter.com/user_guide/database/helpers.html

0voto

Leniel Maccaferri Punkte 96851

Ich denke, was du brauchst, ist nur dies:

                   ----primary key-----
users_files_ref -> | user_id, file_id |

Wie du die file_id bekommst, hängt von dem Code ab, den du implementierst. Deine Überlegung ist richtig. Du hast bereits die user_id und musst nur noch die file_id erhalten. Mit diesen Werten kannst du eine neue Zeile zu user_files_ref hinzufügen.

Wenn ich das machen muss, habe ich normalerweise eine gespeicherte Prozedur mit Hilfe einer Sequenz, die die Datei einfügt und die Sequenz NEXTVAL als Ausgabe zurückgibt. Dies könnte eine Möglichkeit sein, ein solches Szenario zu implementieren.

Dies ist der Code für eine in Oracle basierte gespeicherte Prozedur:

CREATE OR REPLACE PROCEDURE SP_IMPORT_FILE(FILE    IN  FILE.FILE%TYPE,
                                           FILE_ID OUT NUMBER)

IS

BEGIN

  SELECT SEQ_FILE.NEXTVAL INTO FILE_ID from DUAL;

  INSERT INTO FILE (FILE_ID, FILE) VALUES (FILE_ID, FILE);

END SP_IMPORT_FILE;

0voto

Anders Abel Punkte 65873

Sie beschreiben im Grunde genommen, wie es normalerweise gemacht wird, mit einer wichtigen Anpassung: Wie Sie die file_id der Datei abrufen, um sie zu users_files_ref hinzufügen zu können.

Normalerweise haben Sie in einer Datenbankumgebung viele Clients, die gleichzeitig eine Verbindung herstellen und gleichzeitig Updates durchführen. In einer solchen Umgebung können Sie nicht einfach die file_id der zuletzt hinzugefügten Datei abrufen - es könnte sich um die Datei eines anderen handeln, die zwischen Ihren DB-Aufrufen hinzugefügt wurde. Sie müssen die Funktionalität der Datenbank verwenden, um die generierte ID zu erhalten (z. B. SELECT @@IDENTITY in MSSQL) oder die IDs auf irgendeine Weise im Anwendungscode generieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X