我正在解决数据问题,我需要进行建模。我会尽力概述表格和关系
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
现在这里是棘手的部分..一个团体可以由用户或医院“拥有”,但这些页面不一定与该用户/医院有关。此外,还有另一种类型的实体(公司)可以“拥有”该组
在显示群组时,我需要知道群组的类型(用户/医院/公司),并能够获得正确的附属数据(姓名,地址等)
我在如何将群组链接到其各自所有者时留下了空白,知道其各自的所有者可能不同。
答案 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
表格中。Person
和Hospital
应该只包含子类型的特定字段。Hospital
不同,只需将其添加为另一个子类型。Hospital
和公司具有相同的列,请将Hospital
重命名为更通用的Organization
PartyType
是鉴别人{P,H}