Erstmaliges Datenbankdesign: Bin ich überentwickelt? [geschlossen]


246

Hintergrund

Ich bin ein CS-Student im ersten Jahr und arbeite Teilzeit für das kleine Unternehmen meines Vaters. Ich habe keine Erfahrung in der realen Anwendungsentwicklung. Ich habe Skripte in Python geschrieben, einige Kursarbeiten in C, aber nichts dergleichen.

Mein Vater hat ein kleines Schulungsunternehmen und derzeit werden alle Kurse über eine externe Webanwendung geplant, aufgezeichnet und weiterverfolgt. Es gibt eine Export- / "Berichts" -Funktion, die jedoch sehr allgemein gehalten ist und spezielle Berichte benötigt. Wir haben keinen Zugriff auf die eigentliche Datenbank, um die Abfragen auszuführen. Ich wurde gebeten, ein benutzerdefiniertes Berichtssystem einzurichten.

Meine Idee ist es, die generischen CSV-Exporte zu erstellen und (wahrscheinlich mit Python) in eine MySQL-Datenbank zu importieren, die jede Nacht im Büro gehostet wird, von wo aus ich die spezifischen Abfragen ausführen kann, die benötigt werden. Ich habe keine Erfahrung mit Datenbanken, verstehe aber die Grundlagen. Ich habe ein wenig über die Datenbankerstellung und normale Formulare gelesen.

Möglicherweise haben wir bald internationale Kunden, daher möchte ich, dass die Datenbank in diesem Fall nicht explodiert. Wir haben derzeit auch einige große Unternehmen als Kunden mit unterschiedlichen Abteilungen (z. B. ACME-Muttergesellschaft, ACME-Gesundheitsabteilung, ACME-Körperpflegesparte).

Das Schema, das ich mir ausgedacht habe, ist das folgende:

  1. Aus Kundensicht:
    • Clients ist die Haupttabelle
    • Kunden sind mit der Abteilung verbunden, für die sie arbeiten
      • Abteilungen können über ein Land verteilt sein: HR in London, Marketing in Swansea usw.
      • Abteilungen sind mit der Aufteilung eines Unternehmens verbunden
    • Die Geschäftsbereiche sind mit der Muttergesellschaft verbunden
  2. Aus der Klassenperspektive:
    • Sitzungen ist der Haupttisch
      • Ein Lehrer ist mit jeder Sitzung verbunden
      • Jede Sitzung erhält eine Status-ID. ZB 0 - Abgeschlossen, 1 - Abgebrochen
      • Sitzungen werden in "Packs" beliebiger Größe gruppiert
    • Jedes Paket ist einem Client zugeordnet

Ich habe das Schema auf einem Blatt Papier "entworfen" (eher wie gekritzelt) und versucht, es auf die 3. Form zu normalisieren. Ich habe es dann in MySQL Workbench eingesteckt und es hat alles für mich hübsch gemacht:
( Klicken Sie hier für eine Grafik in voller Größe )

Alt-Text
(Quelle: maian.org )

Beispielabfragen, die ich ausführen werde

  • Welche Kunden mit noch verbleibendem Guthaben sind inaktiv (diejenigen ohne Unterricht in der Zukunft geplant)
  • Wie hoch ist die Anwesenheitsquote pro Kunde / Abteilung / Abteilung (gemessen an der Status-ID in jeder Sitzung)?
  • Wie viele Klassen hat ein Lehrer in einem Monat?
  • Kennzeichnen Sie Kunden mit geringer Anwesenheitsquote
  • Benutzerdefinierte Berichte für Personalabteilungen mit Anwesenheitsraten von Personen in ihrer Abteilung

Fragen)

  • Ist das überarbeitet oder bin ich auf dem richtigen Weg?
  • Wird die Notwendigkeit, für die meisten Abfragen mehrere Tabellen zu verknüpfen, zu einem großen Leistungseinbruch führen?
  • Ich habe Clients eine Spalte "Lastsession" hinzugefügt, da dies wahrscheinlich eine häufige Abfrage sein wird. Ist das eine gute Idee oder sollte ich die Datenbank streng normalisieren?

