请教一个外键的问题

kingstarer 2013-09-29 04:53:48
现在有三张表
a 群体用户表
b 个人用户表
c 用户订单表

三张表都有userid一列,a表保存的是群体用户的信息,b表保存的是个人用户的信息

c表是记录两种用户的订购信息,a和b是状态表,记录存进去后根据业务操作进行修改
c表是日志表,每次用户产生订购就登记一条记录

a表和b表的userid不会重复 c表的userid要么取自a表,要么取自b表

现在想为这几张表建外键关系,但是想不出怎么建合适

如果c表为子表,a和b表做父表,分别建立外键指向两个表的userid。

会出现记录插不进去的情况(因为个人用户不在集团里面,集团用户也不在个人里面)

而c表肯定是不能做为父表
...全文
365 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstarer 2014-04-01
  • 打赏
  • 举报
回复
转行 告别程序员生涯 结贴了因果
kingstarer 2013-10-20
  • 打赏
  • 举报
回复
引用 8 楼 forgetsam 的回复:
外键是符合范式的表的一个数据约束,你这表本身就是为了性能或者业务违反范式的,加什么外键。
库表单独开来看,都是符合第三范围的,有主键,没传递关系 只是确实想不出怎么加外键
kingstarer 2013-10-20
  • 打赏
  • 举报
回复
引用 9 楼 u012174761 的回复:
[quote=引用 6 楼 zhaoxiangchong 的回复:] [quote=引用 5 楼 jerrygr_ok 的回复:] 你可以再创建一个表,如d表,里面存放a、b表的id值,在c表上创建d表的外键就可以了
很是支持。刚我想用的是用check约束,限制c表的值必须在a和b表的范围内。但这需要用到子查询,这在oracle的check约束中是不成立的。[/quote] 把a,b表建个视图也不行么?[/quote] 视图上不能建外键,也不能建外键指向视图
zmn0079 2013-10-18
  • 打赏
  • 举报
回复
引用 6 楼 zhaoxiangchong 的回复:
[quote=引用 5 楼 jerrygr_ok 的回复:] 你可以再创建一个表,如d表,里面存放a、b表的id值,在c表上创建d表的外键就可以了
很是支持。刚我想用的是用check约束,限制c表的值必须在a和b表的范围内。但这需要用到子查询,这在oracle的check约束中是不成立的。[/quote] 把a,b表建个视图也不行么?
forgetsam 2013-10-18
  • 打赏
  • 举报
回复
外键是符合范式的表的一个数据约束,你这表本身就是为了性能或者业务违反范式的,加什么外键。
kingstarer 2013-10-14
  • 打赏
  • 举报
回复
引用 5 楼 jerrygr_ok 的回复:
你可以再创建一个表,如d表,里面存放a、b表的id值,在c表上创建d表的外键就可以了
在我的业务系统里面a和b都是比较大的表,数据量有上千万 这样做有点浪费 有没有其它更好的方法呢 以前做这种系统都是不建外键的,第一次被要求建
善若止水 2013-10-08
  • 打赏
  • 举报
回复
引用 5 楼 jerrygr_ok 的回复:
你可以再创建一个表,如d表,里面存放a、b表的id值,在c表上创建d表的外键就可以了
很是支持。刚我想用的是用check约束,限制c表的值必须在a和b表的范围内。但这需要用到子查询,这在oracle的check约束中是不成立的。
jerrygr_ok 2013-10-08
  • 打赏
  • 举报
回复
你可以再创建一个表,如d表,里面存放a、b表的id值,在c表上创建d表的外键就可以了
kingstarer 2013-10-08
  • 打赏
  • 举报
回复
引用 2 楼 lyliu602 的回复:
c表分别建立a、b表的外键 c.id1,c.id2这样可以吗?
不好意思,刚才没看仔细。 您的意思是c表建id1和id2两列? 这样对程序改动太大了,而且后续维护不方便,暂时不考虑
kingstarer 2013-10-08
  • 打赏
  • 举报
回复
不好意思,国庆休假忘了这张贴了 不能这样建,因为a和b表里面的记录是不一样的。 这样会导致c表任何记录都插不进去,见下面的示例

create table a(id varchar2(32) primary key);
create table b(id varchar2(32) primary key);
create table c(id varchar2(32), logtime date);

alter table c
   add constraint FK_c_a foreign key (id)
      references a(id);
      
alter table c
   add constraint FK_c_b foreign key (id)
      references b(id);
      
insert into a values ('1');
insert into b values ('10');

insert into c values ('10', sysdate);
insert into c values ('1', sysdate);
insert into c values ('100', sysdate);
出错信息

SQL> insert into c values ('10', sysdate);
 
insert into c values ('10', sysdate)
 
ORA-02291: 违反完整约束条件 (HCH.FK_C_A) - 未找到父项关键字
SQL> insert into c values ('1', sysdate);
 
insert into c values ('1', sysdate)
 
ORA-02291: 违反完整约束条件 (HCH.FK_C_B) - 未找到父项关键字
SQL> insert into c values ('100', sysdate);
 
insert into c values ('100', sysdate)
 
ORA-02291: 违反完整约束条件 (HCH.FK_C_B) - 未找到父项关键字
无敌小二傻 2013-09-29
  • 打赏
  • 举报
回复
c表分别建立a、b表的外键 c.id1,c.id2这样可以吗?
kingstarer 2013-09-29
  • 打赏
  • 举报
回复
c表如果做父表,会出现如果没有订单就不能有用户信息的情况,这不符合业务规定

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