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

4 回答 4

0

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

于 2012-07-13T13:23:11.750 回答
0
HospitalGroups(HospitalID, GroupID)
UserGroups(UserID, GroupID)
CompanyGroups(CompanyID, GroupID)

Groups(GroupID,....)

GroupPages(GroupID, PageID)

Pages(PageID, ...)

将是经典的方式。

@Robert 提到的鉴别器想法也可以,但是您会失去参照完整性,因此您需要更多代码而不是更多表。

于 2012-07-13T13:56:44.860 回答
0

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

精简版:创建另一个表,owners,并让它保留一组最小的属性(用户和医院的共同点,可能是全名、地址,当然还有id)。用户和医院将拥有各自的id列,这些列同时是他们的主键和外键引用users.id。给用户医院没有的属性,反之亦然。现在,每家医院都由两个容易连接的行表示,一个来自owners,一个来自hospitals

这允许您users.idgroups.owner_id.

(还有一种更简单的替代方法,您只需为用户和医院创建一个表,并将 NULL 放入不适用于特定行的所有列,但这很快就会变得笨拙。)

于 2012-07-13T13:45:45.937 回答
0
  • Party是个人或组织的总称。
  • 将所有常用字段(电话号码、地址..)保留在Party表中。
  • Person并且Hospital应该只有子类型的特定字段。
  • 如果公司有不同的列集,Hospital只需将其添加为另一个子类型。
  • 如果Hospital公司有相同的列,重命名Hospital为更通用Organization
  • PartyType是判别器{P,H}

在此处输入图像描述

于 2012-07-13T16:26:46.493 回答