2016-09-23 3 views
1

zunächst lassen Sie mich in meiner Frage sehr genau sein:Automatische MySQL Tabellenerstellung [Benutzer gesteuert]

Grundsätzlich ich PHP lerne und MySQL so arbeitet an einem kleinen Projekt für mich. Ich erstelle eine Website für mich und meine Freunde, wo wir den Überblick über das Geld behalten können, das wir einander schulden. Insbesondere für eine große Summe, die in wenigen Monaten in Bits zurückgegeben werden müsste. So kann jeder von uns eine "Aufzeichnung" starten, in der er dieser Aufzeichnung einen Namen gibt, z. "Car Expenses" und dann können sie eine Transaktion zu dieser Aufzeichnung hinzufügen, jedes Mal, wenn sie Geld von dem Kreditnehmer dieser großen Summe zurückbekommen. Dieser "Car-Spesen" -Datensatz wird einige Spalten haben, die offensichtlich eine Transaktions-ID, einen zurückgesandten Betrag und ein Datum usw. enthalten (was in Kürze zu diesem Bit zurückkommt).

Ich weiß, dass ich definitiv zwei Tabellen brauche: 1) BENUTZER - wo Benutzername und E-Mail-Adresse für uns alle gespeichert ist; 2) RECORDS - wo eine Zusammenfassung aller unserer Datensätze (aber nicht die Transaktionsdetails in Bezug auf einen Datensatz) gespeichert wird, z. Record-Titel, Record-Beschreibung, Erstellungszeit, Last-Update-Zeit, Name der beteiligten Parteien usw.

Allerdings ist das Problem, dass ich nicht sicher bin, wie der dritte Teil des Systems arbeiten würde, wo ich will gehe in Details eines bestimmten Datensatzes, um alle Transaktionen auf dem Datensatz anzuzeigen, z wie viel Geld wurde bereits bezahlt und an welchem ​​Datum etc.

Ich dachte über das Erstellen einer neuen Tabelle für jeden einzelnen Datensatz, der von einem Benutzer erstellt wird. In dieser Tabelle werde ich Transaktions-ID, Transaktionsdatum, Geld-in/out, Kommentare und Steuerelemente zum Bearbeiten/Löschen von Transaktionen haben. Das Problem mit diesem Ansatz (jedes Mal eine neue Tabelle erstellen) besteht meines Erachtens darin, dass es eine Herausforderung ist, jeder neu erstellten Tabelle einen benutzerdefinierten Namen zu geben und eine automatische Abfrage für das Entwerfen einer neuen Tabelle für jede umfangreiche Tabelle auszuführen Aufzeichnung könnte sehr schwierig sein.

BITTE BERATEN Sie, was wäre der beste Ansatz für die Implementierung dieses dritten Teils des Systems oder bessere Ideen für das gesamte Datenbankdesign für meine Website. Vielen Dank im Voraus.

+0

Sie benötigen für jeden Datensatz keine neue Tabelle, sondern eine Tabelle für alle Datensätze, die auf die Benutzer-IDs und Datensatz-IDs verweisen. – aynber

+0

Vielen Dank aynber, ich dachte, es wird kompliziert sein, Transaktionen aus einem Datensatz aus der gleichen Tabelle auszuwählen und ihnen zu zeigen, wo es so viele Transaktionen von allen gibt – Ros

+0

Solange Sie die Tabelle richtig mit user_ids und record_ids und richtigen Indizes entwerfen Es wird nicht schwer zu verfolgen sein. In der Tat würde es wahrscheinlich einfacher, wenn Sie Gesamttransaktionen mit Links zu jedem Datensatz anzeigen möchten. – aynber

Antwort

0

Im Allgemeinen möchten Sie nie zu viele Tabellen in einer Datenbank haben, und sicherlich keine benutzerdefinierten. Es wird nicht nur Platz beanspruchen, sondern es wird nahezu unmöglich sein, von diesem abzufragen.

Sie sollten stattdessen eine separate Tabelle für ALLE Transaktionen mit den aufgelisteten Spalten erstellen, aber eine zusätzliche Spalte, die die ID des Benutzers enthält, zu dem die Transaktion gehört. Damit können Sie bequem über JOIN-Befehle abfragen.

