2016-09-06 2 views
1

私はPHP(Codeigniter/MySQL)を使用してアプリケーションを作成しており、アプリケーション内には組織があります。組織の複数の場所のデータベース構造

各組織は、(私はこれらの領域を呼んでいる)、複数の場所、地域、部署などを持つことができ

各エリアには、管理者があり、時々私は、より高い領域に物事をエスカレートする必要があります。

私は現在、1つのテーブル内のすべてのデータを持っている、と私はparent_area_idを使用し、親を決定するためにarea_levelています、子供など

しかし、私は、これは非常に非効率的であると思うし、私が指摘してきました閉鎖ループに向かって、私はそれについて知りません。

ここでデータベーステーブルは、このokです。これは効率的であるか、より良い方法ですか?

+----------------+-------------+------+-----+---------+----------------+ 
| 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:

(これが使用されているかをよりよく説明)

1)エリアは、唯一のビジネスの顧客に関連しています。

2)地域は、顧客が持つ可能性のある異なる地域(地域、地域、部署)です。 (南地域、オックスフォード事務所、口座部)。

3)各エリアには、多くの従業員が割り当てられている場合があります。

SO

私は例えば地域管理者を持っていた場合、彼らは彼らの下に、以下の分野を持っているかもしれません。例えば:

  • 南地域
    • オックスフォードオフィス
      • 販売部署
      • アカウント部門
    • ロンドン事務所
      • 私は、地域管理者の下ですべての従業員のuser_idは年代を取得したい場合は
      • 計画

SO

マーケティング、上記のdを使ってデータベース構造体を作成するには、次のようにする必要があります。

1)dbを照会して、地域管理者のparent_area_idを持つすべてのarea_idを取得します。各返さAREA_IDて

2)ループ、およびDBを照会し、返されたのparent_area_idを持つすべてのAREA_IDさんは

3をAREA_ID取得)我々は一番下のレベルに

を取得するまで返さAREA_ID年代をループし続けます4)にループは非常に効率的なようではありません返されたレコードSO

上記のすべてのAREA_IDを持つすべてのuser_idは年代を取得するには、DBを照会し、複数のSQLクエリやプログラミングを必要とします地域マネージャーに関連付けられているユーザーのリストを取得します。

それが最も効率的なやり方であれば、私は納得していないと思います。もっと簡単な方法が必要でしょうか?

+2

これはどのようにして 'INT(12)'列になりましたか?デフォルトの 'INT'は' INT(11) 'です。また、 'parent_area_id'の' INT(8) 'についても言います。非常に魅力的な理由がない限り、普通の 'INT'を試してみてください。これらの小さな違いは大きな問題を引き起こす可能性があります。 – tadman

+0

ありがとう@tadman正式には – frobak

+0

も注目に値する:ほとんどの '_id'型フィールドは、関連があるかのように有用なインデックスを必要とし、照会する可能性が高く、照会する必要がある場合はそれを実行したい。 – tadman

答えて

2

一度に1レベルずつエスカレーションする状況に対処する場合は、ここで重大な問題はありません。私は「クロージャーループ」がここではどのように因果関係になるのか、まったく考えていません。それはプログラミングに関するもので、データベースのスキーマに関するものではなく、主に個人的な好みの問題です。

デザインのZero, One or Infinity Ruleに違反していない限り、大丈夫です。あなたの複数のアドレス欄は、複数の行のテキストを受け入れる単一のフィールドとしてよりよく表現される可能性がありますが、多くのデータベースが伝統的に任意の通りの住所をどのように表しているかを示しています。

+0

私は上記の質問を編集しました。 – frobak

+0

あなたの質問の範囲はすでにかなり広範囲でしたが、この新しい編集は不合理に開いてしまいます解釈する。あなたは何かを試して、あなたが遭遇した問題を見なければならないでしょう。また、うまく設計されたスキーマで実行する必要があるクエリの数を大幅に減らすことができるので、 'JOIN'の仕組みについてもっと学ぶ必要があるように思えます。 – tadman

関連する問題