Wie kann ich meine Datenbank übersichtlicher gestalten?

7

Ich schreibe eine Anwendung für Android mit SQLite (unterstützt von ORMlite, wenn es darauf ankommt). Bisher bin ich in der Konzeptionsphase und arbeite am Datenbankdesign. Die Datenbank soll eine Sammlung von Assets enthalten, die für einen oder mehrere Benutzer registriert sind. Ich habe noch nie an Daten außerhalb von SQLite gearbeitet und selbst dann habe ich nur wenige sehr kleine Datenbanken erstellt. Als solches bin ich mir nicht sicher, ob ich mit diesem Design richtig umgehe. Wenn ich mein Design erweitere, fängt es an, wie ein Durcheinander auszusehen. Meine Fragen sind:

  1. Entwerfe ich diese Datenbank zu objektorientiert? Als Java-Programmierer ist es genau so sinnvoll, die Datenbank zu entwerfen.
  2. Gibt es eine Möglichkeit, die Datenbank weniger chaotisch aussehen zu lassen?
  3. Bin ich überhaupt auf dem richtigen Weg?

Als Referenz dient hier ein früher leichter lesbarer Prototyp des Datenbankdesigns. Es wurden noch keine Eingaben zugewiesen.

Das vorherige Datenbankdesign

Hier ist eine aktuellere Visualisierung meines Problems.

Das aktuelle Datenbankdesign

ahodder
quelle
2
Was Sie nennen, messyist eigentlich normalizationdas, was normalerweise gut ist.
JNK
@JNK, Ok. So viel Fragmentierung ist also eine gute Sache. Was wäre eine außergewöhnliche Situation?
Ahodder
Dies hängt von Ihrem Anwendungsfall ab. Wenn Sie viel einfügen / aktualisieren, kann die Normalisierung bevorzugt werden, da Sie weniger Daten gleichzeitig sperren / aktualisieren. In einer leselastigen Umgebung mit statischen Daten können denormalisierte Daten bevorzugt werden, da sie Abfragen vereinfachen und eine bessere Leistung beim Lesen erzielen können.
JNK
1
Einige Fragen - es sieht so aus, als ob Asset / Publication / Barcode IMMER zusammen sind, außer in einem Fall. Sind der Barcode und die Veröffentlichung Eigentum des Vermögenswerts?
JNK
1
Es sieht so aus, als ob dieses Modell von einigen Eltern-Kind-Beziehungen profitieren könnte, aber ansonsten scheint es völlig vernünftig zu sein.
Jon Seigel

Antworten:

5

Dies ist eher ein Kommentar, aber da dies eine lange Antwort ist, die es wert ist, erwähnt zu werden, poste ich sie als Antwort.

Ihre Datenbank sieht für Ihre Bedürfnisse ausreichend aus. (Na ja, wie es am besten aus dem Diagramm übernommen werden.) Ich gehe davon aus, dass die UserAccountTabelle , die eine Beziehung einer Eins-zu-viele hat zwischen den vier Tabellen Vehicle, Book, VideoGameund Movie(von hier an, den VBVM Tabellen) . Als nächstes gehe ich davon aus, dass der AssetTisch hat eine Eins-zu-Eins-Beziehung zu jeder Verbindung zwischen den VBVM-Tabelleneinträgen. Mit diesen Informationen würde ich empfehlen, die UserAccount_idvon jeder VBVM-Tabelle in die zu verschieben AssetTable.

Als nächstes scheint dies Assetimmer mit einer der vier VBVM-Tabellen verbunden zu sein. In Anbetracht dieser Art der Einrichtung würde ich empfehlen, eine zusätzliche Tabelle zu erstellen AssetType.

+-----------+
| AssetType |
+-----------+
| id        |
| typeDesc  |
+-----------+

Aktualisieren Sie als Nächstes die AssetTabelle und jede VBVM-Tabelle, um ein AssetType_IDFeld einzuschließen . Die AssetTypeTabelle sollte für jeden Asset-Typ einen Eintrag enthalten. In diesem Fall Vehicle, Book, Video Gameund Movie, die jeweils mit einer eindeutigen Beschreibung und ID.

