1

私は検査情報システム(LIS)を設計していますが、さまざまな検査用のテーブルを設計する方法について混乱しています。複数の値を持つ属性を持つテーブルをどのように処理する必要がありますか?また、その属性の複数の値のそれぞれが複数の値を持つこともできますか?

これが私のLISデザインのデータの一部です...

    HEMATOLOGY  <-------- Lab group
    **************************************************************
     CBC        <-------- Sub group 1
       RBC      <-------- Component
       WBC
       Hemoglobin
       Hematocrit
       MCV
       MCH
       MCHC
       Platelet count
     Hemoglobin
     Hematocrit
     WBC differential
       Neutrophils
       Lymphocytes
       Monocytes
       Eosinophils
       Basophils
     Platelet count
     Reticulocyte count
     ESR
     Bleeding time
     Clotting time
     Pro-time
     Peripheral smear
     Malarial smear
     ABO
     RH typing

    CLINICAL MICROSCOPY       <-------- Lab Group
    **************************************************************
     Routine urinalysis       <-------- Sub group 1
       Visual Examination     <-------- Sub group 2
         Color                <-------- Component
         Turbidity
         Specific Gravity       
       Chemical Examination
         pH
         protein
         glucose
         ketones
         RBC
         Hbg
         bilirubin
         specific gravitiy
         nitrite for bacteria
         urobilinogen
         leukocyte esterase 
       Microscopic Examination
         Red Blood Cells (RBCs)
         White Blood Cells (WBCs)
         Epithelial Cells 
         Microorganisms (bacteria, trichomonads, yeast) 
         Trichomonads 
         Casts 
         Crystals
     Occult Blood
     Pregnancy Test 

...このデータの階層は、私の設計の他のラボグループ(血液化学、血清学など)でも繰り返されます...

もう1つの質問は、1つ以上のラボグループのメンバーになることができるコンポーネント(RBCなど)をどのように処理するかということです。

ラボグループ用に1つ、サブグループ1用に1つ、サブグループ2用に1つ、コンポーネント用に1つ、個別のテーブルを作成することで、問題の解決策をすでに実装しました。次に、このテーブルにそれぞれの外部キーを配置することにより、それらすべてを統合する別のテーブルを作成しました...唯一のトレードオフは、このテーブルの一部の行にnull値が含まれる可能性があることです。私は自分のデザインに満足していないので、誰かがそれを正しくする方法についてアドバイスをくれることを望んでいます。どんな助けでも大歓迎です。

4

2 に答える 2

2

ここにいくつかのオプションがあります:

モデリングしているのが上の階層だけで、他のデータが含まれていない場合は、次の2つのテーブルで実行できます。

2つのテーブルモデル

これに関する1つの問題は、たとえば、asub_groupがの子である必要がある、またはaがまたはのいずれかの子でlab_groupある必要があることを強制しないことですが、代わりにアプリケーション層でこれらの要件を強制することができます。componentsub_group_1sub_group_2

このアプローチのプラス面は、スキーマが素晴らしくシンプルであることです。エンティティに関連付けられているデータが多い場合でも、このように階層をモデル化し、エンティティ自体に個別のテーブルを用意する価値がある場合があります。

データレベルで正しい関係を適用する場合は、それを個別のテーブルに分割する必要があります。多分このようなもの:

複数のテーブル

sub_group_1これは、それぞれが単一のにのみ関連していることを前提としていlab_groupます。そうでない場合は、との間にリンクテーブルを追加しlab_groupますsub_group_1sub_group_1->sub_group_2関係についても同様です。

ととの間には単一のリンクテーブルがcomponentあります。これにより、単一のエンティティを複数のエンティティに関連付けることができます。単一のテーブルであるという事実は、(質問で述べたように)多くのレコードが存在することを意味します。nullが2つの別々のリンクテーブルを持つのを防ぐことができます。sub_group_1sub_group_2componentsub_group_1sub_group_2sub_group_1_idsub_group_2_idnull

  • sub_group_1_componentへの外部キーとへsub_group_1の外部キーcomponent
  • sub_group_2_componentへの外部キーとへsub_group_2の外部キーcomponent

componentこれを図に入れなかった理由は、私にとって、すべての->sub_group関係を取得するために、1つではなく2つのテーブルをクエリする必要があるためです。少し非正規化するために(いくつかを許可するnulls)、単一のテーブルをクエリする方がはるかに簡単です。多くのnullsを許可していることに気付いた場合(ここにあるすべてのエンティティ間の関係の単一のリンクテーブルなど)、それはおそらく非正規化が多すぎます。

于 2012-08-18T08:18:02.543 に答える
1

個人的には、値の関係を使用して3つのテーブルを作成します。それはあなたに値の無制限の配列を作成する能力を与えます。優れた列名を付けるようにしてください。そうしないと、頭が何日も回転します。:)

また、null値は問題ではありません。すべての異なるタイプの結合を調べてください。

于 2012-08-18T02:19:56.037 に答える