2012-07-13 160 views
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 

现在这里是棘手的部分..一组可以由用户或医院“拥有”,但这些页面不一定与该用户/医院有关。此外,还有另一类型的可以“拥有”该组的公司(公司)

当显示该组,我需要知道什么类型(用户/医院/公司)该组是并能够得到正确的相关数据(姓名,地址等)

林借鉴如何组链接到其各自所有者,明知其各自拥有者可以是不同的一个空白。

+0

什么是页? – 2012-07-13 16:11:58

回答

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

enter image description here

+0

这和我登陆的地方非常相似 - 尤其是。将医院/医院等命名为更通用的组织术语 – cgmckeever 2012-07-30 13:26:31

0

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

0

Here是如何同时保持合理的正常形态和参照完整性数据库中的继承模型一个很好的教程。

压缩版本为您创建另一张表owners,并让它保留一小部分属性(用户和医院有共同点,可能是全名,地址,当然还有一个id)。用户和医院将有各自的id列,它们将同时作为它们的主键以及引用users.id的外键。为用户提供医院不具备的属性,反之亦然。现在,每个医院由两个易于连接的行代表,一个来自owners,另一个来自hospitals

这可以让你从groups.owner_id参考users.id

(还有,你为用户和医院只创建一个表,把空值到不适用于特定行中的所有列一个简单的替代,但很快变得笨重。)

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

Groups(GroupID,....) 

GroupPages(GroupID, PageID) 

Pages(PageID, ...) 

将是经典的方式。

通过@Robert提到的鉴别理念也将工作,但你失去了参照完整性,所以你需要更多的代码,而不是更多的表。

+0

与多组连接表。当从组中选择每个组时,如何知道附加数据是否在医院/用户/公司表中? – cgmckeever 2012-07-13 14:09:02

+0

关于什么的其他数据?如果是关于页面或组,那么它不应该在这些表中。 – 2012-07-13 18:05:30