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
- Oxford Büro
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?
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
Danke @tadman ordnungsgemäß notiert – frobak
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