2016-06-09 45 views
0

我已經創建了一個數據庫模型,其中有一個可以容納醫生和patiënt的用戶實體。這些將由「標誌」屬性分開。下一個實體是一個約會表,用於保存約會。我面臨的問題是我有多對多的關係。爲了解決這個問題,我想添加另一個表格,但我不知道我應該怎樣命名這個以及它應該包含哪些信息。數據庫moddeling |用戶M:M約會

Image of the database design

回答

1

你對信息很吝嗇,所以我會做出一些假設。即使假設在具體情況上是錯誤的,這個答案仍應該是有效的。

您有一個表,用戶,包含醫生和患者與標誌字段區分它們。假設:該標誌包含醫生的'D'或患者的'P'。

建議:在用戶表上爲組合ID和標誌創建唯一約束/索引。這將大大緩解以下數據完整性問題:

  • 可以在患者和醫生之間進行預約,而不是另一個患者。另一方面,醫生可能需要與其他醫生預約作爲他們的患者(這是另一種假設)。
  • 但醫生不應該能夠與自己預約(以防止醫生愚蠢地爲病人)。

的(觸發,存儲過程和/或應用程序)代碼,以檢測並防止這些問題可以得到一個有點複雜並會是疼痛,以保持作爲底層數據結構隨時間演變。這是一個解決方案。

create table Appointments(
    DrID  int not null, 
    DrFlag char(1), 
    PatientID int not null, 
    StartTime date not null, 
    EndTime date, 
    constraint ApptDrOnly check(DrFlag = 'D'), 
    constraint ApptDrSelf check(DrID <> PatientID), 
    constraint PK_ApptUserDoctor foreign key(DrID, DrFlag) 
     references Users(ID, Flag), 
    constraint PK_ApptUserPatient foreign key(PatientID) 
     references Users(ID) 
); 

由於上的用戶表的ID和標誌字段的新的唯一約束的,它們可以被用作使用在交叉表DrID和DrFlag字段由FK的參考。 DrFlag只能包含'D'的約束限制了FK的目標僅限於醫生。 PatientID PK是指用戶表的PK,因此可以指醫生或患者。 DrID和PatientID不能相同的檢查會阻止醫生預約自己。

在那裏,醫生和患者(或其他醫生)之間的約會與所有的數據完整性問題處理,沒有數據庫或應用程序代碼。

如果假設錯誤,請相應地進行更改。例如,如果只能在定義爲醫生的用戶與定義爲患者的另一用戶之間進行預約,則可以移除支票(DrID <> PatientID),並且具有支票(PatientFlag ='P')的PatientFlag字段可以被移除被添加。

0

你會創建一個「userappointment」表在某時刻將用戶鏈接到約會,一個。

+0

從兩個表到1個新表的1:m關係。我明白了。但是,我怎麼稱呼那個?以及除了id和外鍵以外,我還要添加什麼? –

+0

Gertjan,我通常用這兩個引用表的名稱命名這些表,即描述表用戶和約會之間的關係的表稱爲userappointment。所以你說的是你可以在一次預約中有多個病人和多名醫生。雖然這不是我去看醫生時通常會看到的情況,但您仍然可以在預約表中找到所有適合特定領域的字段。userappointment表將包含特定於該人的角色的任何內容,例如,一名醫生可以成爲主要醫生。或者只有鑰匙,就像你說的。 – cdonner