Datenbank-Design in Bezug auf dynamische Einträge - Eine Zeile oder mehrere Zeilen?

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

  •  06-07-2019
  •  | 
  •  

Frage

Ich habe versucht, ein Datenbankschema für ein Nebenprojekt zu entwerfen, aber ich habe die Lage, etwas zu produzieren, die mich bequem mit. Ich verwende ASP.Net mit LINQ für meinen Datenzugriff:

Ich werde Benutzer erlauben, bis 10 „Elemente“ mit jeweils 2 numerischen Eigenschaften angeben oben und 1 Referenz Eigenschaft, die Artikelnamen.

Wenn ich diesen Eintrag in 1 Zeile setzen, wäre es leicht gleich für einige mehr als 30 Spalten (Minimum), z.B. item_1_name (ref) item_1_weight item_1_volume item_2_name ... etc ...

Und ich kann nicht einfach diese Spalten in Referenztabellen drehen, da jede Eigenschaft im Wesentlichen von 1 bis 400 + reichen kann.

Ich dachte auch, dass, wenn ein Benutzer nur ein Element in ihren Eintritt zu setzen entscheidet, von der Methode, die ich das Objekt für diese Daten erstellen statisch sein wird, wie mit LINQ würde ich, ob die Eigenschaften und so weiter müssen prüfen, sind NULL und arbeiten entsprechend. Auch, wenn ich jemals in einem Eintrag erlaubt die Anzahl der Elemente erhöhen wollte, würde es ein Kopfschmerz sein zu arbeiten.

Die andere Option, die ich gedacht habe, ist einfach eine Zeile für jedes Element zu schaffen und es mit einem Eintrag ID binden. Also würde ich im Wesentlichen nie null Einträge habe, aber meine Tabelle würde wachsen astronomisch tief, aber nicht sehr breit, da es nur würde etwa 5 ungeradee Spalten sein.

Gibt es etwas, das ich in meinem Design mit Blick auf / gibt es eine viel bessere und effiziente Art und Weise, dies zu tun?

EDIT: Wenn ich sage, dass es astronomisch wachsen wird, ich meine es in diesem Sinne: Ein Benutzer kann einen Eintrag erstellen, und jeder Eintrag wird höchstwahrscheinlich eine Gruppe von Elementen hat. So sagen sie machen 1 Eintritt pro Tag an dem Ort, konnten sie drei Gruppen von Elementen haben, mit der max Anzahl der Elemente (10), die bis zu 30 Elemente für diesen einzigen Eintrag entsprechen würde. Machen Sie einen Eintrag jeden Tag für eine Woche mit dieser Geschwindigkeit und Sie können 210 Zeilen für die einzelnen Benutzer haben.

War es hilfreich?

Lösung

Ich würde die letztere Design empfehlen Sie erwähnen, erstellen Sie eine abhängige Tabelle mit fünf Spalten:

CREATE TABLE Items (
  user_id               INTEGER NOT NULL,
  item_id               INTEGER NOT NULL DEFAULT 1,
  numeric_property1     INTEGER,
  numeric_property2     INTEGER,
  referential_property  INTEGER,
  PRIMARY KEY (user_id, item_id),
  FOREIGN KEY (user_id) REFERENCES Users(user_id)
                        ON DELETE CASCADE,
  FOREIGN KEY (item_id) REFERENCES num_items(item_id),
  FOREIGN KEY (referential_property) REFERENCES some_other_table(some_column)
);

Ich zeige eine Tabelle num_items oben, die die Zahlen 1 bis 10 enthält, wenn man sich die meisten Benutzer auf 10 Stück beschränkt werden soll:

CREATE TABLE num_items (item_id INTEGER NOT NULL );
INSERT INTO num_items (item_id) 
  VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);

Die Vorteile dieser Konstruktion ist, dass es einfach ist, wie viele Elemente ein bestimmter Benutzer COUNT() hat, ist es einfach, Dinge wie MIN() und MAX() für eine bestimmte Eigenschaft zu berechnen, können Sie einen Fremdschlüssel für die Referenz Eigenschaft erzwingen, etc.

Einige Datenbanken haben eine Funktion, um den zweiten Teil eines zusammengesetzten Primärschlüssels (item_id in diesem Fall) als Auto-Inkrementierung zu erklären, wenn Sie also den Wert für entity_id angeben, aber item_id auslassen es wird automatisch den nächsten freien Wert (aber tut nicht Lücken füllen, wenn Sie ein) löschen. Sie angeben nicht, welche Marke von Datenbank, die Sie verwenden, so werde ich es Ihnen überlassen Sie diese Funktion, um herauszufinden.

Bearbeiten Wie Tony Andrews in seiner Antwort sagt, die Anzahl der Zeilen ist kein Problem. Sie angeben nicht, welche Marke der Datenbank, die Sie verwenden, sind zu wollen, aber wenn Sie ein besonders schwaches Produkt wie MS Access wählen, können Sie auf die Datenbank verlassen leicht Millionen von Zeilen zu verarbeiten. Wenn Sie Indizes gut wählen, und schreiben Sie Abfragen, die diese Indizes verwenden, Effizienz sollte kein Problem sein.

Andere Tipps

verwenden, um ein einzelnes Element Tabelle:

userId, itemIndex, IsReference, NumericValue, Referenzwert

Auf diese Weise wird der Wert für item_3_name für Benutzer 999 übersetzt

999,3, true, null, Wert

Du musst bestimmte Einschränkungen selbst erzwingen, S.A. die maximale Anzahl der Artikel pro Benutzer, etc.

Die richtige Datenbank-Design wäre jeden Benutzer / Stück in einer separaten Zeile zu speichern. Dies wird viel einfacher, mit zu arbeiten, und entfernt die willkürlichen Beschränkung von 10 Stück. Ich würde es nicht sagen wird wachsen „astronomisch tief“, wird es rund 10 x sein (Nr. Der Benutzer) Zeilen.

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