数据库架构推荐

3

我在处理一个需要建模的数据问题上遇到了困难。我将尽力概述表格和关系。

users (basic user information name/etc)
users.id

hospitals (basic information about hospital name/etc)
hospitals.id

pages
pages.id
user_id (page can be affiliated with a user)
hospital_id (page can be affiliated with a hospital)

这里是新数据开始的地方,但我遇到了问题。

groups (name of a group of pages)
groups.id

groups_pages (linking table)
group_id
page_id

现在是棘手的部分...一个组可以被用户或医院“拥有”,但这些页面不一定与该用户/医院相关联...此外,还有另一种实体(公司)可以“拥有”该组。
在显示组时,我需要知道该组属于哪种类型(用户/医院/公司),并能够获取正确的关联数据(名称、地址等)。
我不知道如何将组链接到其相应的所有者,尽管其相应的所有者可能不同。
4个回答

0
HospitalGroups(HospitalID, GroupID)
UserGroups(UserID, GroupID)
CompanyGroups(CompanyID, GroupID)

Groups(GroupID,....)

GroupPages(GroupID, PageID)

Pages(PageID, ...)

这将是经典的方式。

@Robert提到的鉴别器想法也可以工作,但您会失去引用完整性,因此您需要编写更多代码而不是更多表格。


使用多个组链接表时,如果从组中选择所有内容,如何确定医院/用户/或公司表中是否有附加数据? - cgmckeever
额外的数据是关于什么的?如果是关于页面或群组的,那么它不应该在这些表中。 - Tony Hopkinson

0

你需要使用某种形式的鉴别器。比如添加一个名为“owner_type”的列,你可以使用枚举、vchar或者整数来表示该列所代表的所有者类型。


0

这里有一个很好的教程,介绍如何在数据库中建模继承关系,同时保持合理的规范形式和引用完整性。

简化版:创建另一个表owners,让它保留一组最小属性(用户和医院共同拥有的属性,例如全名、地址,当然还有一个id)。用户和医院将分别拥有自己的id列,这些列将同时作为它们的主键和外键,引用users.id。给用户和医院分别添加彼此所没有的属性。现在每个医院由两个容易连接的行表示,一个来自owners,一个来自hospitals

这样就可以从groups.owner_id引用users.id了。

(还有一个更简单的替代方案,即创建一个仅包含用户和医院的表,并将不适用于特定行的所有列置为空值,但这很快会变得难以处理。)


0
  • Party 是指个人或组织的通用术语。
  • Party 表中保留所有常见字段(电话号码、地址等)。
  • PersonHospital 应该只有特定的子类型字段。
  • 如果公司Hospital具有不同的列集,请将其添加为另一种子类型。
  • 如果Hospital公司具有相同的列,请将Hospital重命名为更通用的Organization
  • PartyType是鉴别器{P,H}

enter image description here


这与我最终落脚的地方非常相似 - 特别是将医院等命名为更通用的组织术语。 - cgmckeever

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接