病人表数据库设计

时间:2014-01-31 14:05:35

标签: oracle database-design rdbms

我有两张桌子患者和医生:

CREATE TABLE  "PATIENT" (   
    "PATIENT_ID" NUMBER NOT NULL ENABLE,
    "PATIENT_NAME" VARCHAR2(40),
    "AGE" NUMBER,
    "SEX" VARCHAR2(12),
    "PLACE" VARCHAR2(40),
    "PHONE_NUMBER" NUMBER,
    "DOCTOR_ID" NUMBER,
    "REGISTRATION_DATE" DATE,
    CONSTRAINT "PATIENT_PK" PRIMARY KEY ("PATIENT_ID") ENABLE,
    CONSTRAINT "DOCTOR_ID" FOREIGN KEY ("DOCTOR_ID")
    REFERENCES  "DOCTOR" ("DOCTOR_ID") ENABLE

CREATE TABLE  "DOCTOR" (    
    "DOCTOR_ID" NUMBER NOT NULL ENABLE,
    "DOCTOR_NAME" VARCHAR2(40) NOT NULL ENABLE,
    "PLACE" VARCHAR2(40),
    "PHONE_NUMBER" NUMBER,
    CONSTRAINT "DOCTOR_PK" PRIMARY KEY ("DOCTOR_ID") ENABLE
)

患者可以多次去看医生(也是不同的医生),所以我必须在一把钥匙上插入值。此处PATIENT_ID是主键,因此无法接受该键上的多个值。

如何识别记录患者所有医生就诊的唯一记录?我如何创建符合我要求的患者表?

3 个答案:

答案 0 :(得分:1)

创建一个用于记录访问的附加表:

CREATE TABLE DOCTOR_VISITS (
DOCTOR_ID int references DOCTOR(DOCTOR_ID)
PATIENT_ID int references PATIENT(PATIENT_ID)
VISIT_DATE DATE,
)

这将允许您跟踪访问任何医生的任何患者并记录访问日期。

答案 1 :(得分:1)

如果医生可以多次访问患者,请创建一个额外的表格,如

CREATE TABLE DOCTOR_VISITS (
DOCTOR_ID int references DOCTOR(DOCTOR_ID)
PATIENT_ID int references PATIENT(PATIENT_ID)
VISIT_DATE date
CONSTRAINT visit_pk PRIMARY KEY (DOCTOR_ID,PATIENT_ID,VISIT_DATE )
)

这将允许每天1次访问。如果您需要更多,我会在该日期字段中添加时间。

答案 2 :(得分:1)

我想以Tommo1977的答案为基础。 我绝对同意交叉表是正确的方法。 但是,请记住复合主键(例如[DOCTOR_ID,PATIENT_ID,VISIT_DATE(带或不带时间组件))通常通过许多其他表(作为外键)复制。 因此,我提出以下建议:

CREATE TABLE DOCTOR_VISITS (
VISIT_ID int
DOCTOR_ID int references DOCTOR(DOCTOR_ID)
PATIENT_ID int references PATIENT(PATIENT_ID)
VISIT_DATE date
CONSTRAINT visit_pk PRIMARY KEY (VISIT_ID )
)