Ist es jemals in Ordnung, einen Wert zweimal in einer database zu speichern?

Wir erstellen eine (potentiell) riesige database, die mit Users gefüllt wird. Jeder Benutzer kann viele Items erstellen. Eine Anwendung ruft diese Elemente später auf ihre Anforderung für die Öffentlichkeit ab und listet sie auf. Jedes UserID hat einen 'pointers' auf die UserID seines Erstellers. Beim Abrufen des Elements müssen immer auch der Name und das image (URL) des Benutzers abgerufen werden.

Angesichts einer Möglichkeit von Hunderttausenden von Benutzern mit jeweils einigen Dutzend Elementen und Tausenden von Anfragen nach den Elementen würde ich mir vorstellen, sowohl Benutzer als auch Elemente jedes Mal etwas zu fragen, obwohl es sich um eine einzige Abfrage handelt. Da das Item selbst niemals ohne den Benutzernamen des Benutzers abgerufen wird, ist es völlig unvernünftig, den Users-Benutzernamen im Item zu speichern? z.B:

(Einfache Darstellung des ursprünglichen pathes)

 Table(User):UserID, Username, UserPictureURL, Email, Address, ... Table(Item):ItemID, ItemName, Value, UserID, ... 

Eine Abfrage für einen Artikel hier ist immer zB Select * from User, Item Where.. Dies wird Elemente aus beiden Tabellen erhalten.

(Einfache Darstellung des Gedankenweges)

 Table(User):UserID, Username, UserPictureURL, Email, Address, ... Table(Item):ItemID, ItemName, Value, UserID, Username, UserPictureURL ... 

Die Abfrage würde jetzt nur Select * from Item erfordern. Nur Elemets von einem Tisch.

Wenn die User-Tabelle Hunderttausende von Benutzern enthält, oder sogar mehr, wie viel performance / Geschwindigkeit geht verloren, wenn Sie auf beide Tabes für jede Element-Abfrage zugreifen? Ich weiß, dass das doppelte memoryn von Werten schlecht ist , und dass Beziehungsdatenbanken nur zu dem Zweck existieren, dies zu eliminieren, aber wenn es eine deutlich reduzierte Länge in der Anfragezeit gibt. Ist es so schlimm? Wenn wir einen Artikel abrufen würden, aber 100.000 Benutzer, würde es nicht noch etwas time für die Abfrage benötigen? Selbst wenn in derselben Abfrage wie im ersten Beispiel.

Ich habe ein paar einfache Mathe getan, um es herauszufinden. Wenn wir die maximale Länge des Benutzernamens auf 30 character und pictureURL auf 80 setzen, werden 110 character möglicherweise doppelt gespeichert. Angesichts der Tatsache, dass es 100.000 Benutzer mit jeweils 3 Items, IE 300.000 Double Storings, gibt, ergeben sich insgesamt nur ~ 31,5 Megabytes. Das ist ein kleiner Preis für schnellere Anfragen.

Ich weiß, wenn wir Benutzern erlauben, ihre Benutzernamen zu ändern, oder wenn sie ihre Profilbilder ändern, müssten wir alle ihre Elemente durchlaufen und sie auch dort ändern, aber ich bin immer noch zerrissen. Das Ändern von Benutzernamen / imageern kann asynchronous erfolgen und tritt wesentlich seltener auf als die Item-Requests.

Ich bin mir nicht sicher, ob das eine Frage der Meinung ist oder ob es Fakten gibt, die beide methods unterstützen.

Edit: Ich sehe Leute, die erwähnen, dass Hunderttausende Einträge nicht so viel sind. Um etwas optimistisch zu sein, sagen wir, die Zahl könnte sich auf Milliarden belaufen. Würde es etwas ändern?

Solutions Collecting From Web of "Ist es jemals in Ordnung, einen Wert zweimal in einer database zu speichern?"

Die einzige Möglichkeit, die performance wirklich zu verstehen, besteht darin, sie mit Ihren data auf Ihrem System zu testing.

Ein paar hunderttausend Zeilen sind jedoch nicht so viele Zeilen. Und normalisierte Systeme schaffen es, data jederzeit über einen einfachen Join abzurufen:

 select ui.* from users u join useritems ui on u.userid = ui.userid where u.username = XXX; 

Ich würde erwarten, dass diese Abfrage für Ihre Aufgaben ausreichend useritems(userid) , vorausgesetzt, Sie haben einen Index für useritems(userid) . Der username in zwei Tabellen dupliziert werden.

Es gibt auch einen Vorteil, der einen Index für eine numerische ID hat (wie ich annehme, dass userid wäre) im Vergleich zu einer characterfolge mit variabler Länge. Ein Index für eine Ganzzahl ist kleiner. Das heißt, wenn der Index im memory ist, ist mehr memory für andere Abfragen verfügbar.

Ihre Frage bezieht sich auf normalisierte vs nicht normalisierte databaseen.

In nicht normalisierten databaseen (wie in Ihrem Beispiel mit einer Tabelle) werden data dupliziert. Es gibt wirklich nur ein Szenario, in dem dies kein Problem ist: Wenn Sie wissen, dass Sie niemals data aktualisieren oder löschen werden, sondern nur neue data insert. Wenn Sie data in einer nicht normalisierten database aktualisieren oder löschen, riskieren Sie "Anomalien aktualisieren".

Eine nicht normalisierte database ist ein wenig schneller und deshalb wird sie im Datawarehousing verwendet. In dem Beispiel, das Sie angeben, sollte das, selbst wenn die Tabellen extrem groß werden, kein Problem darstellen.