2010-08-31 58 views
2

我的情況是我有四個表病人,收據,診所和實驗室。SQL Server 2005中的關係?

CREATE DATABASE TestHosp 

GO 
USE TestHosp 
GO 

有關病人信息

CREATE TABLE Patient 
(Id INT Not NULL PRIMARY KEY IDENTITY(1,1), 
FirestName VARCHAR(12) NOT NULL, 
LastName VARCHAR(12) NOT NULL, 
Birthday DATETIME) 

CREATE TABLE Clinic 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
ClinicName VARCHAR(20) UNIQUE, 
Price DECIMAL(8,2)) 

CREATE TABLE Laboratory 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
LaboratoryName VARCHAR(20) UNIQUE, 
Price DECIMAL (8,2)) 

注意,收到包含收據號碼,一個收據屬於一個實驗室,一個收據屬於一個診所,我想離不開建立兩個列FK_Laboratory_ID和FK_Clinic_ID關係 和一個號碼爲所有收據以任何方式做到這一點。

CREATE TABLE Receipt 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
PatientID INT NOT NULL 
CONSTRAINT [FK_Patient_ID] FOREIGN KEY (PatientID) REFERENCES Patient(Id), 
DATE DATETIME, 
Paid DECIMAL(8,2)) 
+0

您可以編輯您的問題,使其更具可讀性嗎? – Rahul 2010-08-31 06:40:32

+0

價格在診所和實驗室沒有意義。最終會出現multipel價格,這是真實的數據,不應該存儲在診所或實驗室中。 並修復您的名字字段中的錯字或它會惹惱你多年。 – HLGEM 2010-08-31 13:58:04

+0

OH和ID是ID字段的可怕名稱。當你進入複雜的連接並報告你將使用這種類型的數據時,使用起來會很痛苦(當你不需要使用適當的命名約定時,你將會在整個過程中進行混淆。ID應該命名爲tablenameID,並且FK應儘可能與PK具有相同的名稱。 – HLGEM 2010-08-31 14:00:25

回答

1

您的數據庫設計看起來不太好看。如果你能詳細闡述設計需求,你的模式可以得到很好的改進。

要回答你的問題,

患者(標識,名字,姓氏,生日)

診所(標識,名稱,價格)

實驗室(標識,名稱,Price)

將您的收據表分成

Clinic_Receipt(標識PatientIdClinicId

Laboratory_Receipt(標識PatientIdLaboratoryId

 

    //Create Unique Ids for Receipts 

    public int CreatId() 
    { 
     TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); 

     return (int) t.TotalSeconds; 
    } 
 
+0

@Rahul我知道這個問題,但我想要一個收據號碼 – 2010-08-31 06:53:02

+0

@請說明一個收據號碼是什麼意思? – Rahul 2010-08-31 07:01:01

+0

@Rahul如果我創建兩個表,我有兩個收據ID,所有收據的唯一編號。 – 2010-08-31 07:15:29

1

據我瞭解你的模型,它是一對多的。一張收據屬於一個實驗室或診所,但診所可以有更多的收據。所以它可以與患者外鍵相似...

CREATE TABLE Receipt 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
PatientID INT NOT NULL 
CONSTRAINT [FK_Patient_ID] FOREIGN KEY (PatientID) REFERENCES Patient(Id), 
ClinicID INT NOT NULL 
CONSTRAINT [FK_Clinic_ID] FOREIGN KEY (ClinicID) REFERENCES Clinic(Id), 
LaboratoryID INT NOT NULL 
CONSTRAINT [FK_Laboratory_ID] FOREIGN KEY (LaboratoryID) REFERENCES Laboratory(Id), 
DATE DATETIME, 
Paid DECIMAL(8,2)) 
+0

表格未標準化。收據可以屬於診所或實驗室。因此,同一個表中的診所和實驗室將導致無效值。 糾正我,如果我錯了! – Rahul 2010-08-31 06:51:17

+0

空值沒有錯 – HLGEM 2010-08-31 13:55:47

0

這裏是另一種選擇(我做了」不要編輯我以前的答案,以便投票可以分配給你更好的解決方案)。

您可以按如下方式創建泛化。但是,您將需要更多JOIN。將有行,然後是1 Receipt_Laboratory或1 Receipt_Clinic,對LaboratoryClinic的相應參考。

CREATE TABLE Receipt 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
PatientID INT NOT NULL 
CONSTRAINT [FK_Patient_ID] FOREIGN KEY (PatientID) REFERENCES Patient(Id), 
DATE DATETIME, 
Paid DECIMAL(8,2)) 

CREATE TABLE Receipt_Laboratory 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
LaboratoryID INT NOT NULL 
CONSTRAINT [FK_Laboratory_ID] FOREIGN KEY (LaboratoryID) REFERENCES Laboratory(Id), 
ReceiptID INT NOT NULL 
CONSTRAINT [FK_Receipt_ID] FOREIGN KEY (ReceiptID) REFERENCES Receipt(Id) 
) 

CREATE TABLE Receipt_Clinic 
(Id INT NOT NULL PRIMARY KEY IDENTITY(1,1), 
ClinicID INT NOT NULL 
CONSTRAINT [FK_Clinic_ID] FOREIGN KEY (ClinicID) REFERENCES Clinic(Id), 
ReceiptID INT NOT NULL 
CONSTRAINT [FK_Receipt_ID] FOREIGN KEY (ReceiptID) REFERENCES Receipt(Id))