2012-12-14 11 views
7

Wir waren alle schon da - betrachten Sie das folgende Beispiel - zuerst sagt der Client "Jeder Benutzer darf nur ein Profilbild haben", also fügen wir ein Feld dafür in die Benutzertabelle ein - ein halbes Jahr später Die Anforderungen ändern sich und ein Benutzer muss tatsächlich Profilbilder haben.Dreidimensionale Datenbanktabelle

Nun scheint dies nur möglich, wenn Sie eine neue Tabelle wie user_pictures hinzufügen, um die neue Kardinalität 1: n statt 1: 1 zu behandeln. Oft kann dies sehr kompliziert werden. Immer wenn ich auf dieses Problem stoße, frage ich mich, warum wir nicht alle drei Dimensionen verwenden, in die wir denken können. Eine zweidimensionale Tabelle ist so begrenzt, dass sie etwas unvollständig ist - was wäre, wenn wir auf unser Problem mit dem Profilbild verweisen wieder hatte das Bildfeld in der Benutzertabelle eine Tiefe, und diese Tiefe machte das Feld zu einem Array, das beide Kardinalitäten 1: 1 und 1: n gleichzeitig perfekt wiedergab.

Tabellenfelder würden einfach zu Arrays werden und automatisch beide Kardinalitäten unterstützen - wäre das nicht etwas? Zumindest würde ich es benutzen. Gibt es sowas schon da draußen?

+0

Alle möglichen Beziehungen zwischen "Dingen" in einer Datenbank (eins zu eins, eins zu viele, viele zu viele) sind abgedeckt. Was wäre ein Anwendungsfall für eine "dreidimensionale" Tabelle - was auch immer das bedeutet? – NullUserException

+0

Ein Beispiel für einen Anwendungsfall ist der obige mit den Profilbildern: Sie müssten eine neue Tabelle hinzufügen, aber das ist eindeutig umständlich. Modellbeziehungen müssten geändert werden, die Anfragen müssten entsprechend aktualisiert werden, was viel Schmerz und Arbeit mit sich bringen würde. Ich denke, wir können es besser machen. Würde nicht ein zweidimensionales Feld, das den Tisch dreidimensional macht, das lösen? – weltschmerz

+1

Relationale Datenbanken werden von einer sehr soliden Grundlage unterstützt - [relationale Algebra] (http://en.wikipedia.org/wiki/Relational_algebra). Es stellt sicher, dass sie sowohl schnell als auch korrekt sind. Das ist einer der Gründe, warum sie immer noch da sind, als andere Arten von Datenbanken über die Jahre kamen und gingen. Repariere nicht, was nicht kaputt ist. – NullUserException

Antwort

7

Oracle unterstützt arrays sowie nested tables. Beide scheinen Ihren Anforderungen zu entsprechen. Heutzutage bevorzugen die Leute jedoch, alles als Tabellen und Beziehungen zu modellieren, um die Dinge einfach und konsistent zu halten, und so unterstützen moderne RDBMSs dieses Zeug im Allgemeinen nicht und ich glaube auch nicht, dass es jemals in Standard-SQL übergegangen ist.

+0

Große Antwort, danke für die Links! – weltschmerz

4

Die Standard-many-to-many-Ansatz wird viele Nutzer zu viele Profilbilder, leicht durch den Ansatz drei Tabelle abgedeckt:

Tabelle: Benutzer
Tabelle: Bilder
Tabelle: User_Pictures

Wenn Sie jedoch zu einem NoSQL-Ansatz übergehen, können Sie ein Benutzerdokument (normalerweise im JSON-Format) speichern, in dem ein Array von Profilbildern für diesen Benutzer in einer einzigen Tabelle gespeichert wird.

@ gordy +1 für die Oracle-Verbindung. Ich war mir nicht sicher, ob irgendwelche RDBS-Arrays angenommen wurden.

2

Sie beschreiben eine Denormalisierungstechnik (mehrere Spalten für Instanzen eines Feldes) und es führt normalerweise zu Tränen, es sei denn, Sie verstehen die Folgen der Verletzung grundlegender relationaler Prinzipien gründlich.

Eine klassische Schwierigkeit kommt, wenn Sie auf das Feld abfragen ("den Benutzer finden, der dieses Bild hat") und Sie feststellen, dass eine SQL-Anweisung mit "AND Bild IN (pic1, pic2, pic3)" nicht kann indexiert werden und Ihr Optimierer beginnt seine Rache zu planen.

+0

+1 für die Erwähnung der Indizierung – weltschmerz