Was ist der richtige Weg, um diese Daten in einem MySQL-Schema zu speichern?

8

Ich habe eine movie in einer MySQL-Datenbank. A movie enthält Datenattribute, die sich niemals ändern werden, wie zum Beispiel:

  • Barcode: 025192018626
  • Format: DVD
  • Laufzeit: 121 min.
  • Datenträger: 1
  • Titel: 12 Affen
  • Jahr: 1995

Es ist eine einzelne Zeile in einer Tabelle.

Aber Ich möchte die vollständige Anpassung meines Benutzers an diese Informationen vornehmen, falls ihnen etwas nicht gefällt oder wenn sie nur ändern möchten, wie die Daten auf irgendeine Weise angezeigt werden. Es ist mir egal warum, ich möchte nur meinen Benutzern eine Option geben, um zu tun, was sie wollen.

Nehmen wir einmal an, Benutzer 1 möchte den Titel so ändern, dass er "12 Monkeys (Shelf 1)" ist und das ist alles, was sie ändern.

Nehmen wir an, Benutzer 2 möchte stattdessen DVD in Digital Copy ändern.

Nehmen wir an, Benutzer 3 möchte den Titel für "Zwölf Affen" ändern, da dies der alternative Titel ist.

usw.

Meine Frage ist, wie speichere ich nur diese eine Änderung nur für dieses Feld, ohne die ursprünglichen Daten zu ändern? In einer separaten identischen Tabelle mit allen Feldern die exakt gleichen Daten außer dem eins Feld? Oder kann ich nur diese eine einzige Änderung (Titel zum Beispiel) irgendwo speichern und für den Rest auf die movie -Daten verweisen?

Was ist der richtige Weg, um das zu gestalten, vor allem, wenn ich Tausende von Benutzern habe, die ihre Daten größtenteils auf nur einem oder zwei Feldern ändern?

    
Ethan Allen 05.07.2016, 21:17
quelle

4 Antworten

12

Verwenden Sie anstelle einer einzelnen Zeile für jeden Film eine Attributwerttabelle. Fügen Sie dann ein zusätzliches Feld hinzu, das den Benutzer angibt. Dies wäre 0 für den ursprünglichen Standard. Also sieht die Tabelle so aus:

%Vor%

Dann würde eine Abfrage zum Abrufen des Titels wie folgt aussehen:

%Vor%

Einige Datenbankentwickler verwenden auch gerne eine AttributeID anstelle einer Zeichenfolge als Attributnamen und eine separate Tabelle, die Attributnamen IDs zuordnet.

    
Barmar 05.07.2016, 21:28
quelle
7

Ich schlage vor, dass es keinen "richtigen" Weg gibt. Aber das könnte dir gefallen ...

  • Ihre Tabelle Movie bleibt unverändert. (Ich nehme an, es gibt ein id .)
  • Eine weitere Tabelle, UserMovie mit denselben Spalten außer:
    • Alle Spalten außer id sind NULL
    • Es hat eine andere Spalte: user NOT NULL
    • PRIMARY KEY(id, user)

Wenn ein Benutzer etwas ändert, verwenden Sie INSERT INTO UserMovie .. ON DUPLICATE KEY UPDATE .. , um die Felder zu ändern, die er setzen möchte. Beachten Sie, dass IODKU INSERT eine neue Zeile, wenn keine vorhanden ist, oder UPDATE die vorhandene Zeile (weil der Benutzer eine andere Spalte ändert). Um zum Beispiel nur den "Titel" für id = $ id zu überschreiben,

%Vor%

Wenn ein Benutzer sehen möchte, was er hat,

%Vor%

Die COALESCE stille Bilder entweder u.xxx if NOT NULL oder m.xxx .

Dieses Design hat den Vorteil, dass es sehr kompakt ist. ( NULLs nehmen fast keinen Platz.)

Wenn ein Benutzer den "Titel" zweimal ändert, wird nur die letzte Version beibehalten.

Um den Titel "zurückzusetzen":

%Vor%

(Sicher, das könnte eine Zeile von NULLs hinterlassen, aber der Rest des Codes funktioniert immer noch.)

    
Rick James 08.07.2016 04:04
quelle
3

Mein erster Gedanke ist: Warum willst du das machen?

Mein zweiter Gedanke ist, eine customizations -Tabelle so etwas wie

zu haben %Vor%

Wenn ein Benutzer das System abfragt, suchen Sie nach seiner Benutzer-ID und dem Spaltennamen in der Tabelle customizations , um den alternativen Anzeigewert zu finden.

Dies würde es einem Benutzer ermöglichen, einen Wert in einer Zeile zu ersetzen. Einen Wert in allen Zeilen zu ersetzen, wo er existiert, wäre eine viel schwierigere Aussage.

    
Darwin von Corax 05.07.2016 21:24
quelle
2

Ein gutes Design ist nicht für alle Situationen perfekt. Es gibt jedoch ein perfektes Design für eine Situation.

Fragen Sie sich noch einmal: 1) Was ist der Zweck dieses Designs und 2) Wie werden Sie die Daten aus dem Design abrufen?

Je nach Ihrer Frage, wenn ein Film seine Attribute nie ändert, ist eine flache einreihige Tabelle perfekt:

%Vor%

Und Sie benötigen möglicherweise eine fremde Tabelle movie_format

%Vor%

Über Design ist sehr schnell für die Suche.

Jetzt möchten Sie alle Änderungen oder alternative Informationen speichern, jedoch nicht sicher, was sie sind. In diesem Fall ist eine Meta-Tabelle besser geeignet. Meta-Tabelle ist in der Regel perfekt, wenn Sie nur nach einem Primärschlüssel (ein Film) anzeigen müssen und nicht für eine Suche verwendet werden:

%Vor%

Sie können movie_meta.meta als Enum definieren, damit Sie sich keine Gedanken über eine neue Nachschlagetabelle machen müssen

    
SIDU 14.07.2016 02:48
quelle