2016-06-17 9 views
0

Ich habe eine Liste von "Haushaltsgeräten" und ich möchte eine Datenbank modellieren, um sie in einer Tabelle zu speichern. Es gibt verschiedene Gerätetypen mit unterschiedlichen Eigenschaften/Spalten. Beispiel:Wie man Abstraktion in SQL modelliert?

Benutzer "Mike" hat einen "TV (Größe Zoll, Energieverbrauch)", "Kühlschrank (min. Temperatur, Höhe, Breite)".

Ein Benutzer hat eine Liste von "Haushaltsgeräten".

Ich weiß nicht, wie ich das auf eine nette Art modellieren könnte. Am Ende möchte ich nur die db abfragen: welche Appliances (und deren Eigenschaften) hat der Benutzer?

Antwort

1

Sie ein Modell erstellen könnte wie:

user (id, name) 
    1, bob 
    2, mark 
    ... 
device (id, name) 
    1, TV 
    2, Fridge 
    ... 
attributes (id, name) 
    1, size inch 
    2, energy consumption 
    3, min temperature 
    4, height 
    ... 
device_has_attribute (id_device, id_attribute, value) 
    1, 1, 2.7inches (you decide the unit or it could be another table) 
    1, 2, 220v 
    2, 1, 6.7ft 
    2, 3, 30F 
    ... 
home_appliance (id, name) 
    1, Kitchen 
    2, Living room 
    ... 
home_appliance_device (id_home_appliance, id_device) 
    1, 1 
    2, 1 
    2, 2 
    ... 
user_home_appliance (id_user, id_home_appliance) 
    1, 1 
    1, 2 
    2, 2 
    ... 

Ich empfehle Ihnen, den Wert Einheit als eine andere Tabelle hinzuzufügen wäre es

unit (id, name, acronym) 
device_has_attribute (id_device, id_attribute, value, id_unit) 
3

sein Dies ist ein klassisches Problem in der Datenmodellierung und Datenbankdesign . Es geht um andere Namen als die, die Sie verwendet haben, "Abstraktion". In der ER-Modellierung wird es tendenziell als "Generalisierung/Spezialisierung" bezeichnet. In der Objektmodellierung wird es tendenziell als "Klassen-/Unterklassenmodellierung" oder "Vererbung" bezeichnet.

Wenn es zum Entwerfen von SQL-Tabellen kommt, die mit diesen Modellen übereinstimmen, gibt es verschiedene Techniken, die Ihnen helfen können. In den frühen Jahren hatte SQL keine allgemeinen Möglichkeiten, um mit dieser Situation zu helfen, obwohl es in der realen Welt immer wieder vorkommt. Zwei Techniken, die mir in den Sinn kommen, sind "Vererbung einzelner Tabellen" und "Vererbung von Klassentabellen".

Bei der Vererbung einer einzelnen Tabelle werden alle Daten für die Klasse und die Unterklassen in einer Tabelle zusammengefasst. Es ist gut für die einfachsten Situationen. Ihr Fall sieht für mich etwas komplizierter aus.

Die Vererbung von Klassentabellen stellt eine Tabelle für Klassendaten und eine separate Tabelle für jede Unterklasse bereit. Die Antwort von Jorge Campos sieht so aus. In Verbindung mit der Klassentabelle gibt es eine Technik, die "gemeinsamer Primärschlüssel" genannt wird. Die Unterklasse-Tabellen haben kein eigenes ID-Feld. Stattdessen wird der Fremdschlüssel, der auf die Klassentabelle verweist, als Primärschlüssel der Unterklassentabelle verwendet. Dies macht Joins einfach, einfach und schnell. Es erzwingt auch die Eins-zu-Eins-Natur der Unterklassenbeziehung.

Eine schnelle Suche nach diesen Schlagwörtern sollte Ihnen viele anschauliche Beispiele geben. Ich mag besonders, wie Fowler diese Konzepte präsentiert. Oder Sie könnten mit der Info Registerkarte auf diesen drei Tags beginnen:

+0

Was ist, wenn Sie gehen von der Supertabelle in die Unterklasse? Wünschen Sie für eine beliebige Anzahl von Unterklassen nicht, dass ein "Typ" -Feld in der Oberklasse auf die Unterklasse-Tabelle zeigt, um zu vermeiden, dass jede Tabelle für die Unterklassen-Informationen einzeln abgefragt wird? – markw

+0

Es hängt davon ab, wie Sie die Daten verwenden. In vielen Fällen müssen Sie lediglich eine Unterklasse-Tabelle mit der Superklasse-Tabelle verknüpfen, und alle irrelevanten Einträge werden aus der Verknüpfung entfernt. –

+0

Große Antwort. :) +1 –