数据库模式建议

时间:2012-07-13 13:13:58

标签: database database-design schema

我正在解决数据问题,我需要进行建模。我会尽力概述表格和关系

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 :(得分:0)

你必须使用某种形式的鉴别器。就像添加一个带有“owner_type”的列一样,您可以使用enum,vchar或只是一个int来表示列所代表的所有者类型。

答案 1 :(得分:0)

Here是一个很好的教程,介绍如何在数据库中建模继承,同时保持合理的正规形式和参照完整性。

为您提供简化版本:创建另一个表owners,并让它保留一组最小的属性(用户和医院的共同点,可能是全名,地址,当然还有{{1} }})。用户和医院将具有各自的id列,这些列同时是其主键,也是引用id的外键。为用户提供医院没有的属性,反之亦然。现在每个医院都有两个容易连接的行,一个来自users.id,另一个来自owners

这允许您从hospitals引用users.id

(还有一个更简单的替代方案,您只需为用户和医院创建一个表,并将NULL放在不适用于特定行的所有列中,但很快就会变得难以操作。)

答案 2 :(得分:0)

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

Groups(GroupID,....)

GroupPages(GroupID, PageID)

Pages(PageID, ...)

将是经典的方式。

@Robert提到的鉴别器思想也可以,但是你失去了参照完整性,所以你需要更多的代码而不是更多的表。

答案 3 :(得分:0)

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

enter image description here