2009-08-25 2 views
0

Entschuldigung für den schlechten Titel, aber ich habe keine Ahnung, wie man das kurz fasst. Das Problem ist das folgende:Mit instanzartigen Verhalten in Datenbanken

Ich habe ein generisches Element, das eine Gruppe darstellt, lassen Sie uns Car anrufen. Jetzt hat diese Auto Attribute, die innerhalb bestimmter Grenzen, sagen wir zum Beispiel Geschwindigkeit ist zwischen 0 und 180 für eine übliche Car. Stellen Sie sich einige weitere Attribute mit Bereichen vor, z. B. Farbe liegt zwischen 0 und 255, wofür dieser Wert auch stehen mag.

Also in meinem Tisch GenericItems ich habe:

ID Name 

1 Car 

Und in meinem Attribute ich habe:

ID Name Min_Value Max Value 
1 Speed  0   180 
2 Color  0   255 

Die Beziehung zwischen Auto und Attribute ist also 1: n.

Jetzt beginne ich sehr spezifische Instanzen meiner Auto zum Beispiel ein FordMustang, ein FerrariF40 und ein DodgeViper. Dies sind spezifische Instanzen und jetzt möchte ich ihnen spezifische Werte für ihre Attribute geben.

Also in meinem Tisch SpecificItem ich habe:

ID Name   GenericItem_ID 

1 FordMustang   1 
2 DodgeViper   1 
3 FerrariF40   1 

Jetzt brauche ich eine dritte Tabelle SpecificAttributes2SpecificItems, Attribute SpecificItems passen:

ID SpecificItem_ID Attribute_ID Value 

1   1    1   120  ;Ford Mustang goes 120 only 
2   1    2   123  ;Ford Mustang is red 
3   2    1   150  ;Dodge Viper goes 150 
4   2    2   255  ;Dodge Viper is white 
5   3    1   180  ;FerrariF40 goes 180 
6   3    2    0  ;FerrariF40 is black 

Das Problem dabei Design ist, wie Sie sehen können, dass ich im Grunde immer über alle Reihen von Attributen kopiere, und ich fühle mich wie th Es ist schlechtes Design, inkonsistent usw. Wie kann ich diese Logik auf korrekte, normalisierte Weise erreichen?

Ich möchte in der Lage sein, mehr generischen Elemente zu haben, mit mehreren Attributen mit Min/Max-Wert als Intervall, das „instanziiert“ mit bestimmten Werten

Antwort

1

Es sieht so aus, als ob Sie versuchen, Entity Atribute Value als Design zu replizieren, was zu vielen hässlichen Tabellen führt (naja, normalerweise ist es eine einzige Tabelle für alles).

http://en.wikipedia.org/wiki/Entity-attribute-value_model http://ycmi.med.yale.edu/nadkarni/Introduction%20to%20EAV%20systems.htm

Diskussion EAV auf „Religionskriege“ zu führen neigt, da es nur sehr wenige gute Plätze sind, es zu benutzen (viele Leute sagen, es gibt null gute Plätze) und es gibt andere Leute, die denken, dass seit es ist so sehr flexibel, es sollte überall verwendet werden. Wenn ich die Referenz finden kann, die ich suche, füge ich sie hinzu.

1

Der einfachste Weg, Vererbung in Datenbank-Modellen verwenden werden kann, ist zu Verwenden Sie ein ORM-Tool. Für Python gibt es SQLAlchemy, Django und andere.

Jetzt sollten Sie sich fragen, ob z.B. Ein Ford Mustang ist eine Art Auto oder eine Instanz von Auto. Im ersten Fall sollten Sie eine Tabelle ford_mustang erstellen, die die Attribute ford_mustang definiert. Die Tabelle "ford_mustang" sollte dann auch einen Fremdschlüssel für die Autotabelle haben, in dem die generischen Attribute jedes FordMustang angegeben sind. Im letzteren Fall ist jede Art von Auto nur eine Zeile in der Car-Tabelle. In jedem Fall sollte jedes Attribut in einer einzigen Spalte dargestellt werden.

Die Überprüfung der Attribute erfolgt in der Regel in der Geschäftslogik der Anwendung.

1

Es gibt eine Denkrichtung, die besagt, dass jeder Versuch, ein EAV-Modell in einem RDBMS zu erstellen, "schlechtes Design" darstellt, aber wir werden nicht dorthin gehen. Hoppla, sieht aus wie jemand anderes schon getan hat.

Ich bin mir nicht sicher, was dich beunruhigt. SpecificAttributes2SpecificItems ist eine Schnittstellentabelle (der Hinweis ist im Namen). Er enthält notwendigerweise Links zu den Attribute und den SpecificItems. Wie konnte es nicht?

Sie müssen wahrscheinlich ein MinVal und MaxVal auf SpecificAttributes2SpecificItems haben, wie bestimmte Elemente eine begrenzte Reichweite als die von den GenericItems erlaubt haben. Zum Beispiel weiß jeder, dass Ferraris nur in rot verfügbar sein sollte.

+0

upvote für sein lustig;) Was mir Sorgen macht, ist, dass mein Design einfach falsch anfühlt. Wenn ich meine Inserts schreibe ... alle "Template" -Attribute durchlaufen und sie in meine Kreuztabelle kopieren, spezialisiere sie mit einem Wert. Ich habe das Gefühl, hier etwas zu simulieren, das sollte besser gemacht werden. – Tom

1

paar Ideen:

Zunächst sollten Sie als Ihre „genericgroups“ Tabelle ein „Attribut“, anstatt etwas zu machen über den Rest der Daten schweben.

Zweitens kann es leichter sein, dass jede Attributtabelle tatsächlich die Attribute der Elemente enthält, nicht nur die Idee der Attribute. Wenn Sie einen Bereich haben möchten, sollten Sie entweder einen Aufzählungstyp (für Elementnamen) oder einfach eine Ganzzahl mit einem festgelegten Maximum berücksichtigen (der Wert der Spalte color_value darf nicht über 255 liegen). So können Sie am Ende mit etwas würde eher wie:

Item Table 
    ID Name 

    1 FordMustang 
    2 DodgeViper 
    3 FerrariF40 

    ItemType Table: 

    ItemID  Type 
    1   Car 
    2   Car 
    3   Car 


    ItemColor Table: 

    ItemID  ColorID 
    1   123 
    2   255 
    3   0 

    MaxSpeed Table 

    ItemID  MaxSpeedID 

    1  120 
    2  150 
    3  180 
+0

Nicht möglich. Das erste ist, dass ich ungefähr 300 verschiedene Attribute habe und sie dynamisch erweiterbar sein müssen, ohne das Datenbanklayout zu hacken. Alles sollte von CRUD über die vorhandenen Tabellen getan werden. Zweitens müssen nicht nur Autos, sondern auch Häuser, Flugzeuge usw. modelliert werden. Ich möchte ein völlig willkürliches Objekt nehmen, Attribute und Attributbereiche dafür erfinden und dann Instanzen dieses Objekts mit spezifischen Werten für die Attribute angeben. – Tom

+0

Betrachten Sie also eine andere Datenbank als SQL, wie CouchDB oder MongoDB. Dokument-orientierte DBs können Daten als JSON-Dokumente speichern, was mehr nach dem aussieht, was Sie beschreiben. – Anthony