0

私は次のものを持っています: 1.患者データを保存
するテーブル「患者」 。2.各患者に対して行った検査のデータを保存
するテーブル「tests」 。

「tests_1」「tests_2 」の2種類のテストがあるため、問題が発生します。 特定の患者に対して行われた各テストについて、テストのタイプとIDを保存します。

CREATE TABLE IF NOT EXISTS patients
(
    id_patient   INTEGER PRIMARY KEY,
    name_patient VARCHAR(30) NOT NULL,
    sex_patient VARCHAR(6) NOT NULL,
    date_patient DATE
);

INSERT INTO patients values 
(1,'Joe',  'Male'  ,'2000-01-23');
INSERT INTO patients values 
(2,'Marge','Female','1950-11-25');
INSERT INTO patients values 
(3,'Diana','Female','1985-08-13');
INSERT INTO patients values 
(4,'Laura','Female','1984-12-29');

CREATE TABLE IF NOT EXISTS tests
(
    id_test         INTEGER PRIMARY KEY,
    id_patient      INTEGER,
    type_test       VARCHAR(15) NOT NULL,
    id_type_test    INTEGER,
    date_test   DATE,
    FOREIGN KEY (id_patient) REFERENCES patients(id_patient)
);
INSERT INTO tests values
(1,4,'test_1',10,'2004-05-29');
INSERT INTO tests values
(2,4,'test_2',45,'2005-01-29');
INSERT INTO tests values
(3,4,'test_2',55,'2006-04-12');


CREATE TABLE IF NOT EXISTS tests_1
(
    id_test_1  INTEGER PRIMARY KEY,
    id_patient INTEGER,
    data1         REAL,
    data2         REAL,
    data3         REAL,
    data4         REAL,
    data5         REAL,
    FOREIGN KEY (id_patient) REFERENCES patients(id_patient)
);
INSERT INTO tests_1 values
(10,4,100.7,1.8,10.89,20.04,5.29);

CREATE TABLE IF NOT EXISTS tests_2
(
    id_test_2   INTEGER PRIMARY KEY,
    id_patient INTEGER,
    data1         REAL,
    data2         REAL,
    data3         REAL,
    FOREIGN KEY (id_patient) REFERENCES patients(id_patient)

);
INSERT INTO tests_2 values
(45,4,10.07,18.9,1.8);
INSERT INTO tests_2 values
(55,4,17.6,1.8,18.89);

今、このアプローチは冗長であるか、良くないと思います...

だから私は次のようなクエリを改善したいと思います

select * from tests WHERE id_patient=4;
select * from tests_1 WHERE id_patient=4;
select * from tests_2 WHERE id_patient=4;

より良いアプローチはありますか?

この例では、 id=4の患者に対して、タイプtests_1の 1 つのテストとタイプtests_2の 2 つのテストがあります。

ここにフィドルがあります

4

3 に答える 3

3

テーブルを追加し、それをテーブル内のフィールドtesttype (id_test,name_test)への FK として使用します。とに別々のテーブルを作成しないでくださいid_type_testteststest_1test_2

于 2013-08-05T21:02:05.083 に答える
1

それは要件に依存します

OLTPの場合、次のようなことをします

スタッフ:

ID | FORENAME | SURNAME | DATE_OF_BIRTH | JOB_TITLE   | ... 
-------------------------------------------------------------
 1 | harry    | potter  | 2001-01-01    | consultant  | ...
 2 | ron      | weasley | 2001-02-01    | pathologist | ...

忍耐強い:

ID | FORENAME | SURNAME | DATE_OF_BIRTH | ...
-----------------------------------------------
 1 | hermiony | granger | 2013-01-01    | ...

TEST_TYPE:

 ID | CATEGORY    | NAME | DESCRIPTION           | ...
--------------------------------------------------------
  1 | haematology | abg  | arterial blood gasses | ...

リクエスト:

ID | TEST_TYPE_ID | PATIENT_ID | DATE_REQUESTED | REQUESTED_BY | ...
----------------------------------------------------------------------
 1 | 1            | 1          | 2013-01-02     | 1            | ...

RESULT_TYPE:

ID | TEST_TYPE_ID | NAME | UNIT | ...
---------------------------------------
 1 | 1            | co2  | kPa  | ...
 2 | 1            | o2   | kPa  | ...

結果:

ID | REQUEST_ID | RESULT_TYPE_ID | DATE_RESULTED | RESULTED_BY | RESULT | ...
-------------------------------------------------------------------------------
 1 | 1          | 1              | 2013-01-02    | 2           | 5      | ...
 2 | 1          | 2              | 2013-01-02    | 2           | 5      | ...

上記に関して私が懸念しているのunitは、テスト結果であり、これらは時々(頻繁ではありませんが)変更される可能性があります。unitun を結果テーブルに配置する方がよい場合があります。

また、これらを主要なテスト カテゴリに分類することも検討してください。私の理解では、組織病理学と X 線は、血液学と微生物学のように同じような結果にはなりません。

OLAP の場合、リクエストと結果を 1 つのテーブルに結合して、 などの派生列を追加し、からREQUEST_TO_RESULT_MINS1 つのディメンションを作成します。RESULT_TYPETEST_TYPE

于 2013-08-05T21:52:05.440 に答える
1

これはいくつかの方法で行うことができます。対処する必要があるさまざまなタイプのケースをすべて知らなくても。

最も単純なのは5つのテーブルです

  • 患者(あなたが説明したように)
  • テスト(あなたが説明したように)
  • TestType (Declan_K のように)
  • テスト結果コード
  • 試験結果

TestRsultCode は、テストごとに格納される各値を記述します。TestResults は、テストごとに任意の数のテスト結果を格納できるピボット テーブルです。

Create table TestResultCode
(
  idTestResultCode int
, Code varchar(10)
, Description varchar(200)
, DataType int -- 1= Real, 2 = Varchar, 3 = int, etc.
);

Create Table TestResults
(
  idPatent int -- FK
, idTest   int -- FK
, idTestType int -- FK
, idTestResultCode int -- FK
, ResultsI real
, ResultsV varchar(100)
, Resultsb int
, Created datetime
)

したがって、基本的に、追加したい結果をテーブル「tests_1」と「tests_2」、および考えられるその他のテストに適合させることができます。

このテーブルを読み取るアプリケーションは、各テストとそのすべての値をロードできます。もちろん、アプリケーションはそれぞれのケースを処理する方法を知る必要がありますが、この構造体にはあらゆるタイプのテストを格納できます。


于 2013-08-05T21:26:44.013 に答える