配列に主キーのリストがあり、それらに基づいてクエリを実行するとパフォーマンスが低下する

mysql php
配列に主キーのリストがあり、それらに基づいてクエリを実行するとパフォーマンスが低下する

私のアプリケーションには、ジョブテーブルがあります。 jobsテーブルには2つのフィールドがあります

  1. A

  2. コンマ区切りリスト(1,5,6,3)を持つB

特定のページで私はする必要があります

show records where A=2 and B=$pageid (which will be any one id)

だから私がやったことは、条件でテーブルを事前にクエリし、条件を満たしているジョブIDのリストで配列を作成し、それらのIDに基づいて特定のレコードをクエリすることです。

$jobs = $this->db->get("job_postings");
        foreach($jobs->result_array() as $job)
        {
            $univArr = explode(",",$job["job_university"]);
            if((in_array($univid,$univArr)) or ($job["job_post_to"]==2)) {
                $jobArr[] = $job["id"];
            }
        }
      return $jobArr;

しかし、これは正しい方法ではないと感じています。 それを行うより良い方法はありますか。

  1  0


ベストアンサー

ここでの問題は、値のリストが単一のコンマ区切りフィールドに格納されることです。 適切な3NFスキーマがあれば、大学のIDから投稿IDに移行するマッピングテーブルがあり、次のようなクエリを使用できます。

SELECT * FROM job_postings, universities, university_to_job WHERE
job_postings.job_post_to=2 AND
university_to_job.job_id=job_postings.job_id AND
university_to_job.university_id=universities.university_id AND
universities.name="Juliard College"

これにより、Juliard Collegeのすべての求人が選択され、大学IDの任意のセットに拡張できます。

現状では、SQLサーバー上のストアドプロシージャがコンマ区切りの「job_university」列にフィールドIDの分割リストを返すことでこれを行うことができますが、適切なマッピングテーブルを使用するようにデータベーススキーマを変更することを強くお勧めします。

詳細を説明すると、現在、「job_university」列に「3,5,8」のようなものを含めることができます。これは、ID 3、5、および8の大学に求人が適用されることを示しています。 これを構築する正しい関係代数の方法は、一意の求人ID(チェック)、一意の大学ID(チェック)、そして次のようなテーブルを持つことです。

job_posting_id, university_id
1             , 3
1             , 5
1             , 8

この表は、求人番号1を大学3、5、および8にマップします。

このマッピングテーブルを取得したら、JOINステートメント(上記の暗黙的なステートメントを使用)を使用して、特定の大学に関連付けられている求人または特定の求人に関連付けられている大学のみを選択できます。

各ジョブが1つまたは複数の大学に関連付けられている可能性があり、1つまたは複数のジョブを持つ各大学が「多対多の関係」であるこの種の状況の魔法の言葉。 そのため、マッピングテーブルが必要です。各サイドは1つまたは複数の他のサイドに関連付けられている可能性があり、大学や仕事に関するすべての情報を複数回保存する必要はありません。

データベースの構築についてもう少し学ぶために、次のWebサイトを強くお勧めします。

2


どのデータベースフレームワークを使用していますか? `$ this→ db→ get(” job postss “);`はすべてのレコードを取得するようですが、これはあなたが望むものではありません。 「get」に「Where」句を追加できますか?

0


タイトルとURLをコピーしました