Vielen Dank für Ihre Zeit


131
Sehr geehrter CS-Student im ersten Jahr, bitte verwenden Sie StackOverflow weiterhin. Ihre Frage ist interessant, gut geschrieben und hilfreich. Mit anderen Worten, Sie gehören zu den Top 1% der Fragesteller.
Adam Crossland

Kann eine Abteilung andere Abteilungen enthalten? WENN dies der Fall ist, kann eine "has" -Tabelle verwendet werden, um die Division wieder mit der Division zu verknüpfen, in der sie enthalten ist.
Mark Schultheiss

Vielen Dank für die freundlichen Kommentare :) Mark, ich muss die Dokumentation für dieses Projekt noch einmal durchgehen, aber ich glaube nicht, dass wir diesen Fall identifiziert haben. Vielen Dank für den Hinweis.
Bob Esponja

1
Ich mag Ihre Primärschlüssel-Namenskonventionen nicht. Tabelle divisionshat Spalte benannt divisionid. Finden Sie das nicht überflüssig? Nennen Sie es einfach id. auch Ihre Tabellennamen einschließlich _has_: Ich würde das entfernen und es einfach zum Beispiel benennen cities_departments. Ihre DATETIMESpalten sollten vom Typ sein, es TIMESTAMPsei denn, es handelt sich um Benutzereingabewerte. Ich denke, es ist eine gute Idee, die citiesund countriesTische zu haben . Möglicherweise treten Probleme bei der Beschränkung der Tabellen auf eine einzelne auf status. INT
Erwägen

@binnyb Es gibt viele Argumente für die Verwendung von id als Namen des Primärschlüssels, die die Leute berücksichtigen sollten, bevor sie sich entscheiden.
Jedi

Antworten:


42

Weitere Antworten auf Ihre Fragen:

1) Sie sind ziemlich genau auf dem richtigen Weg für jemanden, der sich zum ersten Mal einem solchen Problem nähert. Ich denke, die Hinweise von anderen zu dieser Frage decken sie bisher ziemlich genau ab. Gut gemacht!

2 & 3) Der Leistungseinbruch, den Sie erzielen, hängt weitgehend davon ab, ob Sie die richtigen Indizes für Ihre speziellen Abfragen / Verfahren und vor allem das Volumen der Datensätze haben und optimieren. Wenn Sie nicht über weit über eine Million Datensätze in Ihren Haupttabellen sprechen, scheinen Sie auf dem Weg zu einem ausreichend Mainstream-Design zu sein, sodass die Leistung bei angemessener Hardware kein Problem darstellt.

Das heißt, und dies bezieht sich auf Ihre Frage 3: Von Anfang an sollten Sie sich hier wahrscheinlich keine allzu großen Sorgen um die Leistung oder die Überempfindlichkeit gegenüber der Normalisierungsorthodoxie machen. Dies ist ein Berichtsserver, den Sie erstellen, kein transaktionsbasiertes Anwendungs-Backend, das hinsichtlich der Bedeutung der Leistung oder Normalisierung ein ganz anderes Profil aufweist. Eine Datenbank, die eine Live-Anmelde- und Planungsanwendung unterstützt, muss Abfragen berücksichtigen, deren Rückgabe Sekunden dauert. Eine Berichtsserverfunktion hat nicht nur eine größere Toleranz für komplexe und langwierige Abfragen, sondern die Strategien zur Verbesserung der Leistung sind sehr unterschiedlich.

In einer transaktionsbasierten Anwendungsumgebung können Sie beispielsweise die gespeicherten Prozeduren und Tabellenstrukturen bis zum n-ten Grad umgestalten oder eine Caching-Strategie für kleine Mengen häufig angeforderter Daten entwickeln. In einer Berichtsumgebung können Sie dies sicherlich tun, aber Sie können die Leistung noch stärker beeinflussen, indem Sie einen Snapshot-Mechanismus einführen, bei dem ein geplanter Prozess ausgeführt und vorkonfigurierte Berichte gespeichert werden und Ihre Benutzer auf die Snapshot-Daten zugreifen, ohne Ihre Datenbankschicht zu belasten eine pro Anfrage Basis.

