关于子类的引用,向前辈取经了!
有a,b,c来个实体,为了实际c的一个字段引用b或者是引用a的主键,在b与c上抽象了一个超类d,就像在teacher与student上抽象出超类person一样,大家觉得这种方法行不行,或者有没有什么好办法。
如果行,那d的一列要不在c中,要不在b中,这样的设计有没有问题?
b与c基本没有共同的地方,而且b支持修改,c不支持,所以不好抽象在一个表中。
客户的需求很变态,实在没办法,大家帮忙啊。
问题点数:100、回复次数:5Top
1 楼wolve(祝你生活愉快)回复于 2003-08-04 17:16:22 得分 0
upTop
2 楼wolve(祝你生活愉快)回复于 2003-08-04 17:54:38 得分 0
救命啊Top
3 楼txlicenhe(马可)回复于 2003-08-04 18:08:01 得分 10
“客户的需求很变态”. 同情Top
4 楼pengdali()回复于 2003-08-04 19:57:17 得分 90
1、这种需求是常见的
2、不能通过数据库定义来做这个关系,只能靠触发器
3、你也可以定义个个视图(你的超类person),通过触发器来约束这三个表间的关系如:
实现:
create view 视图 as select id from a union all select id from b
go
create trigger t_c on c for insert as if exists(select 1 from inserted where id not in (select id from 视图)) rollback tran
go
create trigger t_a on a for delete,update as if exists(select 1 from deleted where id in (select id from c)) rollback tran
go
create trigger t_b on b for delete,update as if exists(select 1 from deleted where id in (select id from c)) rollback tran
goTop
5 楼wolve(祝你生活愉快)回复于 2003-08-05 10:01:43 得分 0
谢谢pengdali(大力 V2.0)!
为了提高可移植性,trigger与view,storeprocedure都不支持.
而且好像抽象超类这种方法是很常见的,不知大家是怎么处理的。例子,客户不管是学生还是老师,只管通过一个姓名来查询person的个人资料。这时又应该怎么处理呢Top




