Frage

ich auf einer Anwendung arbeite, die für andere Anwendungen als erweiterbares Framework verwendet wird.

Eine der grundlegenden Klassen Node genannt, und Knoten hat Inhalt. Die SQL-Tabellen wie folgt aussehen:

TABLE Node (NodeId int, .... etc)

TABLE NodeContentRelationship (NodeId int, Contenttype string, contentid int)

Es wird an die Entwickler sein, um die Anwendung erweitern ihre eigenen Inhaltstypen zu erstellen.

Das ist natürlich schlecht aus einer Beziehung-Datenbank Sicht, da es nicht möglich ist, eine Fremdschlüsselbeziehung zu NodeContentRelationship.ContentId hinzuzufügen, auch wenn es ist eine Fremdschlüsselspalte.

Doch die Lösung ist ganz einfach und leistungsfähig, damit ich nur ungern bin, es zu ändern.

Was denken Sie? - bin ich für eine Welt des Schmerzes auf der Spur in

War es hilfreich?

Lösung

Warum ist es unmöglich, als Fremdschlüssel gesetzt NoteContentRelationship.ContentId? Sie können ganz einfach ein relationales Vererbungsmodell mit einem Tisch Content verwenden eine abstrakte Basisklasse darstellt und verschiedene Tabellen AnimalContent, CarContent usw. repräsentieren abgeleiteten Klassen.

Andere Tipps

Beachten Sie die Inner Platform Effect .

Wenn Sie versuchen, ein ‚erweiterbares Framework‘ zu bauen, die Entwickler Daten von verschiedenen ‚Inhaltstypen‘ speichern kann und beziehen sie miteinander in einer generischen Art und Weise, können Sie feststellen, dass andere haben bereits gelöst dieses Problem .

Das sieht für mich wie eine Variation auf EAV (Entity, Attribut, Wert) Design.

Die Vorteile und Nachteile von EAV-Design ausführlich dokumentiert wurden.

Hier ist eine Beschreibung von EAV aus einer sympathischen Sicht:

http://ycmi.med.yale.edu /nadkarni/Introduction%20to%20EAV%20systems.htm

Und hier ist man von einer feindlichen Sicht:

http: // tonyandrews .blogspot.com / 2004/10 / otlt-and-EAV-two-big-Design-mistakes.html

Seien Sie der Nachteil von EAV bewusst, bevor Sie Tausende von Mannstunden in Gießen Daten in sie zu begehen. Es ist enorm verführerisch Programmierer, aber es kann ein Datenmanager Alptraum werden.

Sie sind in einer Welt von der Straße verletzt nach unten, wenn Sie jemals tatsächlich auf diesen Daten berichten wollen. Sie haben es nur sehr viel schwieriger zu schreiben verbindet und so. Das Fehlen von Einschränkungen ist schlecht, aber die zusätzliche Arbeit auf Abfragen erforderlich ist (IMHO) schlechter.

Wenn Sie jedoch andere Entwickler wollen das System und die Speicherung von Daten in der Datenbank in der Lage sein zu verlängern, aber nicht in der Lage sein, das Datenbankschema zu ändern, könnte es nicht eine Wahl sein. In diesem Fall ist die Antwort zu minimieren, wie viel auf diese Weise gespeichert wird. Man könnte es auch durch den Ersatz Content mit einem ContentTypeId in einer anderen Tabelle definiert leicht beschleunigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top