2015-03-03 176 views
1

我在数据库设计中很安静,我正在尝试一个测试用例来跟踪学生。 在下图中,学生可以在学校或俱乐部。为此,我在LocationId上创建了一个作为全球学生身份的地方。 enter image description here规范化数据库表

但问题是我根据TypeId来确定其俱乐部或学校。 所以在我的数据访问查询中,我必须提供案例。伪代码是:

if TypeId == 1 
search in club for the LocationId and get the clubId. 
else if TypeId == 2 
search in school for the LocationId and get the schoolId. 

我该如何摆脱这些情况,仍然保持规范化的规则。

非常感谢您的阅读。欢迎任何评论。 美好的一天!

+1

不知道你是否需要'LOC_CONTAINER'表。你可以用'CLUB'和'SCHOOL'表将'left join'加入,只使用你需要的字段。 – keltar 2015-03-03 10:27:21

+0

你的意思是完全摆脱LocationId?可否请您在解决方案中写下查询。 – ThomasBecker 2015-03-03 10:32:51

+1

如何将您的SCHOOL和CLUB表合并在一起,并添加额外的列作为TYPE来区分它们,在这种情况下,您也可以删除LOC_CONTAINER。 – 2015-03-03 10:33:39

回答

0

这似乎是表继承的情况,并有多种方法来解决它。您的解决方案LOC_CONTAINER不起作用(因为您已经注意到),因为它需要外部代码来执行检查。

看看关于继承的this comprehensive answer。例如,可以将SCHOOLCLUB表统一为一个表,称为PLACE,或者在表STUDENT中同时包含SCHOOLCLUB列,其中一个表必须为NULL

+0

谢谢,但我不能合并学校和俱乐部,因为后来它会有所不同,加入是其他同事提到的选项,但表之间的关系,然后丢失,这可能是客户端使用dataservice所需的。 – ThomasBecker 2015-03-03 11:02:14

+0

好的,看看我链接到的答案中提供的类表继承情况。在这种情况下,学校和俱乐部的主键都会引用公共表格,与“LOC_CONTAINER”不同。 – 2015-03-03 11:21:56

+0

再次感谢我查看类表继承的ur链接,它非常接近解决我的问题,只有问题我有例如。 X有policyId如何可能知道它是否有“property_address”或“vehicle_reg_no”,一种方法是在所有子表中搜索policy_id,但我猜它是不好的方法。在我的情况下,它通过了解位置来反映它是如何知道它是否在学校或俱乐部。我希望你得到点。 – ThomasBecker 2015-03-03 13:20:21