+0

Danke Hex37, ich dachte, wenn ich in der Zukunft immer mehr Benutzer habe (Familie und Freunde, lol wer weiß), dann kann eine Tabelle ihre Grenzen mit diesen vielen Transaktionen von jedem erreichen. – Ros

+0

Sie müssen sich darüber fast nie für SQL Gedanken machen; Die Tabellensuche in dieser Skriptsprache ist äußerst effizient. Es ist fast der ganze Sinn der Programmiersprache. Für Tabellen mit mehreren hunderttausend Zeilen sollten Sie höchstens eine separate Archivtabelle für die ältesten Einträge erstellen. – Hex37

+0

Vielen Dank für die Ausarbeitung. Woher wissen Sie also, wenn eine Tabelle ihr Limit erreicht hat und in eine Archivtabelle aufgeteilt werden soll? Können wir den gleichen Weg aus der Archivtabelle abfragen? – Ros

0

Sie müssen ein einfaches, konsistentes Schema erstellen, um alle verschiedenen Elemente in Ihrem System zu repräsentieren: Benutzer und Austausch. Das Auswählen von Namen kann schwierig sein, da Sie reservierte Schlüsselwörter wie "Transaktion" im Allgemeinen vermeiden möchten.

Erstellen einer neuen Tabelle für jeden Geldwechsel ist absolut falsch. Der springende Punkt einer relationalen Datenbank besteht darin, eine Vielzahl von Datensätzen in derselben Tabelle zu speichern, in denen diese einfache Beziehungen zu anderen Datensätzen haben können. Zum Beispiel verweist eine Vermittlung sowohl auf einen Absender als auch auf einen Empfänger durch ihre jeweiligen "Benutzer" -Aufzeichnungskennungen.

In einfachen Worten:

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    name VARCHAR(255), 
    created_at DATETIME 
); 

CREATE TABLE exchanges (
    id INT AUTO_INCREMENT PRIMARY KEY NOT NULL, 
    amount NUMERIC(12,2) NOT NULL, 
    sender_user_id INT, 
    recipient_user_id INT, 
    created_at DATETIME 
); 

Dies ist ein sehr einfacher Ansatz. Eine robustere Lösung verwendet eine ledger structure, in der der Austausch in zwei verwandte, aber unabhängige Übertragungen zwischen Konten aufgeteilt ist.

Nun, wenn Sie wollen, dass die Balance wissen, verdanken:

SELECT sender_user_id, SUM(amount) FROM exchanges 
    WHERE recipient_user_id=? 
    GROUP BY sender_user_id 

, die Sie auf einer Pro-Empfänger Basis zeigen, wie viel Geld sie zu verdanken. Solange Sie "Zurückzahlen" als einen negativen Betrag darstellen, sollten die Werte null sein. Ein Ledger macht diese Arbeit besser.

+0

Wirklich schätzen solch eine detaillierte Antwort Kumpel, würden Sie wahrscheinlich das in etwa 15-20 Minuten abgeschlossen LOL Ich habe schon Wochen damit verbracht. Der Grund, warum ich eine dritte 'Records'-Tabelle hinzufügen wollte, war, dass ich ihnen auf dem Dashboard eines Benutzers alle Datensätze anzeigen möchte, auf denen sie sich befinden. – Ros

+0

Während Ihrer Karriere als Entwickler werden Sie gebeten, ein solches System so oft zu erstellen. Zum zehnten Mal wird es zur Routine. Das erste Mal ist ziemlich schwindelig kompliziert. Zusammenfassungsdatensätze werden oft nicht mehr synchron und für kleine Datenmengen ist ein schnelles "SUM()" besser als ein unzuverlässiger Zusammenfassungsdatensatz. – tadman

+0

Nice one! Ich werde auf jeden Fall in die Ledger-Systeme schauen, nochmals vielen Dank für Ihre Zeit und Schande, dass ich keinen Daumen hoch auf irgendeinen der Posts setzen kann, um ein Neuling zu sein. – Ros

Verwandte Themen