0

我有以下内容:
1.我存储患者数据的“患者”表。
2. 一个“测试”表,我在其中存储对每个患者进行的测试数据。

现在问题来了,因为我有两种类型的测试“tests_1”“tests_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的患者,我有 1 个类型为tests_1的测试和 2 个类型为tests_2的测试。

这是一个小提琴

4

3 回答 3

3

添加一个表testtype (id_test,name_test)并将其用作表中id_type_test字段的 FK tests。不要为test_1和创建单独的表test_2

于 2013-08-05T21:02:05.083 回答
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 回答
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    | ...

测试类型:

 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,我会将请求和结果组合到一个表中,添加派生列,例如,并从等中REQUEST_TO_RESULT_MINS创建单个维度。RESULT_TYPETEST_TYPE

于 2013-08-05T21:52:05.440 回答