All dies ist eine langwierige Angelegenheit, um zu veranschaulichen, dass die von Ihnen verwendeten Designprinzipien und -tricks je nach der Rolle der von Ihnen erstellten Datenbank unterschiedlich sein können. Ich hoffe das ist hilfreich.


1
1. Danke, das ist beruhigend! 2 & 3. Ich weiß immer noch nicht, wie Indizes funktionieren, ich habe vor, darüber zu lesen. Wenn wir jemals das "Problem" haben, eine Million Datensätze zu erreichen, wird es wahrscheinlich ein Budget geben, um erfahrene Entwickler einzustellen: P Vielen Dank für den Einblick in die verschiedenen vorhandenen DB-Rollen. Es ist alles neu für mich und sehr interessant zu wissen. Ich werde mich mit Schnappschüssen befassen, da das, was Sie beschreiben, im Grunde das Endziel des Projekts ist.
Bob Esponja

Wenn Sie Tabellen verstehen, sind die Grundlagen von Indizes ziemlich einfach. Konzeptionell kann (und wird) ein Index als Tabelle mit sehr wenigen Spalten implementiert, deren Inhalt aus der Haupttabelle kopiert wird, und einem Verweis zurück auf die Haupttabelle, deren Zeilen für einen schnellen Zugriff keot-sortiert sind. B + Tree ist die häufigste Indexanordnung, aber bei Indexoptimierungen haben die Big Player ihre differenzierenden Technologien, sodass es trübe wird, wenn Sie versuchen, die Analogie zu tief anzuwenden.
Pojo-Typ

14

Du hast die richtige Idee. Sie können es jedoch bereinigen und einige der Zuordnungstabellen (mit *) entfernen.

Sie können in der Tabelle "Abteilungen" CityId und DivisionId hinzufügen.

Abgesehen davon denke ich, dass alles in Ordnung ist ...


4
Ich denke, er braucht die Zuordnungstabellen, wenn er eine Abteilungsdefinition über verschiedene Abteilungen oder Städte hinweg wiederverwenden möchte.
Jacob G

1
Ja, ich stimme zu ... aber es klang, als könnte eine Abteilung nur in einer Stadt / Abteilung sein. Wenn nicht, dann war das, was er hatte, definitiv richtig.
Reverend Gonzo

Ich habe einen Wiki-Artikel, den ich mit einer "Spezifikation" im Büro geschrieben habe. Ich muss ihn noch einmal lesen, aber Jacob G hat Recht. IIRC, es gibt einige Abteilungen, die sich über Abteilungen erstrecken. Eine Personalabteilung des ACME-Elternteils für ACME Healthcare und ACME Bodycare. Wenn ich es vereinfachen kann, werde ich es sicherlich tun, danke für den Vorschlag.
Bob Esponja

6

Die einzigen Änderungen, die ich vornehmen würde, sind:
1- Ändern Sie Ihr VARCHAR in NVARCHAR. Wenn Sie international werden, möchten Sie möglicherweise Unicode.

2- Ändern Sie Ihre Int-IDs nach Möglichkeit in GUIDs (Uniqueidentifier) ​​(dies könnte nur meine persönliche Präferenz sein). Angenommen, Sie erreichen irgendwann den Punkt, an dem Sie mehrere Umgebungen haben (dev / test / staging / prod), möchten Sie möglicherweise Daten von einer zur anderen migrieren. Mit GUID-IDs wird dies erheblich vereinfacht.

3- Drei Schichten für Ihr Unternehmen -> Abteilung -> Abteilungsstruktur reichen möglicherweise nicht aus. Dies ist möglicherweise überentwickelt, aber Sie können diese Hierarchie so verallgemeinern, dass Sie n Tiefenebenen unterstützen können. Dadurch werden einige Ihrer Abfragen komplexer, sodass sich der Kompromiss möglicherweise nicht lohnt. Ferner könnte es sein, dass jeder Client, der mehr Ebenen hat, leicht in dieses Modell "gestopft" werden kann.

