Wie heißt diese Form der database?

Ich bin neu in databaseen und ich denke daran, eine für eine Website zu erstellen. Ich habe mit SQL angefangen, aber ich bin mir nicht sicher, ob ich die richtige Art von database verwende.

Hier ist das Problem:

http://i.imgur.com/B4ZypkC.png

Was ich gerade habe, ist die erste Option. Das bedeutet also, dass meine Abfrage ungefähr so ​​aussieht:

user_id photo_id photo_url 0 0 abc.jpg 0 1 123.jpg 0 2 lol.png 

etc .. Aber mir scheint das ein wenig ineffizient, wenn die database groß wird. Also die Sache, die ich will, ist die zweite Option, die auf dem image gezeigt wird. So etwas wie damals:

 user_id photos 0 {abc.jpg, 123.jpg, lol.png} 

Oder etwas ähnliches:

 user_id photo_ids 0 {0, 1, 2} 

Ich konnte so etwas nicht finden, ich finde nur das gewöhnliche SQL. Gibt es da sowas überhaupt zu tun (auch wenn es sich nicht um eine "database" handelt)? Wenn nicht, warum ist SQL für diese Art von Situationen effizienter? Wie kann ich es effizienter machen? Danke im Voraus.

Ihr erster Ansatz, um eine user_id, photo_id, photo_url ist korrekt. Dies ist die normalisierte Beziehung, die von den meisten databaseverwaltungssystemen verwendet wird.

Die folgende Beziehung wird "eins zu viele" genannt, da ein Benutzer viele Fotos haben kann.

Sie können so weit gehen, die Fotodetails zu trennen und nur eine referencetabelle zwischen den Benutzern und den Fotos bereitzustellen.

Der Grund dafür, dass Ihr zweiter Ansatz ineffizient ist, besteht darin, dass databaseen nicht dafür ausgelegt sind, mehrere Werte in einer einzelnen Spalte zu suchen oder zu speichern. Während es möglich ist, data auf diese Weise zu speichern, sollten Sie nicht.

Wenn Sie ein bestimmtes Foto für einen Benutzer mit Ihrem zweiten Ansatz suchen möchten, müssen Sie mit LIKE suchen, das höchstwahrscheinlich keine Indizes verwendet. Der process der Extrahierung oder Auflistung dieser Fotos wäre ebenfalls ineffizient.

Sie können hier mehr über grundlegende databaseprinzipien lesen.

Ihr erstes Beispiel sieht wie eine traditionelle relationale database aus, in der eine Tabelle einen einzelnen datasatz pro Zeile in einem standardmäßigen Schlüssel / Wert-Attributsatz von 1: 1 speichert. So werden data in RDBMS wie Oracle, MySQL und SQL server gespeichert. Ihr zweites Beispiel sieht eher wie eine Dokumentdatenbank oder NoSQL-database aus, in der data in verschachtelten dataobjekten (wie Hashes und Arrays) gespeichert werden. So werden data in databasesystemen wie MongoDB gespeichert.

Es gibt Vorteile und Kosten für die memoryung von data in beiden modelsn. Bei relationalen databaseen, bei denen data über mehrere Tabellen verteilt und mit Schlüsseln verknüpft sind, ist es einfach, data aus verschiedenen Blickwinkeln zu erfassen und für verschiedene Zwecke zu aggregieren. Bei Dokumentendatenbanken ist es in der Regel schwieriger, data in einzelnen Abfragen zusammenzuführen, sie können jedoch schneller abgerufen werden, und sie sind in der Regel auch für eine schnellere Anwendungsnutzung formatiert.

Letzteres (Dokumentdatenbankmodell) ist für Ihre Anwendung möglicherweise am besten, wenn Sie nur dann auf die imageer eines Benutzers verweisen möchten, wenn Sie eine Benutzer-ID haben. Dies wäre beispielsweise nicht ideal, wenn Sie nach allen imageern der Kategorie "Profilbild" oder nach einem bestimmten date hochgeladene imageer abfragen. Sie könnten Ihre Aufgabe wahrscheinlich mit beiden databasetypen erledigen, und die Auswahl der richtigen database hängt immer von den Anwendungen ab, für die sie verwendet werden. Als allgemeine Faustregel gilt, dass relationale databaseen flexibler und schwieriger zu handhaben sind schief gehen mit.

Was Sie wollen (mit Benutzer -> (Foto1, Foto2, …)) ist eine Art INDEX:

Wenn Sie Ihre Anfrage ausführen, wird sie zu INDEX gehen und den INDEX "user" in der Fototabelle holen und die Fotoliste holen. Nicht alle databaseen werden nachgeschlagen, sie sind optimiert.

Ich würde so etwas tun
Users_Table (ein Benutzer – ein Foto)
Mit der ganzen Spalte, die jeder Benutzer haben wird. Wenn ein Benutzer nur ein Foto hat, dann fügen Sie einfach eine Spalte in dieser Tabelle mit photo_url hinzu

Ein Benutzer viele Fotos
Wenn ein Benutzer mehrere Fotos haben kann. Erstellen Sie dann eine separate Tabelle für Fotos, die nur UserID von Users_Table und Photo_ID und Photo_File enthält.

Viele Benutzer Viele Fotos
Wenn ein Foto mehreren Benutzern zugewiesen werden kann, erstellen Sie eine separate Tabelle für Fotos, in denen PhotoID und Photo_File vorhanden sind. Dritte Tabelle User_Photos, die UserID von Users_Table und Photo_ID von Photos Table haben kann.