0

私はmysqlを使ったばかりで、一種の複雑なデータベースを作成しようとしていて、助けが必要です。

私のデータベース構造

 Tables(columns)

 1.patients (Id,name,dob,etc....)
 2.visits (Id,doctor,clinic,Patient_id,etc....)
 3.prescription (Id,visit_id,drug_name,dose,tdi,etc....)
 4.payments (id,doctor_id,clinic_id,patient_id,amount,etc...) etc..

私は約 9 つのテーブルを持っています。それらのすべての主キーは「id」で、autoinc に設定されています。

私は自分のデータベースでリレーションを使用していません (私はそれがより良いかどうかわかりません!そして、私は mysql に本当に深く入ったことはありませんでした.詳細情報/ストアなどを取得するには..)

例: 患者の 1 人に与えたすべての薬を表示したい場合、たとえば、患者の ID は :100 です。

1-click patient name (name link generated from (tbl:patients,column:id))
2-search tbl visits WHERE patient_id=='100' ; ---> that return all his visits ($x array)
3-loop prescription tbl searching for drugs with matching visit_id with $x (loop array).
4- return all rows found.

私のデータベースがますます拡大するにつれて(訪問テーブルの1k +レコード)、1人の患者が40を超える訪問を持つことができます。つまり、処方テーブルに40回ループして、以前の処方箋をすべて取得します。

だから私は小さなチークを思いついたので、私のデータベースを編集して、患者IDと訪問_IDがほぼすべてのテーブルの列になるようにして、ステップ2と3を1つのステップにスキップできるようにしました(処方箋tblを検索して患者ID = 100)、しかしそれは私を残しました私のデータベースには非常に多くの重複があり、それを行うのはちょっとばかげていると感じます!!

リレーショナル データベースの使用を検討する必要がありますか?

もしそうなら、これが私の人生をどのように楽にするかを誰かが少し説明できますか?

この再設計を行うことができますが、現在のテーブルを変更するか、すべてのテーブルを再作成する必要がありますか?

どうもありがとうございます

4

1 に答える 1

1

はい、MySQLのリレーショナルデータベース機能を活用する必要があります。このプロジェクトがスケールアップするにつれて、彼らはあなたの人生をはるかに楽にしてくれるでしょう。

実際、あなたはすでにそれらをうまく使っています。たとえば、患者が0回以上訪問する可能性があることを発見しました。ここで行う必要があるのはJOIN、MySQLへのクエリの使用方法を学ぶことです。

JOINの使用方法を理解したら、いくつかの外部キーやその他のデータベース制約を宣言することをお勧めします。しかし、システムはそれらがなくても問題なく動作します。

ほぼすべてのテーブルにpatient_idとvisit_idの両方を含めることにより、データベースを非正規化することをすでに決定しています。非正規化とは、さまざまなテーブルに形式的に冗長なデータを追加することです。これは通常、パフォーマンス上の理由で行われます。これは、システムがスケールアップするときに賢明な決定である場合とそうでない場合があります。しかし、私はあなたが選んだ非正規化の必要性についてのあなたの本能を信頼できると思います。「データベースの正規化」を読んで、背景を理解してください。

ちょっとしたアドバイス:単に「id」という名前の列は使用しないでください。すべてのテーブルで列に同じ名前を付けます。たとえば、patients.patient_id、visits.patient_idなどを使用します。これは、データベース内の関係を理解するのに役立つ自動化されたソフトウェアエンジニアリングツールがたくさんあるためです。ID列に一貫した名前が付けられている場合、これらのツールの方がうまく機能します。

したがって、1つのJOINクエリを使用して、質問の2と3の番号のステップを実行する方法の例を次に示します。

           SELECT p.patient_id p.name, v.visit_id, rx.drug_name, rx.drug_dose
            FROM patients     AS p
       LEFT JOIN visits       AS v    ON p.patient_id = v.patient_id
       LEFT JOIN prescription AS rx   ON v.visit_id = rx.visit_id
           WHERE p.patient_id = '100'
        ORDER BY p.patient_id, v.visit_id, rx.prescription_id

すべてのSQLクエリと同様に、これは行と列の仮想テーブルを返します。この場合、仮想テーブルの各行には、患者、訪問、および薬剤のデータが含まれています。LEFT JOINこの例で使用しました。つまり、訪問のない患者には、NULLデータを含む行があります。MySQLを指定するJOINと、それらの患者は仮想テーブルから除外されます。

于 2012-12-01T15:49:06.993 に答える