4- Sie haben auch einen Status in der Client-Tabelle, der ein VARCHAR ist und keinen Link zur Status-Tabelle hat. Ich würde dort etwas mehr Klarheit darüber erwarten, was der Kundenstatus darstellt.


1- Danke, ich hatte Probleme mit Diakritika und UTF8, für die ich eine weitere Frage stellen wollte. Vielleicht ist das das Problem. 2- Ich habe hier auf SO einige andere Fragen mit vielen widersprüchlichen Meinungen zu diesem Thema gelesen. Ich werde mehr zu diesem Thema lesen. 3- Ich werde das noch einmal mit meinem Vater besprechen und mir die "Spezifikation" ansehen, die ich geschrieben habe, und sehen, ob dies etwas ist, das wir untersuchen sollten. - Fortsetzung nächsten Kommentar
Bob Esponja

4- Der Kürze halber habe ich in der Hauptfrage nicht darauf eingegangen: Der Status auf dem Client ist, ob er aktiv ist (verbleibende Sitzungen) oder inaktiv (keine verbleibenden Sitzungen). Meinen Sie mit mehr Klarheit einen aussagekräftigeren Namen für die Spalte? ZB enrolment_status? Danke für deinen Beitrag.
Bob Esponja

Zu # 4: Wenn es zusätzlich zu Ihrem klareren Namen nur zwei Zustände gibt, aktiv / inaktiv, warum machen Sie es dann nicht einfach zu einer Bit-Spalte?
Jacob G

3
Nicht einverstanden mit den GUIDs, schaudert. Sie können für die Leistung schrecklich sein. Verwenden Sie sie nur, wenn Sie replizieren müssen.
HLGEM

1
Die Leistung kommt nur ins Spiel, wenn Sie 10 Millionen Zeilen in einer Tabelle sprechen. Wenn Sie diese Art von Struktur haben, können Sie dies durch sequentielle Anleitungen und kreative Indizierung abmildern. Andernfalls ist "Leistung" ein roter Hering, wenn GUIDs abgezinst werden.
Jacob G

6

Es sieht so aus, als würden Sie mit einem guten Detaillierungsgrad entwerfen.

Ich denke, dass Länder und Unternehmen in Ihrem Design wirklich dieselbe Einheit sind wie Städte und Abteilungen. Ich würde die Länder- und Städte-Tabellen (und Cities_Has_Departments) entfernen und bei Bedarf ein Boolesches Flag IsPublicSector zur Unternehmenstabelle hinzufügen (oder eine CompanyType-Spalte, wenn es mehr Auswahlmöglichkeiten als nur Privatsektor / Öffentlicher Sektor gibt).

Ich denke auch, dass bei der Verwendung der Abteilungstabelle ein Fehler aufgetreten ist. Es sieht so aus, als ob die Tabelle "Abteilungen" als Referenz für die verschiedenen Arten von Abteilungen dient, die jede Kundenabteilung haben kann. Wenn ja, sollte es DepartmentTypes heißen. Aber Ihre Kunden (die vermutlich Teilnehmer sind) gehören nicht zu einem Abteilungs-TYP, sondern zu einer tatsächlichen Abteilungsinstanz in einem Unternehmen. So wie es jetzt aussieht, werden Sie wissen, dass ein bestimmter Kunde irgendwo zu einer Personalabteilung gehört, aber nicht zu welcher!

Mit anderen Worten, Clients sollten mit der Tabelle verknüpft sein, die Sie Divisions_Has_Departments nennen (die ich aber einfach Departments nennen würde). Wenn dies der Fall ist, müssen Sie Städte wie oben beschrieben in Abteilungen zusammenfassen, wenn Sie die standardmäßige referenzielle Integrität in der Datenbank verwenden möchten.


Die Ländertabelle gibt an, ob / wann wir Kunden haben, die in mehr als einem Land tätig sind und für jedes eine andere Personalabteilung haben. Auf diese Weise können wir Berichte mit Daten aus dem Land erstellen, in dem die Abteilung tätig ist, in der wir tätig sind. Ich denke, wir haben einen Kunden mit separaten Personalabteilungen. Für die beiden Städte, in denen sie Hauptbüros haben. Oder zumindest war das der Grund, ich werde mich hinsetzen und es überdenken, um zu sehen, ob sie wirklich notwendig sind. Hatte ich nicht an CompanyType gedacht, werde ich herausfinden, ob wir das verfolgen müssen.
Bob Esponja

