1

私は今学期に DBMS コースを受講しており、良い進歩を遂げ、良い考え方を実践していることを確認したいと思っています。クエリを処理するための私自身のアプローチは、分割統治のようなものです。クエリをサブクエリに分割し、それらをビューにします。これらのビューを使用して必要な情報を収集するだけですが、一般的には良いアプローチですか?

代替手段は何ですか?

あなた自身のアプローチは何ですか?それが私のものよりも優れていると思うなら、なぜですか?

例 :

GIVEN : DB : http://sqlfiddle.com/#!2/cdd98/1

(Q7) 保険会社に関連するすべての整形外科医 (専門) を訪れた患者を検索します。

.

CREATE VIEW Orthos AS
SELECT  d.cid,d.did
FROM Doctors d
WHERE d.speciality='Orthopedist';

CREATE VIEW OrthosPerInc AS
SELECT  o.cid, COUNT(o.did) as countd4i
FROM Orthos o
GROUP BY o.cid;

CREATE VIEW OrthoVisitsPerPat AS
SELECT v.pid,COUNT(o.did) as countv4d
FROM Orthos o,Visits v,Doctors d
WHERE o.did=v.did and d.did=o.did
GROUP BY v.pid,d.cid;

SELECT  p.pname,p.pid,p.cid
FROM  OrthoVisitsPerPat v, OrthosPerInc i,Patient p
WHERE i.countd4i = v.countv4d and p.pid=v.pid and p.cid=i.cid
4

2 に答える 2

1

これにはビューを使用せず、派生テーブル、一時テーブル、または CTES を使用してください。ビューはデータベース内の永続的なオブジェクトであり、特に他のビューを呼び出すビューを書き始めると、ビューの使いすぎが深刻な問題になります。ビューが良いものであると誤解された開発者がシステムを非常に遅くし、データが読み込まれると使用できなくなったため、数百万ドルのクライアントをほとんど失いました。初心者は決してビューを書く必要はありません。

実際の結合の使い方を学びましょう - そうすれば、はるかに有利になります。

ただし、はい、複雑なものをチャンクに分割しても問題ありません。ビューを使用してそれを行わないでください。

暗黙の結合は非常に悪い手法であり、20 年も前のものであり、2012 年に使用する言い訳はありません。二度と使用しないことを約束してください。下手なテクニックを学ぶのではなく、正しいテクニックを学びましょう。

私は次のようなことをしたでしょう(テストされていません):

SELECT  MDByPatient.pname,MDByPatient.pid,MDByPatient.cid
FROM 
    (
    SELECT   p.pname,p.pid,p.cid, count(v.did) as CountMDByPatient
    FROM  Patient p  
    INNER JOIN (SELECT DISTINCT v.pid, v.did FROM Visits) v
        ON p.pid = v.pid
    INNER JOIN Doctors d 
        ON d.did = v.did and p.cid = d.cid
    WHERE d.speciality='Orthopedist' 
    GROUP BY p.pname,p.pid,p.cid
    ) MDByPatient
INNER JOIN 
    (
    SELECT cid, count(did)as CountMDByIns
    FROM Doctors 
    WHERE d.speciality='Orthopedist' 
    GROUP BY cid
    ) MDByInsurance
        ON  MDByPatient.cid = MDByInsurance.cid
where MDByPatient.CountMDByPatient = MDByInsurance.CountMDByIns

1 つは保険会社ごとに整形外科医の数を取得するためのもので、もう 1 つは保険会社および訪問した人ごとに整形外科医の数を取得するためのものです。さらに、「SELECT DISTINCT v.pid, v.did FROM Visits」を実行します。これは、同じ人を複数回訪問したために医師の数が不正確になるのを防ぐためです。

于 2012-05-01T18:57:15.360 に答える
1

これは実際にはデータベースに依存します。一部のデータベース (MySQL など) は、ビューを使用するクエリの最適化が苦手です。他はそれほど悪くありません。

ただし、クエリを細かく分割してから、それらをより複雑なクエリに結合するという戦略は優れています。私は (一般的に) パーツを組み合わせた 1 つの大きなクエリを作成するだけです。

于 2012-05-01T17:15:02.943 に答える