Измените структуру таблицы, не нарушая первичный ключ и ограничения уникальности

Здесь — это логическая модель, которая у меня есть.

Ниже приведены структуры таблиц и их ограничения.

Доктор

CREATE TABLE doctor (
    doctor_id      NUMBER(4) NOT NULL,
    doctor_title   VARCHAR2(2) NOT NULL,
    doctor_fname   VARCHAR2(50),
    doctor_lname   VARCHAR2(50),
    doctor_phone   CHAR(10) NOT NULL
);
ALTER TABLE doctor ADD CONSTRAINT doctor_pk PRIMARY KEY ( doctor_id );

Процедура

CREATE TABLE procedure (
    proc_code          NUMBER(5) NOT NULL,
    proc_name          VARCHAR2(100) NOT NULL,
    proc_description   VARCHAR2(300) NOT NULL,
    proc_time          NUMBER(3) NOT NULL,
    proc_std_cost      NUMBER(7, 2) NOT NULL
);

ALTER TABLE procedure ADD CONSTRAINT procedure_pk PRIMARY KEY ( proc_code );

ALTER TABLE procedure ADD CONSTRAINT proc_name_unq UNIQUE ( proc_name );

Допуск

CREATE TABLE admission (
    adm_no          NUMBER(6) NOT NULL,
    adm_date_time   DATE NOT NULL,
    adm_discharge   DATE,
    patient_id      NUMBER(6) NOT NULL,
    doctor_id       NUMBER(4) NOT NULL
);

ALTER TABLE admission ADD CONSTRAINT admission_pk PRIMARY KEY ( adm_no );    --surrogate key

ALTER TABLE admission ADD CONSTRAINT admission_nk UNIQUE ( patient_id,
                                                           adm_date_time );

Процедура приема

CREATE TABLE adm_prc (
    adprc_no           NUMBER(7) NOT NULL,
    adprc_date_time    DATE NOT NULL,
    adprc_pat_cost     NUMBER(7, 2) NOT NULL,
    adprc_items_cost   NUMBER(6, 2) NOT NULL,
    adm_no             NUMBER(6) NOT NULL,
    proc_code          NUMBER(5) NOT NULL,
    request_dr_id      NUMBER(4) NOT NULL,
    perform_dr_id      NUMBER(4)
);
ALTER TABLE adm_prc ADD CONSTRAINT adm_prc_pk PRIMARY KEY ( adprc_no );    --surrogate key
ALTER TABLE adm_prc ADD CONSTRAINT adm_prc_nk UNIQUE ( adprc_date_time,
                                                       adm_no );
ALTER TABLE adm_prc
    ADD CONSTRAINT admission_admprc FOREIGN KEY ( adm_no )
        REFERENCES admission ( adm_no );
ALTER TABLE adm_prc
    ADD CONSTRAINT doctor_performadmprc FOREIGN KEY ( perform_dr_id )
        REFERENCES doctor ( doctor_id );
ALTER TABLE adm_prc
    ADD CONSTRAINT doctor_requestadmprc FOREIGN KEY ( request_dr_id )
        REFERENCES doctor ( doctor_id );

Обработка товара

CREATE TABLE item_treatment (
    adprc_no             NUMBER(7) NOT NULL,
    item_code            CHAR(5) NOT NULL,
    it_qty_used          NUMBER(2) NOT NULL,
    it_item_total_cost   NUMBER(8, 2) NOT NULL
);

ALTER TABLE item_treatment
    ADD CONSTRAINT item_treatment_pk PRIMARY KEY ( adprc_no,item_code);
ALTER TABLE item_treatment
    ADD CONSTRAINT admprc_itemtreatment FOREIGN KEY ( adprc_no )
        REFERENCES adm_prc ( adprc_no );
ALTER TABLE item_treatment
    ADD CONSTRAINT admprc_itemtreatment FOREIGN KEY ( adprc_no )
        REFERENCES adm_prc ( adprc_no );
ALTER TABLE item_treatment
    ADD CONSTRAINT item_itemtreatment FOREIGN KEY ( item_code )
        REFERENCES item ( item_code );

В вымышленной больнице каждый раз, когда завершается процедура госпитализации пациента, ведущий врач, проводивший процедуру, записывается под perform_dr_id в adm_prc таблице. Даже если процедуру выполняет бригада врачей, записывается только ведущий врач.

Теперь больница хочет зарегистрировать всех врачей, участвовавших в процедуре госпитализации, включая вспомогательного врача (врача-ассистента).

Я изменил таблицу adm_prc, чтобы включить вспомогательных врачей.

ALTER TABLE ADM_PRC ADD ANCILLARY_DR_ID NUMBER(4);
ALTER TABLE ADM_PRC
    ADD CONSTRAINT DOCTOR_PERFORM_ANCILLARY FOREIGN KEY ( ANCILLARY_DR_ID )
        REFERENCES DOCTOR ( DOCTOR_ID );

Мне нужно изменить структуру базы данных таким образом, чтобы было несколько записей для одной и той же процедуры приема, так как может быть много врачей, помогающих в одной процедуре приема. Например, я должен иметь возможность вставить следующие записи в таблицу adm_prc

adprc_no  adprc_date_time  adprc_pat_cost  adprc_items_cost  adm_no  proc_code 
 request_dr_id  perform_dr_id  ancillary_dr_id
-----------------------------------------------------------------------------------------------------------------------------
1         14/03/2019       100             100               1234    1234         
 10             10             12
1         14/03/2019       100             100               1234    1234         
 10             10             13

Однако это нарушает ограничение первичного ключа adm_prc_pk

Я застрял на этом этапе и не могу двигаться дальше. Был бы признателен, если бы кто-то мог указать мне в правильном направлении.

Поскольку нет соответствия n:1 между госпитализацией и врачами-ассистентами, вы не должны добавлять столбец к госпитализациям, а должны создать новую подробную таблицу (имеется в виду fk для госпитализаций), где вы можете сохранить несколько записей для каждого приема (по одной для каждого ассистента). доктор).

Radagast81 28.05.2019 14:51

Спасибо Radagast81 за предложение. В конце концов, мне пришлось создать новую таблицу. Как-то не видел. Очень признателен

InfiniteMonkey13 28.05.2019 15:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
2
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам следует создать новую вспомогательную таблицу (скажем, ADM_PRC_DR_DTLS) для хранения adprc_no и соответствующих деталей dr_id. adprc_no из ADM_PRC_DR_DTLS будет ссылаться на adprc_no ADM_PRC как на внешний ключ.

Да, это сработало. Создав новую таблицу ADM_PRC_DR_DTLS с adprc_no ADM_PRC в качестве внешнего ключа и doctor_id от доктора в качестве внешнего ключа. Я сделал оба столбца первичным ключом, и теперь для одного и того же adprc_no у меня может быть много вспомогательных врачей. Спасибо!

InfiniteMonkey13 28.05.2019 15:21

Другие вопросы по теме