RE: depts table, mein ursprünglicher Gedankengang war es, sie als tatsächliche Abteilungen zu verwenden, wobei der Abteilungsname der Typ ist. Es war mir nicht in den Sinn gekommen, nur Abteilungsarten zu haben, was logischer erscheint. Um zu wissen, zu welcher Abteilung und wo jemand gehört, hatte ich gedacht, dass es funktioniert hätte, wenn die Abteilung mit einer Stadt und einer Abteilung (die mit einem Unternehmen verbunden ist) verbunden wäre. Lag ich falsch? Für den Zusammenbruch von Städten in Divisionen erstrecken sich einige Divisionen über mehrere Städte, und ich denke, vielleicht sogar über Länder. Ich werde es noch einmal untersuchen. Danke für deinen Beitrag.
Bob Esponja

5

Übrigens, wenn Sie bereits CSVs generieren und diese in eine mySQL-Datenbank laden möchten, ist LOAD DATA LOCAL INFILE Ihr bester Freund: http://dev.mysql.com/doc/refman/5.1/ de / load-data.html . Mysqlimport ist ebenfalls einen Blick wert und ist ein Befehlszeilentool, das im Grunde genommen ein guter Wrapper für das Laden von Daten ist.


3

Die meisten Dinge wurden bereits gesagt, aber ich bin der Meinung, dass ich eines hinzufügen kann: Jüngere Entwickler sorgen sich häufig etwas zu sehr um die Leistung, und Ihre Frage zum Verbinden von Tabellen scheint in diese Richtung zu gehen. Dies ist ein Anti-Pattern für die Softwareentwicklung mit dem Namen " Vorzeitige Optimierung" ". Versuche diesen Reflex aus deinem Kopf zu verbannen :)

Noch etwas: Glauben Sie, dass Sie die Tabellen "Städte" und "Länder" wirklich brauchen? Würde es für Ihre Anwendungsfälle nicht ausreichen, eine Spalte "Stadt" und "Land" in der Abteilungstabelle zu haben? Muss Ihre Bewerbung beispielsweise Abteilungen nach Stadt und Stadt nach Land auflisten?


1
Versuchen Sie, wie ich könnte, es dauert immer weiter, berechnet große O von helloworld.c, optimiert Die Städte- und Ländertabellen haben sich einfach selbst erzeugt, als ich den Schritten folgte, um eine 3NF-Datenbank zu erhalten. Ich denke, der Vorteil, den sie bieten, ist die Kohärenz für Stadt- / Ländernamen. Zum Beispiel, wenn wir einen Kunden in München haben und aus irgendeinem Grund jeder, der einen neuen Studenten in das Planungssystem einführt, beschließt, ihn München anstelle von München zu nennen, wie bei den vorherigen Studenten. Außerdem müssen wir möglicherweise Abteilungen nach Stadt auflisten, ich muss das überprüfen. Vielen Dank.
Bob Esponja

2
Die Optimierung in der Entwurfsphase einer Datenbank ist entscheidend! Es ist keine vorzeitige Optimierung, da Datenbanken mit Millionen von Datensätzen erheblich schwieriger zu überarbeiten sind.
HLGEM

1
Ich habe nicht gesagt, dass er sein Design nicht einem Stresstest unterziehen soll :)
Hans Westerbeek

3

