2012-09-20 15 views
5

Ich arbeite an einer N-Tier-Anwendung mit .NET (C#, SQL Server). Ich habe mit dem Entwurf der Datenbank angefangen, weil ich glaube, dass ich von unten anfangen würde, wäre eine gute Idee. Jetzt brauche ich Ihre Vorschläge beim Aufbau der Datenbank sehr flexibel zu sein. Zu wissen, dass die Anwendung als eine Gruppe von Plug-ins erstellt werden soll.Entwerfen einer Datenbank für die Verwendung in N-Tier-Anwendung

Die Anwendung ist eine Fernbedienung App für viele verschiedene Hardware-Geräte (Autos, Motoren, etc.) Hier ist ein Fragment der Datenbanktabellen.

  1. Devices Tabelle
  2. Personal Tabelle
  3. Benutzer Tabelle
  4. Rollen Tabelle

Wie können Sie die Geräte Tabelle sehen eine Tabelle ist, die Geräte, die wir steuern und da jeder jeweils darstellen Gerät kann mehr oder weniger Eigenschaften als andere haben Ich möchte jedes Gerät mit seinen Eigenschaften verbinden, die in einer anderen Tabelle in einer so eleganten wie möglich sein können. Die Personal-Tabelle ist für die Personen verantwortlich für das Gerät zum Beispiel: Autofahrer (es kann mehr als einen Fahrer für jedes Auto geben), Motor Operator, etc.

Benutzer sind die Anwendungsbenutzer, wie Sie sehen können, habe ich getrennt die Benutzer und Rollen in zwei verschiedenen Tabellen.

Ich suche nach einer Möglichkeit, die Geräte mit ihren Eigenschaften zu verknüpfen. Außerdem ist jedes Gerät in der Anwendung eine Instanz eines anfügbaren Geräts. Das bedeutet, dass ich ein Gerät namens say: SIM-Karte an ein Gerät namens Vehicle anschließen kann. Gibt es darüber hinaus Designmuster in Bezug auf dieses Thema?

Vielen Dank im Voraus, und bitte verzeihen Sie mir, wenn ich nicht klar bin.

+0

[composite] (http://www.oodesign.com/composite-pattern.html) –

+0

Ein Problem in Bezug auf die Verwendung von Composite-Muster ist, wenn ich zum Beispiel den SIM-Bericht anzeigen möchte und weiß, dass die SIMs begraben sind tief im Kompositbaum werde ich einen Weg brauchen, um diesen Baum zu durchqueren, vielleicht mithilfe des Besuchermusters. –

Antwort

1

Je nachdem, wie Sie Ihre Daten Schicht handhaben werden, kann dieses Datenbankdesign ein strittiger Punkt sein. Wenn Sie EntityFramework mit einem Code-First-Ansatz verwenden, können Sie Ihre logischen Entitäten erstellen und die Datenbank aus Ihren Modellen generieren.

Die meisten ORM-basierten Lösungen bieten eine Möglichkeit zum Erstellen einer Datenbank aus Ihrer Objektbeziehung, aber obwohl Sie schnell und einfach eine Datenbank zum Laufen bringen können, die GENAU was Sie brauchen, wenn Sie mit dem Schema spielen wollen Sie können in Schwierigkeiten geraten, obwohl Sie viele Schlüsse ziehen können, um die Datenbank hinter den Kulissen so zu gestalten, wie Sie es wollen.Wenn es sich um ein Greenfield-Projekt handelt und Sie kein Legacy-Datenbanksystem unterbringen müssen, würde ich mich im Moment nicht um Ihre Datenbank kümmern und nur Ihre logischen Modelle schreiben und ihre Beziehungen definieren und die Datenspeicherprobleme behandeln sich.

+0

Ja, ich verwende keinen Legacy-Code. –

1

Die eigentliche Designentscheidung liegt bei Ihren Device- und Property-Tabellen. Die anderen sind ziemlich Standard.

Damit ein Gerät optional mit einer oder mehreren Eigenschaften verknüpft werden kann, ist lediglich ein Fremdschlüssel in der Eigenschaftsliste erforderlich. Aber das wirft eine sehr wichtige Frage auf: Müssen bestimmte Geräte bestimmte Eigenschaften haben? Wird Ihre Anwendung eine "Model" -Eigenschaft für Ihr "Car" -Gerät erwarten? Wie gewährleisten wir die Integrität der Datenbank bei dieser Art von Design?

Sie können dies über datenbankdefinierte Einschränkungen tun. Aber wie soll man wissen, dass ein "Auto" -Gerät eine "Model" -Eigenschaft benötigt? Möglicherweise benötigen Sie für jedes Gerät eine Vorlagendefinition: DeviceType- und PropertyType-Tabellen. Auf diese Weise weiß Ihre Einschränkung immer, welche Eigenschaften beim Aktualisieren/Einfügen eines Datensatzes erwartet werden. Außerdem wird es so einfacher, mit den Daten in Ihrer Anwendung zu arbeiten.

+0

Eine Sache über Eigenschaften ist, dass, wenn sie später zu der Präsentationsebene zugeordnet werden, sie von anderer Art sein werden, einige nur boolesche Werte haben, während andere eine Zeichenkette oder einen numerischen Bereich nehmen. Dies bedeutet, dass die Eigenschaften selbst unterschiedliche "Werttypen" haben werden –

+0

Welche in Ihrer DeviceType-PropertyType-Definition definiert werden können. – davenewza

0

Es gibt kein ideales Datenbankdesign für irgendwas. Es kann sich schnell entsprechend den Informationen ändern, die Sie manipulieren.

Ein einfacher Ansatz besteht darin, alle Klassen in Ihrem Entwurf aufzulisten und dann diese Klassen auf die niedrigste mögliche Ebene zu bringen, ohne dass sich Daten wiederholen.

Auch jedes Gerät hat verschiedene Eigenschaften, Sie können die Geräte in ihre jeweilige Gruppe einteilen und eine Gruppe wird meist ähnliche Eigenschaften haben. Sie können eine Eigenschaftentabelle erstellen, die alle Eigenschaften für diese Gruppe enthält. Wie Sie gesagt haben, können Sie sie in einer anderen Tabelle mit DeviceID und PropertyID verbinden. Das Gleiche gilt für eine Person und ein Gerät. Je nach den Attributen, die Sie haben, können Sie die Personentabelle in kleinere Teile zerlegen.

Wenn zahlreiche Tabellen hinsichtlich der Datenextraktion einen Cluster bilden, können Sie ein Sternschema für Ihre Lösung mit einer Faktentabelle (reelle Zahlen) in der Mitte und den damit verbundenen Daten betrachten.

Viel Glück!

Verwandte Themen