Website: Was ist der beste Weg, um eine große Anzahl von Benutzervariablen zu speichern?

StackOverflow https://stackoverflow.com/questions/2269294

  •  20-09-2019
  •  | 
  •  

Frage

Ich bin der Gestaltung einer Website zur Zeit mit PHP und MySQL und wie die Seite geht finde ich mich das Hinzufügen von mehr und mehr Spalten der Tabelle Benutzer verschiedene Variablen zu speichern.

Was hat mir denken, gibt es einen besseren Weg, um diese Informationen zu speichern? Nur um zu klären, die Informationen global sind, kann von anderen Nutzern betroffen werden, so Cookies nicht arbeiten, auch würde ich die Informationen verlieren, wenn sie ihre Cookies löschen.

Der zweite Teil meiner Frage ist, ob es das macht entpuppt sie in einer Datenbank zu speichern ist der beste Weg, wäre es weniger teuer, eine große Anzahl von Spalten zu haben oder eher verknüpften Spalten in abgegrenzten varchar-Spalten zu kombinieren und explodieren sie dann in PHP?

Danke!

War es hilfreich?

Lösung

Nach meiner Erfahrung würde ich eher die Datenbank richtig machen als Start Hinzufügen Komma getrennt Felder mehr Elemente zu halten. Nachdem durch mehrere durch Kommata getrennte Felder sichten wird Ihr Programm nur die Effizienz und die Lesbarkeit des Codes zu verletzen.

Auch wenn Ihre Tabelle zu viel wächst, dann müssen Sie vielleicht in Splitting suchen es in mehrere Tabellen durch Fremd Abhängigkeiten verbunden?

Andere Tipps

würde ich eine user_meta Tabelle mit drei Spalten erstellen: user_id, key, value

.

würde ich nicht für die Option der Spalten zusammen gruppieren und explodiert. Es ist unordentliche Arbeit und sehr unhandlich. Stattdessen vielleicht versuchen, diese Spalten über ein paar Tabellen Verbreitung und InnoDb Transaktions Funktion.

Wenn Sie nicht mögen noch die Idee der häufig die Aktualisierung der Datenbank, und wenn diese Methode erfüllt mit dem, was Sie versuchen zu erreichen, können Sie ein href verwenden <= "http://php.net/manual/en/ref .apc.php“rel = "nofollow noreferrer"> APC-Caching-Funktion Speicher (Cache) Informationen "global" auf dem Server.

MongoDB (und seine NoSQL Cousins) sind für Sachen wie diese.

Die Datenbank ein perfekt schöner Ort, solche Daten zu speichern, solange sie sind Variablen und nicht, sagen wir, große Bilddateien. Die Datenbank verfügt über alle Optimierungen und Spezifikationen für die Speicherung und große Datenmengen abgerufen werden. Alles, was Sie auf Dateisystemebene eingerichtet wird immer durch geschlagen werden, was die Datenbank bereits in Bezug auf Geschwindigkeit und Funktionalität.

  

wäre es weniger teuer sein, eine große Anzahl von Spalten zu haben oder eher verknüpften Spalten in abgegrenzten varchar-Spalten zu kombinieren und sie dann in PHP explodieren?

Es ist nicht wirklich so viel von einer Leistung als Wartung Frage IMO - es ist nicht Spaß Hunderte von Spalten zu verwalten. solche Daten zu speichern - vielleicht als serialize d Objekte - in einem TEXT Feld ein gangbarer Weg - solange es 100% ist sicher, dass Sie nie auf diese Daten alle Fragen zu machen.

Aber warum nicht eine normalisierte user_variables Tabelle verwenden, etwa so:

id  | user_id | variable_name | variable_value

Es ist ein wenig komplexer zu Abfrage, sondern sorgt für eine sehr sauber Tabellenstruktur für alle. Sie können ganz einfach beliebige Benutzervariablen hinzufügen, die Art und Weise.

Wenn Sie viele Anfragen wie SELECT FROM USERS WHERE variable257 = 'green' tun Sie können bleiben müssen bestimmte Spalten haben.

Die Datenbank ist auf jeden Fall der beste Ort, um die Daten zu speichern. (Ich nehme an, Sie dachten an sie in flachen Dateien zu speichern sonst) Sie würden auf jeden Fall eine bessere Leistung und Sicherheit erhalten von der Verwendung eines DB über in Dateien gespeichert werden.

Im Hinblick auf die Ihre Daten in mehreren Spalten zu speichern oder begrenzen sie ... Es ist eine persönliche Entscheidung, aber Sie sollten ein paar Dinge