Folgende Kommentare basieren auf der Rolle als Business Intelligence / Reporting-Spezialist und Strategie- / Planungsmanager:

  1. Ich stimme der obigen Anweisung von Larry zu. IMHO, es ist nicht so sehr überarbeitet, manche Dinge sehen einfach ein wenig fehl am Platz aus. Um es einfach zu halten, würde ich den Kunden direkt mit einer Firmen-ID, einer Abteilungsbeschreibung, einer Abteilungsbeschreibung, einer Abteilungs-Typ-ID oder einer Abteilungs-Typ-ID versehen. Verwenden Sie die Abteilungstyp-ID und die Abteilungstyp-ID als Referenz für Nachschlagetabellen und interne Berichts- / Analysefelder, um eine langfristige Konsistenz zu gewährleisten.

  2. Die Packs-Tabelle enthält die Spalte "Credit". Sollte dies nicht tatsächlich mit der Client-Basistabelle verknüpft sein? Wenn also viele Packs vorhanden sind, können Sie sehen, wie viel Guthaben für zukünftige Klassen noch übrig ist. Die Anwendung kann sich um die Berechnung kümmern und diese zentral in der Client-Tabelle speichern.

  3. Unternehmensinformationen könnten viel mehr Felder verwenden, einschließlich der offensichtlichen Adresse / Telefon / etc. Information. Ich wäre auch bereit, D & B-Spalten "DUNs" (Site / Branch / Ultimate) langfristig hinzuzufügen. Dun und Bradstreet (D & B) haben einen riesigen Katalog von Unternehmen, und Sie werden später feststellen, dass ihre Informationen sehr hilfreich sind zur Berichterstattung / Analyse. Dadurch wird das von Ihnen erwähnte Problem der Mehrfachaufteilung behoben, und Sie können die Hierarchie für Unterabteilung / Abteilung / Zweige / usw. Aufrollen. von großen Korps.

  4. Sie erwähnen nicht, mit wie vielen Datensätzen Sie arbeiten werden, was bedeuten könnte, dass Sie sich auf eine große Entwicklungsinitiative einstellen, die mit vorgefertigter "Berichterstellungs" -Software schneller und mit weitaus weniger Kopfschmerzen hätte durchgeführt werden können. Wenn Sie nicht mit einer großen Datenbankzeile (<65000) arbeiten, stellen Sie sicher, dass MS-Access, OpenOffice (Base) oder verwandte Berichts- / App-Entwicklungslösungen den Trick nicht ausführen können. Ich benutze die kostenlose APEX-Software von Oracle ziemlich oft selbst. Sie wird mit der kostenlosen Datenbank Oracle XE geliefert. Laden Sie sie einfach von ihrer Website herunter.

  5. Zu Ihrer Information - Reporting Insight: Bei großen Datenbanken verfügen Sie normalerweise über zwei Datenbankinstanzen. A) Transaktionsdatenbank zum Aufzeichnen jedes detaillierten Datensatzes. b) Berichtsdatenbank (Data Mart / Data Warehouse) auf einem separaten Computer. Für weitere Informationen suchen Sie in Google nach Star Schema und Snowflake Schema.

Grüße.


1. Meinen Sie, alle diese Spalten zur Client-Tabelle hinzuzufügen? Ich denke, das würde die Normalisierung brechen und es auch schwierig machen, konsistent zu bleiben. Ich bin mir jedoch nicht sicher, ob ich das richtig verstanden habe. 2. Die Packs sind sequentiell. Nur für das neueste Pack kann ein Guthaben ausstehen, sodass nicht mehrere Packs nachverfolgt werden müssen. Würden Sie in diesem Fall trotzdem empfehlen, es in der Client-Tabelle zu speichern? 3. Dies scheint sehr hilfreich zu sein, um die Struktur der Kundenunternehmen herauszufinden. Ich werde mich darum kümmern, danke.
Bob Esponja

4. Ich muss die Anzahl der Clients und Sitzungen überprüfen, die wir im nächsten Jahr erwarten, aber es scheint mir machbar, dass die Sitzungstabelle so viele Zeilen in einem Jahr oder so erreicht. Ich werde mich mit Berichterstellungssoftware befassen, die mir nicht in den Sinn gekommen war. 5. Es scheint, dass dies die Situation ist, in die ich zufällig gekommen bin. Die Web-App wird unsere "Transaktionsdatenbank" und dieses Projekt unsere "Repoting-Datenbank" sein :) Vielen Dank für Ihre Eingabe.
Bob Esponja

