2017-05-21 9 views
-2

Ich habe eine Einstellung für den Zugriffssteuerungs-Typ. Ich habe zwei Tische, "Benutzer" und "Türen". Die Benutzertabelle enthält einige Informationen wie eindeutige ID, Vor- und Nachname und E-Mail-Adresse. Der Türtisch enthält Informationen wie die Tür-ID, den Namen, die IP-Adresse des Lesers an der Tür und ob es sich um eine Innentür oder eine Außentür handelt.MySQL - Erstellen Sie eine Tabelle für jede neue Zeile, die in einer anderen Tabelle erstellt wurde

Ich möchte eine dritte Tabelle mit einer Spalte namens "Benutzer-ID", aber auch eine Spalte für jede Tür ID in der Doors-Tabelle (mit Werten als Varchar Länge 20) und eine Zeile für jede Benutzer-ID in den Benutzern Tabelle.

Wenn dies statisch wäre, würde ich einfach die Zeit der Erstellung selbst durchgehen. Aber das ist dynamisch. Ich werde Türen hinzufügen und Benutzer-IDs hinzufügen/entfernen/ändern.

Was wäre der einfachste Weg, all diese Informationen synchron zu halten? Wenn es überhaupt wichtig ist, habe ich mehrere PHP-Skripte, die mit der Tabelle interagieren.

+2

Sie sollten wahrscheinlich ein gutes Buch über MySQL abholen. Vorzugsweise etwas, das nicht das Wort "und" im Titel enthält. –

Antwort

0

Ich habe es geschafft, dies zu überwinden, indem ich PHP-Skripte benutze, um diese Funktionalität zu automatisieren, anstatt die Datenbank selbst tun zu lassen; Auf diese Weise kann ich die Datenbank so strukturieren, wie ich es möchte.

Die Skripte befassen sich mit dem Hinzufügen der Benutzerdaten und der Daten der Tür zur Tabelle.

Also, wenn ich eine Tür hinzufügen, fügt das Skript es in beiden Türen Tabelle (einschließlich aller Spalten in dieser Tabelle), dann automatisch fügt es in die Zugriffskontrolltabelle (die alle Leser Abfrage). Wenn ich die Tür-ID ändere (oder lösche) (sie kann sich ändern, weil ihre ID die MAC-Adresse des Lesers ist), wird sie vom Skript in der Zugriffssteuerungstabelle geändert. Gleiches, wenn ich die Benutzerinformationen ändere. Wenn sich die Benutzer-ID ändert (sie basiert teilweise auf der eindeutigen ID ihrer Zugangskarte, die sich ändern kann, wenn sich ihre Karte ändert), wird sie sowohl in der Benutzertabelle als auch in der Zugriffssteuerungstabelle reflektiert.

Es gibt also keine Verknüpfungen zwischen irgendetwas in den Tabellen mehr, alle Änderungen werden von PHP einzeln vorgenommen. Einziger Wermutstropfen ist, dass Daten möglicherweise nicht übereinstimmen, wenn ich die Datenbank direkt bearbeite.

2

Sie denken zu komplex. Erstellen Sie einfach eine dritte Tabelle 'userdoors' mit zwei Spalten: 'userid' und 'doorid'. Erstellen Sie einen eindeutigen Index, der diese beiden Spalten kombiniert.

Fügen Sie eine Zeile für jede Benutzer-Tür-Beziehung hinzu. Die Benutzer-IDs werden für jede Tür mehrmals wiederholt, aber das ist in Ordnung.

Jetzt können Sie einfach überprüfen, ob ein Benutzer Zugang zu einer Tür hat (ich nehme an, dass Sie das tun) mit "Benutzer-ID aus userdoors auswählen, wo Benutzer-ID = [Benutzer-ID] und Tür-ID = [Tür-ID]" Wenn diese Abfrage zurückgibt Ein Ergebnis, auf das der Benutzer Zugriff hat.

Das heißt n: m-Beziehung. Sie können mehr darüber z.B. https://en.m.wikipedia.org/wiki/Many-to-many_(data_model)

Sie können auch mehr als die beiden Spalten hinzufügen, z. B. "Zeit", um die Zeit zu speichern, der der Benutzer diese bestimmte Tür zugewiesen wurde, oder "gewährt_von", um Benutzer zu speichern, die diese bestimmte Beziehung gewährt haben.

+0

Das klingt vielversprechend. Ich brauche jedoch die Möglichkeit, Informationen über Zeitlimits zu haben (alle innerhalb einer Zeichenfolge wie "0900-1100,1200-1400"). Wie würde ich das tun? – lightbord

+0

Wenn die Zeitlimits für eine Tür für jeden Benutzer gleich sind, speichern Sie sie in der Türtabelle (= sie gehören zur Tür). Wenn sie sich zwischen den Benutzern unterscheiden, speichern Sie sie in der Beziehungstabelle in einer neuen Spalte 'timelimit' (= sie gehören zur Beziehung). – Reeno

+0

Sie sind pro Tür, pro Benutzer. So könnte Joe in der Lage sein, die Bürotür von 09.00 bis 15.00 Uhr zu öffnen, aber nur in der Lage sein, die Pausenraumtür von 1200-1300 (alias Mittagessen) zu öffnen – lightbord

0

Sie benötigen keine separate Tabelle für jeden Benutzer, was Sie brauchen, ist ein crosslink table ist Beziehung zwischen Benutzern und Türen zu schaffen (es many-to-many relation genannt wird.)

jedoch zu beantworten Ihre ursprüngliche Frage, das ist, was ein trigger tut - es führt einen Teil des SQL-Codes bei bestimmten Operationen (Einfügen/Aktualisieren/Löschen) auf einer Tabelle aus.

Verwandte Themen