betrachten
  1. Wenn Sie die Einzelteile begrenzen gehen, müssen Sie daran denken, was Sie gehen sie mit (etwas, das nicht wahrscheinlich ist, im Text auftauchen Ihre Begrenzungs) begrenzen
  2. Ich finde oft, dass es zu versuchen hilft und zu visualisieren, ob ein anderer Programmierer Ihrer Ebene wäre in der Lage zu verstehen, was Sie mit wenig Hilfe gemacht haben.
  3. Ja, so Pekka sagte, wenn Sie auf den Datenabfragen ausführen gespeichert Sie mit den separaten Spalten bleiben sollten
  4. Sie können auch eine leichte Leistungssteigerung erhalten von nicht abrufen und Parsen alle Ihre Daten jedes Mal, wenn Sie nur ein paar Felder von Informationen wollen

würde ich mit den separaten Spalten schlage vor zu gehen, wie es Ihnen die Möglichkeit, eine viel größere Flexibilität in der Zukunft bietet. Und es gibt nichts Schlimmeres, als drastisch auf Ihre Datenstruktur ändern und Migrate Informationen auf der Spur!

Ich würde empfehlen, einen Memcached-Server einrichten (siehe http://memcached.org/ ). Es hat sich mit vielen der große Sites rentabel sein . PHP hat zwei Erweiterungen, die einen Client in Ihre Laufzeit integrieren (siehe http://php.net /manual/en/book.memcached.php ).

Versuchen Sie es einmal, Sie werden es nicht bereuen.

Bearbeiten
Sicher, dies wird nur eine Option für Daten sein, die häufig verwendet wird und sonst aus Ihrer Datenbank wieder und wieder geladen werden müssen. Beachten Sie aber, dass Sie immer noch Ihre Daten zu einer Art dauerhaften Speicher speichern müssen.

Eine dokumentenorientierte Datenbank könnte sein, was Sie brauchen.

Wenn Sie eine haften möchten relationale Datenbank, nehmen Sie nicht den naiven Ansatz nur mit ach so vielen Bereichen eine Tabelle erstellen:

CREATE TABLE SomeEntity (
    ENTITY_ID    CHAR(10)    NOT NULL,
    PROPERTY_1   VARCHAR(50),
    PROPERTY_2   VARCHAR(50),
    PROPERTY_3   VARCHAR(50),
    ...
    PROPERTY_915 VARCHAR(50),
    PRIMARY KEY  (ENTITY_ID)
);

Statt eine Attributtabelle definieren:

CREATE TABLE Attribute (
    ATTRIBUTE_ID  CHAR(10) NOT NULL,
    DESCRIPTION   VARCHAR(30),
    /* optionally */
    DEFAULT_VALUE /* whatever type you want */,
    /* end_optionally */
    PRIMARY KEY   (ATTRIBUTE_ID)
);

definieren Sie dann Ihre SomeEntity Tabelle, die nur die wesentlichen Attribute enthält (zB Pflichtfelder in einem Anmeldeformular):

CREATE TABLE SomeEntity (
    ENTITY_ID   CHAR(10) NOT NULL
    ESSENTIAL_1 VARCHAR(30),
    ESSENTIAL_2 VARCHAR(30),
    ESSENTIAL_3 VARCHAR(30),
    PRIMARY KEY (ENTITY_ID)
);

Und dann eine Tabelle für diese Attribute definieren, dass Sie vielleicht oder nicht speichern wollen könnten.

CREATE TABLE EntityAttribute (
    ATTRIBUTE_ID    CHAR(10) NOT NULL,
    ENTITY_ID       CHAR(10) NOT NULL,
    ATTRIBUTE_VALUE /* the same type as SomeEntity.DEFAULT_VALUE;
                       if you didn't create that field, then any type */,
    PRIMARY KEY     (ATTRIBUTE_ID, ENTITY_ID)
);

Offensichtlich in Ihrem Fall, dass SomeEntity ist der Benutzer.

Statt MySQL Sie sich anschauen sollten mit einem triplestore oder ein Schlüsselwertspeicher auf diese Weise erhalten Sie die benifits alle Multithreading Multi-User, Performance und Caching Voodoo zu haben, herausgefunden, ohne all die Mühe zu versuchen, vor der Zeit, um herauszufinden, welche Art von Werten, die Sie wirklich speichern möchten.

Nachteile:. Es ist ein bisschen teurer, um herauszufinden, das Durchschnittsgehalt aller Menschen in idaho, die auch eigene Hüte

hängt davon ab, welche Art von Benutzerinformationen Sie speichern. wenn seine Sitzung relevante Daten, die Verwendung von PHP-Sessions in Abstimmung mit Session Event-Handler Ihre Sitzungsdaten in einem einzigen Datenfeld in der db zu speichern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top