1. Ja, Hinzufügen von Spalten "Firmen-ID, Abteilungsbeschreibung, Abteilungsbeschreibung, Abteilungs-Typ-ID, Abteilungs-Typ-ID" zur Client-Tabelle. Der Kunde gehört zu einem Unternehmen, einem bestimmten Abteilungs-Typ (IT / Ops / Admin / etc.) Innerhalb eines Unternehmens und einem bestimmten Abteilungs-Typ (Vertriebs- / HR- / Marketing-Geschäftsbereiche). 2. Ich denke nur, dass Kredit mit einem Kunden oder Unternehmen verbunden ist und nicht mit dem Sitzungspaket. Dies ist eine Geschäftsentscheidung, die Sie treffen können.
Will

Larry erwähnte auch die Kombination von Unternehmen und Land. Ich stimme vollkommen zu und gehe auf den Punkt bezüglich der D & B-Referenz zurück. Ich würde eine SiteID oder etwas Einzigartiges verwenden, um mehrere Standorte desselben Unternehmens zuzulassen, und dann die Abteilungen mit einer der eindeutigen SiteIDs verknüpfen.
Will

2

Ich möchte nur auf die Bedenken eingehen, dass das Verbinden mit mehreren Tabellen zu einem Leistungseinbruch führen wird. Haben Sie keine Angst, sich zu normalisieren, da Sie Joins durchführen müssen. Verknüpfungen sind normal und werden in relationalen Datenbanken erwartet. Sie sind so konzipiert, dass sie gut damit umgehen können. Sie müssen PK / FK-Beziehungen festlegen (für die Datenintegrität ist dies beim Entwerfen wichtig), aber in vielen Datenbanken werden FKs nicht automatisch indiziert. Da sie in den Joins verwendet werden, sollten Sie zunächst mit der Indizierung des FKS beginnen. PKs erhalten im Allgemeinen einen Index für die Erstellung, da sie eindeutig sein müssen. Zwar reduziert das Datawarehouse-Design die Anzahl der Verknüpfungen, aber normalerweise gelangt man erst dann zum Data Warehousing, wenn in einem Bericht Millionen von Datensätzen abgerufen werden müssen. Selbst dann beginnen fast alle Data Warehouses mit einer Transaktionsdatenbank, um die Daten in Echtzeit zu erfassen, und dann werden die Daten nach einem Zeitplan (nächtlich oder monatlich oder unabhängig von den geschäftlichen Anforderungen) in das Warehouse verschoben. Dies ist also ein guter Anfang, auch wenn Sie später ein Data Warehouse entwerfen müssen, um die Berichtsleistung zu verbessern.

Ich muss sagen, dass Ihr Design für einen CS-Studenten im ersten Jahr beeindruckend ist.


1

Es ist nicht überentwickelt, so würde ich das Problem angehen. Der Beitritt ist in Ordnung, es wird keinen großen Leistungseinbruch geben (dies ist unbedingt erforderlich, es sei denn, Sie de-normalisieren die Datenbank, was nicht empfohlen wird!). Überprüfen Sie für Status, ob Sie stattdessen einen Enum-Datentyp verwenden können, um diese Tabelle zu optimieren.


Aufzählungen sind böse. Jedes Mal, wenn Sie die Aufzählung erweitern müssen, müssen Sie Ihre Tabelle neu erstellen. Dies ist in Ordnung, bis Ihre Tabelle viele GB groß wird.
Martin

Vielen Dank für den Input und den Vorschlag, Chris. Ich hatte Angst, ein übermäßig komplexes Monster zu erschaffen. Martin, die Status sind ziemlich gut definiert und statisch: im Grunde 0-Vollständige Klasse, 1-Klasse annulliert, 2-Nicht aufgetaucht. Ich denke, diese drei decken jedes mögliche Ergebnis einer Klasse ab. Ist es in diesem Fall immer noch eine schlechte Idee, Aufzählungen zu verwenden?
Bob Esponja

Dies scheint mir perfekt für eine Aufzählung zu sein. Alle möglichen Ergebnisse sind im Voraus zufrieden. Ein int ist auch in Ordnung, das Sie durch eine Aufzählung oder statische Ints in Ihrer App darstellen können. Ist nicht wirklich wichtig :) Aufzählungen sind schöner anzusehen, wenn Sie Ihre Datenbank mit einem Tool bearbeiten.
Chris Dennett

