我已经坚持了很长一段时间,试过不同的设计,但总有一些事情发生了。我正在为艺术学校/舞蹈或健身中心设计一个数据库。
我只是想设计实体关系和信息。
假设我们有person
课程 - 由以下类型的“学生”,“监护人”,“老师”组成。每个人可能不止一种。
未成年人将有一个监护人(父母,可能有多个)来保存联系信息,处理登记等。一些成年人也可能有监护人(比如老人或残疾人),老师也可以是另一个班级的学生/服务。
我一直在打破如何设置它(尤其是联系信息)而不破坏正常形式。我的最后一次尝试在下图中。 我不知道在哪里打联系信息,整件事似乎不对。
感谢任何帮助/指导。
答案 0 :(得分:0)
我认为你在你的模型中过度抽象了。将您的不同角色实现为具体类型而不是通用,将允许您为每个角色指定唯一属性,关系和约束。
考虑下表:
我将teacher
和student
建模为person
的具体子类型。它们可以重叠,即一个人可以是两种类型。录制学生时,需要student_number
。录制教师时,会录制employee_number
。我添加这些属性只是为了表明特定于子类型的属性。
Guardian
被建模为人与人之间的多对多关系。这可以创建递归关联。根据您希望如何使用监护人,可以进一步完善关系。
我在person
添加了联系信息。这意味着学生可以从监护人处获得不同的联系信息,您可以选择在查询中使用的内容。一个限制是每个人只能有一个address
,phone
,mobile
和email
;你可以考虑支持每个的多个。
class
有一个名字和一名教师,student_class
和class
之间存在多对多关系(student
)。
要记住的一个总体限制是该模型不能解决时间问题。这些系统总是需要跟踪每学期,每学期或每年的课程,每年的学生注册等。
答案 1 :(得分:0)
这很困难的原因是关系数据库模型并不能完全支持继承。它当然不支持多重继承。
你可以在这个主题上找到关于SO的很多问题; this one是一个很好的起点。
@ reaanb的回答是"每个子类一个表"的一个例子。它是一个很好的模型,并为您提供了一个清晰的模式 - 但这意味着您的应用程序必须进行逻辑映射" person"到所有可能的子类,然后获取数据属性。
简而言之 - 没有干净的解决方案。尽可能保持一致,尽可能保持清洁,但不要期望完美。