2016-09-06 2 views
1

Ich erstelle eine Anwendung mit PHP (Codeigniter/MySQL) und innerhalb der Anwendung sind Organisationen.Datenbankstruktur für mehrere Standorte einer Organisation

Jede Organisation kann mehrere Standorte, Regionen, Abteilungen, etc. (I diese Bereiche bin Aufruf)

Jeder Bereich einen Administrator hat, und manchmal werde ich die Dinge auf einen höheren Bereich eskalieren müssen.

ich zur Zeit bekam die Daten in 1 Tabelle alle haben, und ich bin mit einem parent_area_id und area_level die Eltern, um zu bestimmen, Kinder usw.

Aber ich denke, das ist sehr ineffizient ist, und ich habe darauf hingewiesen worden in Richtung auf Schleifen, von denen ich keine Ahnung habe.

Hier die Datenbanktabelle, ist das ok, wird es effizient sein oder gibt es einen besseren Weg, es zu tun?

+----------------+-------------+------+-----+---------+----------------+ 
| Field   | Type  | Null | Key | Default | Extra   | 
+----------------+-------------+------+-----+---------+----------------+ 
| area_id  | int(12)  | NO | PRI | NULL | auto_increment | 
| area_title  | varchar(40) | NO |  | NULL |    | 
| area_name  | varchar(40) | NO |  | NULL |    | 
| address1  | varchar(40) | YES |  | NULL |    | 
| address2  | varchar(40) | YES |  | NULL |    | 
| address3  | varchar(40) | YES |  | NULL |    | 
| town   | varchar(20) | YES |  | NULL |    | 
| county   | varchar(20) | YES |  | NULL |    | 
| post_code  | varchar(10) | YES |  | NULL |    | 
| has_ra   | varchar(1) | YES |  | 0  |    | 
| org_id   | int(12)  | NO | MUL | NULL |    | 
| parent_area_id | int(8)  | YES |  | NULL |    | 
| area_level  | int(1)  | YES |  | NULL |    | 
+----------------+-------------+------+-----+---------+----------------+ 

EDIT:

(bessere Erklärung dafür, wie diese verwendet wird)

1) Bereiche für die Kunden des Unternehmens beziehen sich nur.

2) Die Bereiche sind unterschiedliche Bereiche (Region, Standort, Abteilung), die ein Kunde haben könnte. (South Region, Oxford Office, Buchhaltung).

3) Jedem Bereich können viele Mitarbeiter zugewiesen sein.

SO

Wenn ich einen regionalen Administrator zum Beispiel hatte, könnten sie die folgenden Bereiche unter ihnen haben: zB:

  • South Region
    • Oxford Büro
      • Vertrieb Abteilung
      • Buchhaltung
    • London Büro
      • Marketing-
      • Planung

SO

Wenn ich die user_id die alle Mitarbeiter im Rahmen des regionalen Administrator erhalten wollte, mit dem oben genannten d Atabase-Struktur, ich müsste:

1) Abfrage der db, um alle Area_IDs, die eine parent_area_id des regionalen Administrator haben.

2) Schleife durch jede zurück area_id, und die DB-Abfrage und alle area_id die erhalten, die eine parent_area_id des zurück haben area_id

3) Weiter geht es durch zurück area_id der Looping, bis wir auf der untersten Ebene

erhalten 4) Abfrage der db alle user_id des erhalten, die eine area_id aller oben zurückgegebenen Datensätze haben

SO

das ist nicht sehr effizient scheint, und muss mehrere SQL-Abfragen und Programmierung Schleifen eine Liste von Benutzern abrufen, die einem Regionsmanager zugeordnet sind

Wenn das der effizienteste Weg ist, dann ist es in Ordnung, ich bin einfach nicht überzeugt, und ich bin mir sicher, dass es einen einfacheren Weg geben muss?

+2

Wie endete das mit einer 'INT (12)' Spalte? Der Standard 'INT' ist' INT (11) '. Auch bezüglich: der 'INT (8)' für 'parent_area_id'. Versuchen Sie es mit dem einfachen alten 'INT', es sei denn, Sie haben einen äußerst zwingenden Grund, dies nicht zu tun. Diese kleinen Unterschiede können zu großen Problemen führen. – tadman

+0

Danke @tadman ordnungsgemäß notiert – frobak

+0

Auch erwähnenswert: Die meisten '_id' Typ Felder erfordern einen Index, um nützlich zu sein, als ob dort eine Assoziation ist es wahrscheinlich abgefragt werden, und wenn es abgefragt werden soll, wollen Sie es performant. – tadman

Antwort

2

Es gibt kein ernsthaftes Problem, wenn Sie mit einer Situation zu tun haben, in der Sie eine Stufe nach der anderen eskalieren. Ich habe keine Ahnung, wie "Closing Loops" hier eingreifen würden, das ist programmierbezogen, nicht ein Datenbankschema, und ist weitgehend eine Frage der persönlichen Präferenz.

Solange Sie nicht die des Designs verletzen, sollten Sie in Ordnung sein. Ihre Felder mit mehreren Adressen gehen hier über die Linie, die besser als ein einzelnes Feld dargestellt werden könnte, das mehrere Textzeilen akzeptiert, aber das ist auch, wie viele Datenbanken traditionell willkürliche Straßenadressen darstellen.

+0

Ich habe die obige Frage mit mehr Daten zur Verwendung bearbeitet – frobak

+0

Der Umfang Ihrer Frage war bereits ziemlich breit, aber diese neue Bearbeitung macht es unangemessen offen zur Interpretation. Sie müssen etwas ausprobieren und sehen, auf welche Probleme Sie stoßen. Es klingt auch so, als müssten Sie mehr darüber lernen, wie ein 'JOIN' funktioniert, da dies die Anzahl der Abfragen, die Sie in einem gut gestalteten Schema ausführen müssen, drastisch reduzieren kann. – tadman