Möglicherweise möchten Sie dies aus mehreren Gründen tun: Zunächst können Sie jetzt die AssetTabelle abfragen und erkennen, welche Art von Asset in einem bestimmten Datensatz gespeichert ist, ohne die Daten mit Ihren vier anderen VBVM-Tabellen verknüpfen zu müssen. Dies beschleunigt das Abfragen der Daten, wenn nicht alle Informationen aus Ihren vier Tabellen benötigt werden. Zweitens bietet dies auch eine einfache Möglichkeit, eine Textbeschreibung des mit dem AssetEintrag verknüpften Asset-Typs zu verknüpfen . Auch hier müssen Sie keine Verknüpfung zu den VBVM-Tabellen herstellen, um dies herauszufinden.

Schließlich können Sie wollen prüfen , die Barcode - Datenverarbeitung unterschiedlich. Wenn es sich bei dem Barcode um eine einfache Suche handelt, können Sie ihn der Asset-Tabelle hinzufügen. Wenn Barcode-Werte jedoch eindeutig sein müssen, muss sie in einer sekundären Tabelle gespeichert werden, da die Datenbank eingeschränkt werden muss. Sie könnten dies tun, wenn es in die AssetTabelle integriert wäre. Ihre Fahrzeugdaten würden jedoch Probleme verursachen, da Fahrzeuge keine Barcodes haben. Meines Wissens können Sie in den meisten, wenn nicht allen großen Datenbankmodulen kein eindeutiges Feld definieren, das auch nullWerte zulässt , da die Daten dann nicht mehr eindeutig sind.

Sie könnten geneigt sein zu glauben, dass Sie das BarcodeFeld mit dem kombinieren könnten VIN. Da VINs eindeutig und Barcodes eindeutig sind und auch nicht identisch sein sollten, können sie nicht in einem Feld in der AssetTabelle zusammengefasst werden, sodass Sie die zusätzliche BarcodeTabelle löschen können . Ich würde dies nicht empfehlen, da ich denke, dass die Daten dadurch weniger "fokussiert" werden.

Ja, es ist eine Form der eindeutigen Objekt-ID, aber Barcodes sind Barcodes und VINs sind VINs - das Konzept hinter beiden ist völlig unterschiedlich und die Konsolidierung der beiden kann mit der Zeit verwirrend werden. Wenn Sie Ihr Projekt in Zukunft erweitern, kann dies außerdem zu Kollisionen führen. Technisch gesehen sehe ich kein großes Problem damit (in Ihrem Fall), aber ich würde trotzdem empfehlen, diese Option zu vermeiden.

Außerdem würde ich das auch assetType_idzur BarcodeTabelle hinzufügen , aus den gleichen Gründen, aus denen Sie es der AssetTabelle hinzugefügt haben .

RLH
quelle
Vielen Dank für die lange und vollständige Antwort. Ich hatte das meiste gerade getan, bevor Ihre Antwort veröffentlicht wurde. Nach den Kommentaren und dem erneuten Konsultieren des hierarchischen Wikis schien es die beste und logischste Idee zu sein. Ich habe jedoch nicht daran gedacht, den Asset-Typ hinzuzufügen. Das macht auch sehr viel Sinn.
Ahodder
@AedonEtLIRA: Ja, ich habe Ihr Update nicht gesehen, als ich die Antwort eingegeben habe. Ich würde empfehlen, die BarcodeDaten in die PublicationTabelle zu verschieben, es sei denn, Sie erwarten Barcode, dass mehrere Instanzen einer Veröffentlichung berücksichtigt werden. Ist der Barcode für ein einzelnes Objekt spezifisch oder ähnelt er einem ISDN?
RLH
Ich habe überlegt, Barcodezur Veröffentlichung überzugehen. Je mehr ich darüber nachdenke, desto sinnvoller ist es, dort zu sein. A Barcodeist garantiert nicht eindeutig. Jemand könnte mehrere Instanzen eines Assets haben. Wo wären wir, wenn (s / h / it) jeden im Auge behalten wollte? Andererseits könnte ich ein Feld in der AssetTabelle für die Menge haben. Danke noch einmal.
Ahodder