2010-08-31 92 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))