设计:每位患者多次就诊

时间:2012-06-18 21:16:33

标签: sql sql-server database sql-server-2008 database-design

enter image description here

以上是我的架构。您在tblPatientVisits中看不到的是来自tblPatient的外键,即patientid

tblPatient包含数据集中每位患者的不同副本及其性别。 tblPatientVists包含他们的人口统计信息,他们在入院时居住的地方以及他们去过的医院。我选择将这些信息放入一个单独的表中,因为它会在整个数据中发生变化(一个人可以从一次访问转移到另一次访问并转到另一家医院)。

在添加tblPatientVisits之前,我的查询没有任何奇怪的数字。在tblClaims中只有不到一百万的索赔,但是当我添加tblPatientVisits以便我可以查看该人的来源时,它会返回超过百万。我认为这是因为在tblPatientVisits中,同一名患者ID出现不止一次(由于他们有不同的入院/出院率)。

对于我的生活,我无法看到这是不正确的设计,除了使用count(tblPatientVisits.PatientID=1然后unioncount(tblPatientVisits.patientid)>1进行一次查询之外,我也不知道如何纠正它。

对此类设计有任何了解,或者我如何更优雅地找到一种方法从tblClaims获取claimType,以便将声明ID与PatientID相关联,从而获得正确的行数?

编辑:我遇到的最大问题是,如果我在tblPatient表中包含admissionDate,dischargeDatepatientState,我就不能将patientID用作主键。

应注意tblClaims NOT必须tblPatientVisits.admissionDate, tblPatientVisits.dischargeDateSELECT tblclaims.id, tblClaims.claimType FROM tblClaims INNER JOIN tblPatientClaims ON tblClaims.id = tblPatientClaims.id INNER JOIN tblPatient ON tblPatientClaims.patientid = tblPatient.patientID INNER JOIN tblPatientVisits ON tblPatient.patientID = tblPatientVisits.patientID 相关。

编辑:示例查询以显示添加tblPatientVisits时,返回的行数多于声明数

SELECT     tblClaims.id, tblPatient.patientID
FROM         tblClaims INNER JOIN
                      tblPatientClaims ON tblClaims.id = tblPatientClaims.id INNER JOIN
                      tblPatient ON tblPatientClaims.patientid = tblPatient.patientID

返回了超过一百万个查询行

{{1}}

返回的查询行少于一百万

sample rows

more than one million rows

2 个答案:

答案 0 :(得分:1)

我认为这是为了更好的设计而哭泣。我真的认为访问应该与声明相关联,并且声明只能与单个患者相关联,所以我认为设计应该是(并且消除了不必要的tbl前缀,这只是杂乱无章) :

CREATE TABLE dbo.Patients
(
  PatientID INT PRIMARY KEY
  -- , ... other columns ...
);

CREATE TABLE dbo.Claims
(
  ClaimID INT PRIMARY KEY,
  PatientID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Patients(PatientID)
  -- , ... other columns ...
);

CREATE TABLE dbo.PatientVisits
(
  PatientID INT NOT NULL FOREIGN KEY
    REFERENCES dbo.Patients(PatientID),
  ClaimID INT NULL FOREIGN KEY 
    REFERENCES dbo.Claims(ClaimID),
  VisitDate DATE
  , -- ... other columns ...
  , PRIMARY KEY (PatientID, ClaimID, VisitDate) -- not convinced on this one
);

这里有一些冗余信息,但是从您的模型中不清楚患者是否可以访问与特定声明相关联,或者您是否知道访问属于一个特定的声明(考虑到你所追求的查询类型,这似乎是至关重要的信息)。

在任何情况下,根据您当前的模型,您可能尝试的一个查询是:

SELECT c.id, c.claimType
FROM dbo.tblClaims AS c
INNER JOIN dbo.tblPatientClaims AS pc
ON c.id = pc.id
INNER JOIN dbo.tblPatient AS p
ON pc.patientid = p.patientID
-- where exists tells SQL server you don't care how many 
-- visits took place, as long as there was at least one:
WHERE EXISTS (SELECT 1 FROM dbo.tblPatientVisits AS pv
  WHERE pv.patientID = p.patientID);

对于每个患者/索赔组合,这仍然会返回一行,但每个患者/访问组合应该只返回一行。再次,它真的感觉设计不在这里。您还应该养成使用表别名的习惯 - 它们使您的查询更容易阅读,特别是如果您坚持使用凌乱的tbl前缀。在创建和引用对象时,您还应始终使用dbo(或您使用的任何模式)前缀。

答案 1 :(得分:0)

我不确定我是否理解索赔的概念,但我怀疑您想要删除索赔与患者之间的链接表,而是将患者访问与索赔之间的关联联系起来。

这对你有用吗?