Aufzählungen können problematisch sein (vielleicht ist das Böse ein zu starkes Wort), wenn Sie große Tabellen haben, die rund um die Uhr online sein müssen und die Aufzählung geändert werden muss. Wenn Sie die Tabellen von Grund auf neu füllen, machen Sie sich darüber keine Sorgen. Bei einem ausreichend kleinen Datensatz können Sie auch einfach Zeichenfolgen verwenden.
Martin

1

Ich habe im Bereich Training / Schule gearbeitet und dachte, ich würde darauf hinweisen, dass es im Allgemeinen eine M: 1-Beziehung zwischen dem gibt, was Sie "Sitzungen" (Instanzen eines bestimmten Kurses) nennen, und dem Kurs selbst. Mit anderen Worten, Ihr Katalog bietet den Kurs an ("Spanisch 101" oder was auch immer), aber Sie haben möglicherweise zwei verschiedene Instanzen davon während eines einzelnen Semesters (Tu-Th unterrichtet von Smith, Mi-Fr unterrichtet von Jones).

Davon abgesehen sieht es nach einem guten Start aus. Ich wette, Sie werden feststellen, dass die Clientdomäne (Diagramme, die zu "Clients" führen) komplexer ist als Sie modelliert haben, aber gehen Sie damit nicht über Bord, bis Sie einige echte Daten haben, die Sie leiten.


Wenn ich dich richtig verstanden habe, ist das nicht ganz der Fall. Die "Kurse" sind nur Gruppen nachfolgender Sitzungen. Es ist kein traditionelles semesterbasiertes System. Ich kann mir nichts anderes vorstellen, das der Client-Domain hinzugefügt werden könnte. Haben Sie ein Beispiel? Ich hatte auch Angst, dass ich mit der Komplexität bereits über Bord gegangen war, froh, dass dies nicht der Fall ist :) Vielen Dank für Ihre Eingabe.
Bob Esponja

0

Ein paar Dinge kamen mir in den Sinn:

  1. Die Tische schienen auf Berichterstattung ausgerichtet zu sein, führten aber das Geschäft nicht wirklich. Ich würde denken, wenn sich ein Kunde anmeldet, wird im Wesentlichen eine Bestellung für den Kunden aufgegeben, der an einer Liste von Sitzungen teilnimmt, und diese Bestellung kann für mehrere Mitarbeiter in einem Unternehmen gelten. Es scheint, dass eine "Auftragstabelle" wirklich im Zentrum Ihres Systems steht und Ihre Datenerfassung und eventuelle Berichterstellung vorantreibt. (Vergleichen Sie die Papierdokumente, mit denen Sie das Geschäft betrieben haben, mit Ihrem Datenbankdesign, um festzustellen, ob eine logische Übereinstimmung vorliegt.)

  2. Unternehmen haben oft keine Abteilungen. Mitarbeiter wechseln manchmal Abteilungen / Abteilungen, vielleicht sogar während der Sitzung. Unternehmen fügen manchmal Abteilungen / Abteilungen hinzu / löschen / umbenennen. Stellen Sie sicher, dass die mögliche Änderung der Inhalte Ihrer Tabellen in Echtzeit die spätere Berichterstellung / Gruppierung nicht erschwert. Bei so vielen Kontaktdaten, die auf so viele Tabellen verteilt sind, müssen Sie möglicherweise eine sehr strenge Validierung der Dateneingabe erzwingen, um Ihre Berichte aussagekräftig und umfassend zu halten. Wenn beispielsweise ein neuer Kunde hinzugefügt wird, stellen Sie sicher, dass sein Unternehmen / seine Abteilung / Abteilung / Stadt den gleichen Werten entspricht wie seine Mitarbeiter.

  3. Das "Packs" -Konzept ist überhaupt nicht klar.

  4. Da Sie angeben, dass es sich um ein kleines Unternehmen handelt, wäre es angesichts der Geschwindigkeit und Kapazität der aktuellen Maschinen überraschend, wenn die Leistung ein Problem darstellen würde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.